用汇编语言在软件emu8086上写一个子程序,将一个16位无符号的二进制数转换成十进制数,主程序完成二进制数的输入和十进制数的输出。(要求用堆栈做参数传递)
时间: 2024-04-04 19:35:15 浏览: 236
好的,下面是汇编代码:
```
; 子程序:将16位无符号的二进制数转换成十进制数
; 参数:无符号二进制数(传入堆栈)
; 返回值:十进制数(返回值放在AX寄存器中)
bin2dec proc near
push bp ; 保存BP寄存器
mov bp, sp ; 设置BP指向栈顶
push ax ; 保存AX寄存器
mov cx, 16 ; 初始化计数器,用于循环16次
xor ax, ax ; 初始化AX为0,用于存储十进制数
bin2dec_loop:
shl word ptr [bp+4], 1 ; 将二进制数左移一位
rcl ax, 1 ; 将AX右移一位,并将最低位设置为二进制数的最高位
loop bin2dec_loop ; 循环16次
pop ax ; 恢复AX寄存器
pop bp ; 恢复BP寄存器
ret ; 返回
bin2dec endp
; 主程序
assume cs:code, ds:data
data segment
bin dw 0 ; 二进制数
dec dw 0 ; 十进制数
data ends
code segment
start:
mov ax, data
mov ds, ax
; 输入二进制数
mov ah, 1 ; 从键盘读入一个字符
int 21h
sub al, '0' ; 将字符转换成数字
mov bl, al
mov bh, 0
mov ax, 0
mov cx, 16 ; 初始化计数器,用于循环16次
input_loop:
mov ah, 1 ; 从键盘读入一个字符
int 21h
cmp al, 0dh ; 判断是否输入回车
je input_done
sub al, '0' ; 将字符转换成数字
shl ax, 1 ; 将AX左移一位
or al, bl ; 将输入的二进制数加入AX的最低位
mov bl, al ; 保存AX的最低位
mov bh, 0
loop input_loop
input_done:
push word ptr bin ; 将二进制数入栈,作为参数传递给子程序
call bin2dec ; 调用子程序,将二进制数转换成十进制数
add sp, 2 ; 释放栈空间
; 输出十进制数
mov ah, 0ah ; 设置AH为0Ah,用于输出带有换行符的字符串
mov dx, offset dec_str
int 21h
mov ax, 4c00h ; 结束程序
int 21h
dec_str db 'DEC: $' ; 存储输出的字符串
dec_val db 6 dup(?) ; 存储转换后的十进制数(使用6个字节,最多支持5位数)
code ends
end start
```
这段代码使用了堆栈来传递参数,主程序将二进制数先存储在数据段的`bin`变量中,然后将其入栈,调用子程序`bin2dec`进行转换,最后将返回值(十进制数)存储在AX寄存器中返回给主程序。整个程序完成后,主程序将十进制数输出到屏幕上。
阅读全文