2012-03-16 9 views
1
Ubuntu Linuxの、32ビット、x86プロセッサ、オン

syscallを終了して%ebxの内容を返さない?ガスでコンパイル

私は%ebxレジスタの内容は、私のプログラムのステータスコードとして返されていないされている非常に奇妙な問題、に実行したとき、I出口のシステムコールを作成します。ここに関連コードがあります。ここでは、レジスタのダンプは、単にシステムコールの前にある:

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の8進数で終了します。これを引き起こす原因は何か。それがどのようにこの問題に影響を与えるのか分かりませんが、もっとコードを投稿する必要があるかどうかを教えてください。

答えて

4

これは完全に正常な動作です、exitのmanページをお読みください。

終了()関数は、通常のプロセスの終了を引き起こし、 状態& 0377の値が親に返され(を参照してください(2)を待つ)。

0377 8進値であり、それには10進数は255ので255より大きい任意の値は、ビット単位のAND演算からそれ未満を終わるために起こっている場合の等価です:

345 AND 255 = 89 

ところだこと価値89はから来る。

+0

Ahh私はexit()が1バイトまでしか返さないことを忘れました。私の愚かさを修正してくれてありがとう。 – Jumhyn

関連する問題