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

二进制转3位十进制方法及汇编收益显示代码修复求助

问题分析与解决方案

原代码的问题

你的代码输出乱码的核心原因有几个:

  1. AAM指令的局限性:AAM仅能将0-99的8位二进制数转换为两位BCD码,当数值超过99(比如144)时,AH会得到十六进制0xE(十进制14),转ASCII后是0xE + 48 = 62,对应字符>,这就是第一个异常字符的来源。
  2. 逻辑混乱的判断与输出:输出十位和个位后,你用cmp dl,48判断数值是否小于100,但此时dl是个位的ASCII值(比如144的个位ASCII是52,即'4'),这个判断完全错误。后续的add dl,48和输出dl=0更是逻辑错误,导致输出乱码。

修正后的代码(实现3位十进制格式输出)

要实现固定3位十进制显示(不足补前导零),正确的做法是通过除法分解数值的百位、十位、个位,分别转ASCII后依次输出:

show_amount:
    mov     dx, offset amount_earned
    mov     ah, 9
    int     21h        ; 输出提示字符串

    mov     ax, 00h
    mov     al, amount ; 把要转换的数值放入AL(假设amount是8位,范围0-255)

    ; 分解百位
    mov     bl, 100
    div     bl         ; AL = amount / 100(百位),AH = amount % 100(余数)
    add     al, 48     ; 转ASCII
    mov     dl, al
    mov     ah, 2
    int     21h        ; 输出百位

    ; 分解十位
    mov     al, ah     ; 把余数放入AL
    mov     ah, 0
    mov     bl, 10
    div     bl         ; AL = 余数/10(十位),AH = 余数%10(个位)
    add     al, 48
    mov     dl, al
    mov     ah, 2
    int     21h        ; 输出十位

    ; 输出个位
    add     ah, 48
    mov     dl, ah
    mov     ah, 2
    int     21h        ; 输出个位

    jmp     start

二进制转3位十进制的原理

核心思路是通过除法取商和余数拆分每一位:

  • 百位:将数值除以100,商就是百位数字(8位二进制最大值255,所以百位范围0-2)。
  • 十位:用第一步的余数除以10,商就是十位数字。
  • 个位:第二步的余数就是个位数字。
  • 每个数字加上48(ASCII中'0'的编码),转换为对应字符后调用int 21h的AH=2功能输出。

这样不管数值是0(输出000)、72(输出072)还是144(输出144),都能正确显示3位十进制格式。

内容的提问来源于stack exchange,提问作者Salik Syed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:20:33