如何修复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
相关产品推荐
相关产品推荐

