采用移位加法实现乘法的汇编程序输出异常,请求排查
分析你的移位加法乘法代码问题
首先,我看了你的汇编代码片段,发现几个可能导致结果无效的问题,咱们一步步拆解:
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
相关产品推荐
相关产品推荐

