二进制转3位十进制方法及汇编收益显示代码修复求助
问题分析与解决方案
原代码的问题
你的代码输出乱码的核心原因有几个:
- AAM指令的局限性:AAM仅能将0-99的8位二进制数转换为两位BCD码,当数值超过99(比如144)时,AH会得到十六进制
0xE(十进制14),转ASCII后是0xE + 48 = 62,对应字符>,这就是第一个异常字符的来源。 - 逻辑混乱的判断与输出:输出十位和个位后,你用
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
相关产品推荐
相关产品推荐

