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

如何修复AT&T汇编两数相加代码运行时报段错误的问题

问题根因

你触发段错误的核心原因是没有遵循Linux 32位int 0x80系统调用的规则:

  • 触发int 0x80时,内核会优先从eax寄存器读取要执行的系统调用编号
  • 你代码执行到int 0x80时,eax的高8位ah存的是3、低8位al是相加后的结果8,整体eax值为0x0308,这是无效的系统调用号,内核无法识别就会抛出段错误。
  • 进程退出对应的系统调用是exit,它的编号固定为1,需要手动赋值给eax。

修复后的代码

.globl _start
_start:
mov $3,%ah     
mov $5,%al
add %ah,%al    # 完成两数相加,结果存在al中,值为8

movl $1,%eax   # 手动指定执行exit系统调用,调用号为1
movzbl %al,%ebx # 将相加结果作为进程退出码存入ebx
int 0x80

验证方法

编译链接命令和你之前用的完全一致:

as file.s -o file.o
ld file.o -o file
./file
echo $?  # 执行后会输出8,即为两数相加的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:09:03