汇编语言的宏指令及子程序设计从键盘输入10个无符号十进制数,将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并在屏幕上显示出来,要求在屏幕上显示字符串提示信息的功能由宏指令DSTRING实现,将键盘输入的十进制转换为二进制由子程序DTOB实现,在N个无符号字节型二进制数中找出最大数由子程序FMAX实现,将一个无符号字节型二进制数转换为十进制数并显示在屏幕上由子程序BTOAD实现
时间: 2023-12-28 13:03:45 浏览: 34
以下是汇编语言程序的代码实现:
```
; 定义宏指令DSTRING
DSTRING MACRO str
mov ah, 09h ; 调用DOS中断21h的09h功能,显示字符串
lea dx, str ; 将字符串地址存入DX寄存器
int 21h ; 执行中断
ENDM
; 定义子程序DTOB
DTOB PROC NEAR
push ax ; 保存寄存器状态
push bx
push cx
push dx
mov bx, 02h ; 将除数设为2
mov cx, 08h ; 将循环次数设为8
mov ax, [si] ; 将十进制数读入AX寄存器
mov dx, 0000h ; 将DX寄存器清零
convert:
div bx ; 将AX寄存器中的值除以2
push dx ; 将余数存入栈中
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne convert ; 如果循环未结束则继续执行
mov si, offset NUM ; 将NUM的地址存入SI寄存器
mov cx, 08h ; 将循环次数设为8
load:
pop dx ; 从栈中取出一个二进制位
or dl, 30h ; 将其转换为ASCII码
mov [si], dl ; 将ASCII码存入NUM数组中
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne load ; 如果循环未结束则继续执行
pop dx ; 恢复寄存器状态
pop cx
pop bx
pop ax
ret ; 返回子程序
DTOB ENDP
; 定义子程序FMAX
FMAX PROC NEAR
push ax ; 保存寄存器状态
push bx
push cx
push dx
mov si, offset NUM ; 将NUM的地址存入SI寄存器
mov al, [si] ; 将第一个数读入AL寄存器
mov bl, al ; 将AL寄存器的值赋给BL寄存器
inc si ; 数组指针加1
dec cx ; 循环次数减1
loop:
cmp al, [si] ; 比较AL寄存器的值与当前数值的大小
jae skip ; 如果AL大于或等于当前数值,则跳过
mov bl, [si] ; 如果AL小于当前数值,则将BL寄存器的值更新为当前数值
skip:
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne loop ; 如果循环未结束则继续执行
mov si, offset RESULT ; 将RESULT的地址存入SI寄存器
call BTOAD ; 调用BTOAD子程序将二进制数转换为十进制数
pop dx ; 恢复寄存器状态
pop cx
pop bx
pop ax
ret ; 返回子程序
FMAX ENDP
; 定义子程序BTOAD
BTOAD PROC NEAR
push ax ; 保存寄存器状态
push bx
push cx
push dx
mov cx, 08h ; 将循环次数设为8
mov al, 01h ; 将AL寄存器的值初始化为1
xor bx, bx ; 将BX寄存器清零
mov si, offset NUM ; 将NUM的地址存入SI寄存器
convert:
mov dl, [si] ; 将二进制位读入DL寄存器
sub dl, 30h ; 将ASCII码转换为数字
mul al ; 将AL乘以2
add bx, ax ; 将BX加上AL乘以DL的结果
mov ax, bx ; 将结果存入AX寄存器
shr al, 1 ; 将结果除以2,得到下一位数值
mov bx, ax ; 将结果存入BX寄存器
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne convert ; 如果循环未结束则继续执行
mov ah, 02h ; 调用DOS中断21h的02h功能,显示字符
mov cx, 04h ; 将循环次数设为4
display:
mov al, bl ; 将BL寄存器的值存入AL寄存器
shr al, cl ; 将AL寄存器右移cl位,得到当前位的数值
and al, 01h ; 将AL寄存器与00000001进行按位与运算,得到当前位的值
add al, 30h ; 将当前位的值转换为ASCII码
mov dl, al ; 将DL寄存器存入AL寄存器
int 21h ; 调用DOS中断21h的02h功能,显示字符
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne display ; 如果循环未结束则继续执行
DSTRING maxNumStr ; 显示字符串提示信息
mov dl, bl ; 将最大数值存入DL寄存器
add dl, 30h ; 将最大数值转换为ASCII码
mov ah, 02h ; 调用DOS中断21h的02h功能,显示字符
int 21h ; 执行中断
pop dx ; 恢复寄存器状态
pop cx
pop bx
pop ax
ret ; 返回子程序
BTOAD ENDP
; 主程序开始
NUM db 10 dup (?) ; 定义存放二进制数的数组
RESULT db 8 dup (?) ; 定义存放最大数值的数组
maxNumStr db 'The maximum number is: ', '$' ; 定义字符串提示信息
start:
DSTRING prompt ; 显示字符串提示信息
mov cx, 10 ; 将循环次数设为10
mov si, offset NUM ; 将NUM的地址存入SI寄存器
input:
mov ah, 01h ; 调用DOS中断21h的01h功能,等待键盘输入
int 21h ; 执行中断
cmp al, 0Dh ; 判断是否输入回车键
je exit ; 如果输入回车键则跳转到程序结束部分
sub al, 30h ; 将ASCII码转换为数字
mov [si], al ; 将数字写入NUM数组中
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne input ; 如果循环未结束则继续执行
mov si, offset NUM ; 将NUM的地址存入SI寄存器
mov cx, 10 ; 将循环次数设为10
convertAll:
call DTOB ; 调用DTOB子程序将十进制数转换为二进制数
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne convertAll ; 如果循环未结束则继续执行
call FMAX ; 调用FMAX子程序找出最大数值
exit:
mov ah, 4Ch ; 调用DOS中断21h的4Ch功能,结束程序
int 21h ; 执行中断
```