x86_64 NASM程序为何返回0而非预期的256?
程序返回值为何是0而非256?
原汇编代码
;program name - first.asm section .data ;stores initialised var section .bss ;stores uninit var section .text ;actual code global _start _start: mov eax,1 mov ebx,256 int 0x80
运行脚本(run.bash)
#!/bin/bash nasm -felf64 $1.asm ld $1.o -o $1 ./$1 echo $? rm -rf $1.o $1
问题
执行sh run.bash first后,程序返回0而非预期的256。已知eax=1是程序终止的syscall,会返回ebx中存储的值,ebx是32位寄存器,为何会出现这种情况?
原因解析
- 退出码的范围限制:Unix/Linux系统规定程序退出码只能是0-255的整数。当传入的数值超出这个范围时,系统会自动对其取模256,256 % 256 = 0,因此最终返回0。
- 32位syscall在64位环境的行为:你用
-felf64编译的是64位程序,但调用了32位的int 0x80系统调用接口。在64位环境下,32位syscall会将退出码截断为低8位,256的二进制是100000000,低8位全为0,所以返回0。
正确的64位写法
如果要在64位程序中使用系统调用,应该遵循64位syscall规范:
- 退出syscall的编号是60(对应
rax寄存器) - 退出码存储在
rdi寄存器 - 使用
syscall指令而非int 0x80
修正后的代码示例:
;program name - first.asm section .data ;stores initialised var section .bss ;stores uninit var section .text ;actual code global _start _start: mov rax,60 ;64位退出syscall编号 mov rdi,256 ;依然会返回0,因为超出0-255范围 syscall
若要得到非0的有效退出码,需将rdi设为0-255之间的数值,比如设为1时,运行后会返回1。
内容的提问来源于stack exchange,提问作者Angadh
相关产品推荐
相关产品推荐

