2012-01-23 3 views
3

はだからは、x86アセンブリに次のコード・セグメントを有する:のx86 - Cさんのsscanf関数

mov $0x0, %eax 
callq 400ac8 <[email protected]> 
cmp $0x5,%eax 
jg  40152d <this_function+0x3d> -----> jumps to add two lines down 
callq 4014b a <error_program> 
add $0x18,%rsp 
retq 

今最初の行では、それはゼロとして%EAX設定します。次に、sscanfを呼び出し、%eaxが5かどうかを確認します.5より大きい場合は、それ以外の場合は終了します。だから私が作ったシンプルなCコード:

eax = 0; 
sscanf(); 
if (eax < 5) error_program(); 
return; 

これはバイナリファイルのオブジェクトダンプなので、正しいことを確信しています。しかし、eaxは常にゼロになり、エラーが発生します。私はそれを正しくしていますか?または、sscanfがeaxを操作する可能性はありますか?

ありがとう

+0

これはしかし意味がありません - このプログラムはそれぞれ、すべての単一の時間を終了していないだろう... – darksky

+0

私はあなたがそのIここに持っているものによって十分に混乱しています – sarnold

+0

"これはバイナリファイルのオブジェクトダンプなので、私はそれが正しいと確信しています。正しい。"線形掃引を行う静的逆アセンブラは簡単にだますことができます – bubakazouba

答えて

4

関数が戻り値をeaxに渡すのは一般的です。少なくとも、それは保存されることが保証されていません。だから、おそらくこのコードは、sscanfが少なくとも5つのアイテムを見つけていることを確認することでしょうか?

+0

また、 'eax'は0に設定され、SSEレジスタに引数が渡されていないことを示します。 – ughoavgfhw

2

短い答えははいです。sscanfは確かに%eaxを変更します。 %raxはデフォルトのレジスタ関数で、常に戻り値を入れます。

私はいくつかの研究を行なったし、それがこれを言う:成功し

、機能が正常に満たされた引数リスト内の項目数を返します。このカウントは予想されるアイテム数に一致するか、一致する失敗の場合にはそれより少なくなります(ゼロの場合もあります)。 データが正常に解釈される前に入力障害が発生した場合は、EOFが戻されます。

はここより多くの情報を参照してください。http://www.cplusplus.com/reference/cstdio/sscanf/

関連する問題