1.编制一个子程序把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如 下3种参数传递方法,并用一个主程序验证它。 (1)采用AX寄存器传递这个16位二进制数 (2)采用wordTEMP变量传递这个16位二进制数 (3)采用堆栈方法传递这个16位二进制数
时间: 2024-01-24 08:04:23 浏览: 104
下面是使用汇编语言编写的程序,实现将16位二进制数转换成十六进制并在屏幕上显示出来,分别使用AX寄存器、wordTEMP变量、堆栈方法作为参数传递。
```
;-------------------------------------------------------------
; 汇编语言程序,将16位二进制数转换为十六进制并在屏幕上显示
; 参数传递方法:AX寄存器、wordTEMP变量、堆栈方法
;-------------------------------------------------------------
.MODEL SMALL
.STACK 100H
.DATA
wTemp WORD ?
strHex DB 6 DUP ('$')
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 测试使用AX寄存器作为参数传递的情况
MOV AX, 0B0AH ; 二进制数为0000101100001010B
CALL BIN2HEX_AX
; 测试使用wordTEMP变量作为参数传递的情况
MOV wTemp, 0F0FH ; 二进制数为0000111100001111B
CALL BIN2HEX_TEMP
; 测试使用堆栈方法作为参数传递的情况
PUSH 0ABCDH ; 二进制数为1010101111001101B
CALL BIN2HEX_STACK
MOV AH, 4CH
INT 21H
MAIN ENDP
;-------------------------------------------------------------
; 子程序,将16位二进制数转换为十六进制并在屏幕上显示,参数为AX寄存器
;-------------------------------------------------------------
BIN2HEX_AX PROC
; AX中存放16位二进制数
MOV CX, 4 ; 循环4次,每次转换4位
MOV SI, 0 ; 字符串下标
BIN2HEX_LOOP:
SHL AX, 4 ; AX左移4位,高4位清零
MOV BL, AH ; BL存放高4位
AND BL, 0FH ; 高4位清零
CMP BL, 9 ; 判断是否需要转换为A-F
JLE BIN2HEX_NEXT ; 不需要转换,跳过
ADD BL, 7 ; 转换为A-F
BIN2HEX_NEXT:
ADD BL, '0' ; 转换为ASCII码
MOV strHex[SI], BL ; 存入字符串
INC SI ; 字符串下标加1
DEC CX ; 循环计数器减1
JNZ BIN2HEX_LOOP ; 继续循环
; 输出字符串
MOV AH, 09H
MOV DX, OFFSET strHex
INT 21H
RET
BIN2HEX_AX ENDP
;-------------------------------------------------------------
; 子程序,将16位二进制数转换为十六进制并在屏幕上显示,参数为wordTEMP变量
;-------------------------------------------------------------
BIN2HEX_TEMP PROC
; wTemp中存放16位二进制数
MOV CX, 4 ; 循环4次,每次转换4位
MOV SI, 0 ; 字符串下标
MOV AX, wTemp ; 将wordTEMP变量的值复制到AX中
BIN2HEX_LOOP:
SHL AX, 4 ; AX左移4位,高4位清零
MOV BL, AH ; BL存放高4位
AND BL, 0FH ; 高4位清零
CMP BL, 9 ; 判断是否需要转换为A-F
JLE BIN2HEX_NEXT ; 不需要转换,跳过
ADD BL, 7 ; 转换为A-F
BIN2HEX_NEXT:
ADD BL, '0' ; 转换为ASCII码
MOV strHex[SI], BL ; 存入字符串
INC SI ; 字符串下标加1
DEC CX ; 循环计数器减1
JNZ BIN2HEX_LOOP ; 继续循环
; 输出字符串
MOV AH, 09H
MOV DX, OFFSET strHex
INT 21H
RET
BIN2HEX_TEMP ENDP
;-------------------------------------------------------------
; 子程序,将16位二进制数转换为十六进制并在屏幕上显示,参数为堆栈
;-------------------------------------------------------------
BIN2HEX_STACK PROC
; 参数在堆栈顶部
MOV CX, 4 ; 循环4次,每次转换4位
MOV SI, 0 ; 字符串下标
POP AX ; 弹出参数
BIN2HEX_LOOP:
SHL AX, 4 ; AX左移4位,高4位清零
MOV BL, AH ; BL存放高4位
AND BL, 0FH ; 高4位清零
CMP BL, 9 ; 判断是否需要转换为A-F
JLE BIN2HEX_NEXT ; 不需要转换,跳过
ADD BL, 7 ; 转换为A-F
BIN2HEX_NEXT:
ADD BL, '0' ; 转换为ASCII码
MOV strHex[SI], BL ; 存入字符串
INC SI ; 字符串下标加1
DEC CX ; 循环计数器减1
JNZ BIN2HEX_LOOP ; 继续循环
; 输出字符串
MOV AH, 09H
MOV DX, OFFSET strHex
INT 21H
RET
BIN2HEX_STACK ENDP
END MAIN
```
上述程序中,采用了三种不同的参数传递方式,分别是:
1. 使用AX寄存器传递参数,即将16位二进制数存储在AX寄存器中,然后调用BIN2HEX_AX子程序进行转换。
2. 使用wordTEMP变量传递参数,即将16位二进制数存储在wordTEMP变量中,然后将该变量的值复制到AX寄存器中,再调用BIN2HEX_TEMP子程序进行转换。
3. 使用堆栈方法传递参数,即将16位二进制数压入堆栈中,然后调用BIN2HEX_STACK子程序进行转换。
这三种方式的实现基本相同,只是参数传递的方式不同。在BIN2HEX子程序中,使用循环和移位操作将16位二进制数转换为4位十六进制数,然后将其转换为ASCII码并存入字符串中,最后使用INT 21H中断输出字符串。
阅读全文