如何在EMU8086中实现多位数输入与显示?以三位数为例
问题分析
你的代码已经实现了从键盘读取三位数并转换成数值存入num的功能,但缺少将数值转回ASCII字符串并写入result缓冲区的步骤,所以最后执行printstring result时,输出的是空内容,无法显示输入的数字。
修复方案
新增一个宏numtostr,用于将16位数值转换为ASCII字符串并存入指定缓冲区;在读取完数字后调用该宏,再输出result即可实现预期效果。
修正后的完整代码
readnum macro num ; 定义读取三位数的宏 mov ah, 01h ; 读取百位(从右数第三位) int 21h sub al, '0' mov bh, 064h ; 存入100(十六进制064h) mul bh ; al * bh,结果存在ax中 mov ah, 00h mov num, ax ; 将百位对应的数值存入num mov ah, 01h ; 读取十位 int 21h sub al, '0' mov bh, 0ah ; 存入10(十六进制0ah) mul bh mov ah, 00h add num, ax ; 加上十位对应的数值 mov ah, 01h ; 读取个位 int 21h sub al, '0' mov ah, 00h add num, ax ; 加上个位对应的数值 endm printstring macro msg mov ah, 09h mov dx, offset msg int 21h endm ; 新增:将数值转换为ASCII字符串的宏 numtostr macro num, buffer mov ax, num mov si, offset buffer mov cx, 0 ; 记录数字位数 mov bx, 10 ; 除数为10 next_div: xor dx, dx ; 清空dx,因为div指令以ax/dx联合作为被除数 div bx ; ax = ax / 10,dx = ax % 10(余数即当前位数字) add dl, '0' ; 余数转ASCII字符 push dx ; 入栈保存(除法得到的是逆序数字,需后续反转) inc cx ; 位数计数+1 cmp ax, 0 ; 商为0则结束除法循环 jne next_div next_pop: pop dx ; 出栈恢复正序数字 mov [si], dl ; 将字符写入缓冲区 inc si loop next_pop mov [si], '$' ; 字符串结尾加$,符合int 21h 09h的输出要求 endm _DATA segment cr equ 0dh lf equ 0ah msg1 db 'Enter a three digit number: ','$' msg2 db cr, lf, 'You have entered: ','$' num dw ? temp db ? result db 20 dup('$') _DATA ends _CODE segment assume cs:_CODE, ds:_DATA start: mov ax, _DATA mov ds, ax printstring msg1 readnum num printstring msg2 numtostr num, result ; 调用宏将数值转成字符串存入result printstring result mov ah, 4ch mov al, 00h int 21h _CODE ends end start
关键修改说明
- 新增
numtostr宏:- 通过循环除以10,逐位提取数字的个位、十位、百位
- 将每一位数字转成ASCII后入栈(除法得到的是逆序数字)
- 依次出栈写入缓冲区得到正序字符串,最后加
$作为DOS字符串结束符
- 主程序调用宏:在
printstring msg2之后,调用numtostr num, result把num中的数值转换为字符串存入result,再输出result
运行时输入345,会得到预期输出:
Enter a three digit number: 345
You have entered: 345
内容的提问来源于stack exchange,提问作者Khadiza Akter
相关产品推荐
相关产品推荐

