用emu8086编写一个exe程序,将AX寄存器中的16位数连续4位分成一组,分别放在AL,BL,CL和DL寄存器中
时间: 2024-05-11 20:14:33 浏览: 164
以下是用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编写一个子程序以十进制输入寄存器BX中的值
在EMU8086汇编语言中,编写一个子程序接收用户输入并存储到寄存器BX中,通常涉及到中断处理、数据输入和内存操作。这里是一个简单的示例,假设我们使用INT 21H系统调用函数从键盘读取字符,并累加到一个字节变量,最后这个字节会被复制到寄存器BX:
```assembly
; 定义子程序入口点
input_subroutine proc near
; 设置栈指针
push bp
mov bp, sp
; 准备接收输入
mov ah, 0Ah ; INT 21H,功能码2Ah,用于标准设备读取字符串
lea dx, input_buffer ; 指向存放输入的缓冲区
int 21h ; 发送中断请求
; 将读取到的字节转换为十进制并放入bx
mov si, offset input_buffer ; 指向输入缓冲区
mov al, [si] ; 取得第一个字符(假设是数字)
sub al, '0' ; 转换为数值(ASCII减去'0'的偏移)
add bx, ax ; 把数值加到bx
; 清理栈并返回
pop bp
ret
input_subroutine endp
section .data ; 数据段
input_buffer db 1, 0 ; 一个字符的缓冲区,包括终止符
section .text ; 程序段
main proc
; 调用子程序
call input_subroutine
; 打印结果(假设BX已经被更新了)
mov ah, 2 ; INT 21H,功能码2,打印字符
mov dl, bl ; 输出低8位
int 21h
mov dl, bh ; 输出高8位
int 21h
; 子程序结束后的清理或其他操作...
main endp
```
这个子程序首先创建了一个用于接收用户输入的缓冲区,然后使用INT 21H的0Ah功能调用获取用户输入,接着将接收到的第一个字符作为数值添加到寄存器BX中。
使用 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
```
阅读全文