退出系统调用不返回%ebx的内容?

时间:2012-03-16 06:53:02

标签: assembly cpu-registers

在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。可能导致这种情况的原因。让我知道我是否应该发布更多代码,虽然我不知道这会如何影响这个问题。

1 个答案:

答案 0 :(得分:4)

这是完全正常的行为,请阅读exit的手册页:

  

退出()函数会导致正常的进程终止和值          现状与0377将返回给父母(请参阅等待(2))。

0377是八进制值,它的等效十进制值是255.因此任何大于255的值最终都会比按位AND操作的值小:

345 AND 255 = 89

这就是价值89的来源。