You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
关键修改说明
  1. 新增numtostr宏:
    • 通过循环除以10,逐位提取数字的个位、十位、百位
    • 将每一位数字转成ASCII后入栈(除法得到的是逆序数字)
    • 依次出栈写入缓冲区得到正序字符串,最后加$作为DOS字符串结束符
  2. 主程序调用宏:在printstring msg2之后,调用numtostr num, result把num中的数值转换为字符串存入result,再输出result

运行时输入345,会得到预期输出:

Enter a three digit number: 345
You have entered: 345

内容的提问来源于stack exchange,提问作者Khadiza Akter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:15:50