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

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位寄存器,为何会出现这种情况?


原因解析

  1. 退出码的范围限制:Unix/Linux系统规定程序退出码只能是0-255的整数。当传入的数值超出这个范围时,系统会自动对其取模256,256 % 256 = 0,因此最终返回0。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:40:06