4位ASCII十进制数转整数:汇编代码逻辑验证与错误修复求助
4位ASCII十进制数转整数汇编代码问题修复
逻辑分析
你的核心逻辑是正确的:通过num = num*10 + 下一位数字的方式,从高位到低位逐步构建整数。对于1234,先转首位1为整数,再通过三次乘10+后续数位得到1000+200+30+4=1234,这个思路没问题。
代码错误点
你遇到的问题根源在于仅更新了AX的低8位(AL),未正确处理高8位(AH)的数值:
mul bl执行后,AX存储的是当前值×10的完整16位结果(AH为高8位,AL为低8位)- 后续用
adc al, dl仅将digit加到AL中,AH保持不变;若mul后AH不为0(比如处理较大数时,567×10=5670的十六进制为1626,AH=0x16),直接修改AL会导致AH的高位值丢失,最终结果错误。 - 另外,你只给DL赋值,DH未清零,若DH存在随机值,后续操作可能引入额外错误(虽然处理
1234时DH恰好为0,所以结果正常)。
修复后的代码
修改代码,确保每次将digit加到完整的AX中,同时清零DH避免垃圾值干扰:
; ASCII -> Integer mov al, [operand1 + 2] ; Load the first digit sub al, 30h ; Convert ASCII to integer mov ah, 0 ; Clear AH to initialize AX mov cx, 3 ; Loop 3 times for remaining 3 digits lea si, [operand1 + 2] ; Point to first digit's address @loop: mov bl, 10 ; Load multiplier 10 mul bl ; AX = AX * 10 (full 16-bit result) inc si ; Move to next digit mov dl, [si] ; Load next digit's ASCII sub dl, 30h ; Convert to integer mov dh, 0 ; Clear DH to make DX = digit (0-9) add ax, dx ; Add digit to full AX value loop @loop ; Repeat until CX=0 ; Final integer result is stored in AX
更简洁的实现方案
你也可以改用更通用的逐位累加逻辑,无需单独处理首位,代码可读性更强:
; ASCII -> Integer (4-digit number) xor ax, ax ; Initialize result to 0 mov cx, 4 ; Process all 4 digits lea si, [operand1 + 2] ; Point to first digit's ASCII @convert_loop: mov bl, [si] ; Load ASCII digit sub bl, 30h ; Convert to integer mov dx, 10 ; Multiplier mul dx ; AX = AX * 10 add ax, bx ; Add current digit to result inc si ; Move to next digit loop @convert_loop ; Repeat for all digits ; Result is in AX
内容的提问来源于stack exchange,提问作者MUHAMMAD AWAIS
相关产品推荐
相关产品推荐

