8086汇编:无法将4字节数组转换为完整整数的问题求助
问题分析与解决思路
核心问题定位
你的NUM1P程序只得到最后一位数字的原因是循环缺少跳转指令,导致仅执行了一次迭代:
- 初始
di = counter = 3,进入power_base后dec di变为2,处理num1[2](即数字5)并累加到num1h; - 计算完幂次
bx=10后,执行cmp di,0,此时di=2不满足jl exitn1p(小于0才跳转),但代码没有回到power_base的跳转逻辑,直接退出循环,最终仅保留了最后一位的计算结果。
另外需要注意:每次转换前必须清零num1h,否则会累加之前的计算结果;同时你没有保存di寄存器,会破坏调用者的寄存器状态。
修正后的NUM1P代码
NUM1P proc push ax push bx push di ; 保存调用者的di寄存器 mov di, counter mov ax, 0 mov bx, 1 mov num1h, 0 ; 初始化目标变量为0 power_base: dec di mov al, [num1+di] mul bx add num1h, ax ; 计算下一个幂次:bx = bx * 10 mov ax, bx mov cx, 10 mul cx mov bx, ax ; 判断是否继续循环:di >=0则继续 cmp di, 0 jge power_base exitn1p: pop di pop bx pop ax ret NUM1P endp
更简洁高效的实现方案
推荐采用从左到右迭代计算的逻辑:num1h = num1h * 10 + 当前数字,无需维护幂次变量,逻辑更直观且不易出错,适配任意输入长度(最多4位):
NUM1P proc push ax push bx push cx push di mov num1h, 0 mov di, 0 mov cx, counter ; 遍历counter次,仅处理输入的有效数字 convert_loop: mov ax, num1h mov bx, 10 mul bx ; num1h = num1h * 10 add al, [num1+di] ; 加上当前位的数字 mov num1h, ax inc di loop convert_loop ; cx减1,不为0则继续循环 exitn1p: pop di pop cx pop bx pop ax ret NUM1P endp
比如输入875时,计算流程为:0*10+8=8 → 8*10+7=87 → 87*10+5=875,完全符合预期。
补充说明
你的TESTPROC采用固定位权的方式,仅在输入满4位时逻辑完全匹配,当输入位数少于4时,多余的0不会影响结果,但灵活性不足;上面的迭代方案仅遍历counter次,完全适配你的输入存储逻辑。
内容的提问来源于stack exchange,提问作者Adolf RJ
相关产品推荐
相关产品推荐

