Jum*_*hyn 1 linux assembly system-calls exit exitstatus
在 Ubuntu Linux,32 位,x86 处理器上,使用 GAS 编译
我遇到了一个非常奇怪的问题,其中当%ebx我进行退出系统调用时,寄存器的内容没有作为程序的状态代码返回。这是相关代码。这是系统调用之前的寄存器转储:
eax 0x1 1
ecx 0x804a00c 134520844
edx 0xff 255
ebx 0x159 345
esp 0xbffff3bc 0xbffff3bc
ebp 0xbffff3c0 0xbffff3c0
esi 0x0 0
edi 0x0 0
eip 0x80480c6 0x80480c6 <num_loop_end+5>
eflags 0x246 [ PF ZF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
Run Code Online (Sandbox Code Playgroud)
以及相关的汇编代码:
0x080480c1 <+0>: mov $0x1,%eax
=> 0x080480c6 <+5>: int $0x80
Run Code Online (Sandbox Code Playgroud)
寄存器转储发生在=>上面。但是,我的程序不是返回 345 作为状态代码,而是以 code89或0131八进制退出。可能是什么原因造成的。让我知道是否应该发布更多代码,尽管我不知道这会如何影响这个问题。
这是完全正常的行为,请阅读手册页exit:
exit ()函数导致进程正常终止,并将status &0377的值返回给父进程(参见wait (2))。
0377是一个八进制值,它的等效十进制值为 255。因此任何大于 255 的值最终都会小于按位 AND 运算得到的值:
345 AND 255 = 89
Run Code Online (Sandbox Code Playgroud)
这就是值 89 的由来。