使用 emu8086 编写子程序,把一个16位二进制数用十六进制形式显示在屏幕上,分别运用以下2种参数传递方法,并用一个主程序进行验证。 (1) 采用AX寄存器 (2) 采用堆栈
时间: 2023-06-11 15:06:15 浏览: 1025
Emu8086使用指南
5星 · 资源好评率100%
以下是使用 AX 寄存器传递参数的子程序:
```
; 子程序:将16位二进制数转换为16进制并显示在屏幕上
; 输入:AX 中存储着一个16位的二进制数
; 输出:无
BIN2HEX PROC
PUSH AX ; 保存 AX 的值
MOV BX, 1000b ; BX = 1000b,用于转换二进制位为16进制位
MOV CX, 4 ; CX = 4,循环4次,将16位二进制数转换为4位16进制数
LOOP1:
ROR AX, 1 ; 将 AX 中最低位的二进制数移到 CF 中
ADC BL, BL ; 将 CF 中的二进制数加到 BL 中
ADC BL, 0 ; 将 CF 置为0
DEC BX ; BX 自减,用于判断当前是不是4位二进制数
JNZ LOOP1 ; 如果 BX 不为0,继续循环
; 将 BL 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BL 中的16进制数转换为字符
MOV AL, BL ; AL = BL
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR1 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR1:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 BH 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BH 中的16进制数转换为字符
MOV AL, BH ; AL = BH
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR2 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR2:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 AH 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 AH 中的16进制数转换为字符
MOV AL, AH ; AL = AH
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR3 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR3:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 BL 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BL 中的16进制数转换为字符
MOV AL, BL ; AL = BL
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR4 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR4:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
POP AX ; 恢复 AX 的值
RET ; 返回主程序
BIN2HEX ENDP
```
以下是使用堆栈传递参数的子程序:
```
; 子程序:将16位二进制数转换为16进制并显示在屏幕上
; 输入:堆栈中存储着一个16位的二进制数
; 输出:无
BIN2HEX PROC
PUSH BP ; 保存 BP 的值
MOV BP, SP ; 将 SP 的值赋给 BP,用于访问堆栈中的参数
MOV AX, [BP+4] ; AX = 输入的16位二进制数
MOV BX, 1000b ; BX = 1000b,用于转换二进制位为16进制位
MOV CX, 4 ; CX = 4,循环4次,将16位二进制数转换为4位16进制数
LOOP1:
ROR AX, 1 ; 将 AX 中最低位的二进制数移到 CF 中
ADC BL, BL ; 将 CF 中的二进制数加到 BL 中
ADC BL, 0 ; 将 CF 置为0
DEC BX ; BX 自减,用于判断当前是不是4位二进制数
JNZ LOOP1 ; 如果 BX 不为0,继续循环
; 将 BL 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BL 中的16进制数转换为字符
MOV AL, BL ; AL = BL
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR1 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR1:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 BH 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BH 中的16进制数转换为字符
MOV AL, BH ; AL = BH
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR2 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR2:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 AH 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 AH 中的16进制数转换为字符
MOV AL, AH ; AL = AH
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR3 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR3:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 BL 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BL 中的16进制数转换为字符
MOV AL, BL ; AL = BL
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR4 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR4:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
POP BP ; 恢复 BP 的值
RET 2 ; 返回主程序,并将堆栈指针恢复到原来的位置
BIN2HEX ENDP
```
以下是验证程序:
```
ORG 100h
MOV AX, 1010101010101010b ; 输入一个16位的二进制数
; 使用 AX 寄存器传递参数
CALL BIN2HEX
; 使用堆栈传递参数
PUSH AX
CALL BIN2HEX
ADD SP, 2
MOV AH, 4Ch ; 退出程序
INT 21h
END
```
阅读全文