在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
以及相关的汇编代码:
0x080480c1 <+0>: mov $0x1,%eax
=> 0x080480c6 <+5>: int $0x80
注册转储发生在=>
上方。但是,我的程序不是返回345作为状态代码,而是退出代码89
或八进制0131
。可能导致这种情况的原因。让我知道我是否应该发布更多代码,虽然我不知道这会如何影响这个问题。
答案 0 :(得分:4)
这是完全正常的行为,请阅读exit
的手册页:
退出()函数会导致正常的进程终止和值 现状与0377将返回给父母(请参阅等待(2))。
0377
是八进制值,它的等效十进制值是255.因此任何大于255的值最终都会比按位AND操作的值小:
345 AND 255 = 89
这就是价值89的来源。