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

ioekq8ef  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(54)

在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在八进制。可能是什么导致这一点。让我知道,如果我应该张贴更多的代码,虽然我不知道这可能会影响这个问题。

bvjveswy

bvjveswy1#

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

exit()函数会导致正常的进程终止,并将状态值& 0377返回给父进程(参见wait(2))。

0377是一个八进制值,它的等效十进制值是255。因此,任何大于255的值最终都会小于按位AND运算的值:

345 AND 255 = 89

字符串
这就是值89的来源。

相关问题