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

x86汇编中数字数组转数值失败问题求助

x86汇编计算器数值计算异常问题排查与调试方法

问题原因分析

核心错误在于数组索引步长不匹配:

  • num1是db(字节)类型数组,每个元素占1字节,用di每次+1索引是正确的;
  • bdec是dw(字)类型数组,每个元素占2字节,但代码中复用了同一个di(每次+1)来索引,导致每次读取bdec时都取到了错误的内存位置(跨元素的字节组合),最终计算结果完全偏离预期。

比如输入num1=[9,8,7,5]时,第二次循环di=1,读取[bdec+1]会取到bdec第一个元素的高字节和第二个元素的低字节组成的错误字值,而非预期的100,后续乘法和累加自然全部错误。

修正方案

修改数组索引逻辑,确保bdec的索引步长为2(对应字类型的字节长度),有两种常用方式:

方式1:使用索引乘2访问bdec

NUM1P proc
        push ax
        push bx
        push cx
        push di
        
        mov di,0
        mov cx, 0
        mov ax, 0
        mov num1h,0
    
    power_base:
        mov al, [num1+di] 
        mov bx, [bdec+di*2]  ; 字数组索引需乘2,匹配元素字节长度
        mul bx
        add num1h,ax
        inc cx
        inc di
        cmp cx,4
        je exitn1p
        jmp power_base

    exitn1p:
        pop di
        pop cx
        pop bx
        pop ax
        ret
NUM1P endp    

方式2:使用独立索引变量

NUM1P proc
        push ax
        push bx
        push cx
        push di
        push si
        
        mov di,0       ; num1的字节索引
        mov si,0       ; bdec的字索引(步长2)
        mov cx, 0
        mov ax, 0
        mov num1h,0
    
    power_base:
        mov al, [num1+di] 
        mov bx, [bdec+si]
        mul bx
        add num1h,ax
        inc cx
        inc di
        add si,2       ; 字数组每次索引+2
        cmp cx,4
        je exitn1p
        jmp power_base

    exitn1p:
        pop si
        pop di
        pop cx
        pop bx
        pop ax
        ret
NUM1P endp    

汇编程序调试方法

1. 寄存器与内存监控

使用调试器(如Debug、GDB、NASM Debugger)单步执行代码:

  • 每次循环后检查AX(乘法结果)、BX(当前位的10的幂)、num1h的数值,确认是否符合预期;
  • 查看bdec数组的内存存储,确认每个字元素的小端字节序是否正确(如1000d对应内存0xE8 0x03),同时检查每次[bdec+xxx]访问的地址对应的字值是否正确。

2. 中间结果验证

在循环中临时加入打印逻辑,比如每次乘法后将AX传入IMPRIME_BX打印,快速定位哪一次循环开始出现异常结果。

3. 边界与循环检查

确认循环次数(4次)是否正确执行,每次循环后索引变量(di/si)的增量是否匹配数组类型的字节长度(字节数组+1,字数组+2)。

内容的提问来源于stack exchange,提问作者Adolf RJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:20:30