用汇编语言写一个子程序,将一个16位无符号的二进制数转换成十进制数,主程序完成二进制数的输入和十进制数的输出。(要求用堆栈做参数传递)
时间: 2024-03-20 18:41:24 浏览: 76
将16进制转10进制的汇编程序
5星 · 资源好评率100%
好的,以下是一个将16位无符号二进制数转换为十进制数的汇编子程序,使用堆栈传递参数:
```
bin2dec PROC near
push bp
mov bp, sp
push bx
push cx
push dx
push si
mov bx, [bp+4] ; 将二进制数的低8位存入BX
mov si, [bp+6] ; 将二进制数的高8位存入SI
; 将二进制数的高8位左移8位,与低8位组合成16位二进制数
shl si, 8
or bx, si
; 初始化十进制数为0
xor ax, ax
; 将每一位二进制数转换为十进制数并相加
mov cx, 16
mov si, 1
dec cx
loop_start:
mov dx, bx
shr dx, cl
and dx, 1
mul si
add ax, dx
shl si, 1
dec cx
jns loop_start
; 将十进制数存入堆栈
mov si, ax
mov [bp+4], si
pop si
pop dx
pop cx
pop bx
pop bp
ret 4 ; 返回时弹出一个参数
bin2dec ENDP
```
接下来,我们可以编写一个主程序来测试这个子程序。以下是一个示例程序,它从键盘读取16位无符号二进制数,并将其转换为十进制数:
```
start:
; 读取16位无符号二进制数
mov ah, 1
int 21h
mov bl, al
mov ah, 0
int 16h
mov bh, al
; 调用子程序将二进制数转换为十进制数
push bx
push ax
call bin2dec
; 显示十进制数
mov ah, 0Eh
mov al, ' '
int 10h
pop ax
call print_word ; 打印转换后的十进制数
mov ah, 0Eh
mov al, ' '
int 10h
; 等待用户按下任意键
mov ah, 0
int 16h
; 回到程序开头
jmp start
print_word PROC near
push bx
push cx
push dx
mov bx, ax
mov cx, 4 ; 打印十六进制数,每次处理4位
print_loop:
mov dx, 0
mov ax, bx
shr ax, cl
and ax, 0Fh
cmp ax, 10
jl print_digit
add ax, 7
print_digit:
add ax, '0'
mov dl, al
mov ah, 0Eh
int 10h
sub cx, 4
jge print_loop
pop dx
pop cx
pop bx
ret
print_word ENDP
```
这个程序从键盘读取一个16位无符号二进制数,并将其传递给 `bin2dec` 子程序以进行转换。然后,它将转换后的十进制数打印出来,并等待用户按下任意键以进行下一次转换。
阅读全文