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

为何IMUL指令在指数超过3后输出错误结果?(附汇编代码)

问题根源分析

你的问题和imulq指令无关,核心问题是误用32位系统调用接口返回64位计算结果:

  • 你通过int $0x80触发32位Linux系统调用,而Linux的exit系统调用(%rax=1)会将进程返回码强制截断为8位无符号整数。当计算结果超过255时,只会保留低8位的值——比如2³+5⁴=633,它的低8位是121,这就是你看到的错误输出。
  • 你的代码是64位汇编(使用pushq、%rax/%rbx等64位寄存器),但混用了32位系统调用入口,导致完整结果被截断。
修复方案

把32位的int $0x80替换为64位系统调用指令syscall,同时遵循64位Linux系统调用的参数约定:

  • 64位系统调用中,exit的编号是60(而非32位的1)
  • 退出状态码需要放在%rdi寄存器,而非%rbx

修改后的_start结尾代码如下:

addq %rax , %rbx

; 替换原有的exit调用逻辑
movq $60, %rax       ; 64位exit系统调用编号
movq %rbx, %rdi      ; 将计算结果作为exit参数传入
syscall              ; 触发64位系统调用
补充说明
  • 修复后,计算2³+5⁴的结果633会被正确传递给系统,但注意:shell的echo $?只会显示退出码的低8位(这是shell的限制)。如果要查看完整的64位结果,需要通过write系统调用将数值输出到标准输出,而不是用exit返回。
  • 你的power函数逻辑本身没有问题,imulq在64位模式下可以正确处理64位整数乘法,只要结果不超出64位整数范围就不会溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:16:02