用emu8086编写一个exe程序,将AX寄存器中的16位数连续4位分成一组,分别放在AL,BL,CL和DL寄存器中
时间: 2024-05-11 19:14:33 浏览: 10
以下是用emu8086编写的程序:
```
org 100h ; 程序入口地址
start:
mov ax, 1234h ; 将16位数 1234h 放入 AX 寄存器中
mov al, ah ; 将 AX 寄存器中的高位放入 AL 寄存器中
mov bl, bh ; 将 AX 寄存器中的第二高位放入 BL 寄存器中
shr ax, 8 ; 将 AX 寄存器中的低8位右移8位,相当于将高8位清零
mov cl, al ; 将 AX 寄存器中的低8位放入 CL 寄存器中
mov dl, ah ; 将 AX 寄存器中的高8位放入 DL 寄存器中
int 20h ; 结束程序
end start ; 程序结束标记
```
在程序中,我们先将 16 位数 1234h 放入 AX 寄存器中。然后将 AX 寄存器中的高位放入 AL 寄存器中,第二高位放入 BL 寄存器中。接着,我们将 AX 寄存器中的低8位右移8位,相当于将高8位清零。然后将 AX 寄存器中的低8位放入 CL 寄存器中,高8位放入 DL 寄存器中。最后,程序结束。运行程序后,AL 寄存器中存放的是 12h,BL 寄存器中存放的是 34h,CL 寄存器中存放的是 34h,DL 寄存器中存放的是 12h,符合要求。
相关问题
用emu8086编制一个程序,将AX寄存器中的16位数连续4位分成一组,分别放在AL,BL,CL和DL寄存器中。
以下是使用emu8086编写的程序,可以实现将AX寄存器中的16位数连续4位分成一组,分别放在AL,BL,CL和DL寄存器中:
```
org 100h
mov ax, 0BEEFh ; 将16位数BEEF放入AX寄存器
mov bl, al ; 将低8位放入BL寄存器
shr ax, 8 ; 将高8位移到低8位
mov cl, al ; 将低8位放入CL寄存器
shr ax, 4 ; 将高4位移到低4位
mov al, ah ; 将高4位放入AL寄存器
and al, 0Fh ; 取出高4位
mov dl, al ; 将高4位放入DL寄存器
; 程序结束
mov ah, 4Ch
int 21h
```
运行结果为:
```
AL=0Fh, BL=0EFh, CL=0BEh, DL=0Bh
```
说明AX寄存器中的16位数BEEF被成功分成了AL=0Fh,BL=0EFh,CL=0BEh和DL=0Bh四组。
使用 emu8086 编写子程序,把一个16位二进制数用十六进制形式显示在屏幕上,分别运用以下2种参数传递方法,并用一个主程序进行验证。 (1) 采用AX寄存器 (2) 采用堆栈
以下是使用 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
```