3

バイナリから生成されたアセンブリコードをデコードしようとしています。sscanfコード内に関数の呼び出しがあります。

 400f08:       e8 13 fc ff ff          callq  400b20 <sscanf@plt>
 400f0d:       89 45 fc                mov    %eax,-0x4(%rbp)

sscanf組み立ての仕組みを教えてください。引数の数が格納されていると確信して%eaxいます....入力を逆の順序でスタックにプッシュしますか?したがって、私の入力が0 1sscanfを実行した後、%eax= 2であり、スタックが次のようになっているとします。

1
0  <----%rsp (top of the stack)

これは正しいです?ありがとう!

4

2 に答える 2

4

通常どおり、プラットフォームの呼び出し規約に従います。32ビットLinuxはデフォルトでcdeclを使用します。これにより、すべての引数を逆の順序でスタックにプッシュできます。64ビットLinuxは、System V AMD64 ABI規則を使用します。これはRDI、整数とアドレスに、、、、、を使用しRSI、浮動小数点引数にXMMレジスタを使用します(余剰引数はスタックに格納されます)。RDXRCXR8R9

引数の数はどこにもプッシュされません。AFAIKsscanfは、これをフォーマット文字列から決定します(ただし、修正できてうれしいです)。System V AMD64 ABI(64ビット)は、AL使用されるXMMレジスタの数(0から8)を格納するために使用されることを指定しますが、浮動小数点引数にのみ適用されます(これは引数であってはなりませんsscanf)。

于 2012-10-27T05:59:05.097 に答える
1

sscanf引数として、スキャンする文字列、フォーマット文字列、およびスキャンの結果を格納する変数へのポインタを取ります。したがって、スキャンが成功したと仮定すると、0と1の数値は対応する変数に格納されます。

EAX戻り値が含まれます。関数ファミリーは、*scanf正常にスキャンされた要素の数を返すため、スキャンが成功したかどうか、およびスキャンがどの程度成功したかを知ることができます。

于 2012-10-27T11:19:13.243 に答える