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

采用移位加法实现乘法的汇编程序输出异常,请求排查

分析你的移位加法乘法代码问题

首先,我看了你的汇编代码片段,发现几个可能导致结果无效的问题,咱们一步步拆解:

1. 错误地只操作低8位寄存器bl,忽略了buff2的高8位

你的buff2是word类型(16位),但代码里每次移位的是bl(仅8位),这会导致如果buff2的高8位有值时,那些位的1不会被检测到,直接漏掉对应的加法操作。哪怕这次测试的buff2=03H高8位是0,这个逻辑也是有漏洞的——而且如果后续测试更大的数,结果肯定会错。

正确的做法应该是操作整个16位的bx或者32位的ebx,这样能覆盖buff2的所有位。

2. 可能未完成结果写入buff的操作

你的代码最后到m...就断了,推测是没写完把结果寄存器edx写入buff的步骤。如果没有这一步,buff还是.bss段的初始0值,自然看起来结果无效。

修正后的完整代码

section .data
buff1 dw 0AH       ; 十进制10
buff2 dw 03H       ; 十进制3

section .bss
buff resb 4        ; 存储4字节的乘法结果

section .text
global _start

_start:
    call shift_add
    ; 这里可以加调试或退出逻辑,比如调用exit系统调用
    mov eax, 60     ; sys_exit
    xor edi, edi
    syscall

shift_add:
    movzx eax, word[buff1]  ; 把buff1的16位值零扩展到32位eax
    movzx ebx, word[buff2]  ; 把buff2的16位值零扩展到32位ebx
    mov edx, 0H             ; 初始化结果寄存器为0
    mov ecx, 16             ; 循环16次(覆盖16位的所有位)

backs:
    shr ebx, 1              ; 对整个ebx右移1位,把当前最低位移到CF
    jnc haha                ; 如果CF是0,跳过加法
    add edx, eax            ; CF是1,把当前eax加到结果里

haha:
    shl eax, 1              ; eax左移1位,对应下一位的权重
    loop backs              ; 循环直到ecx为0

    mov [buff], edx         ; 把最终结果写入buff变量
    ret

关键修正点解释

  • 把shr bl,1改成shr ebx,1:这样每次移位都会处理buff2的每一位,不管是高8位还是低8位。
  • 补全mov [buff], edx:把计算好的结果从edx写入buff,这样你才能在buff里看到正确的乘积。
  • 用ecx替代rcx(可选,但如果是32位兼容的64位代码更稳妥;如果是纯64位,用rcx也没问题,只要循环次数正确)。

对于你的测试用例10*3=30,修正后buff里会存储0x0000001E(十进制30),是正确的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:22:44