2012-01-22 11 views
2

私はmainによって呼び出される関数を持っています。関数名がfunct1であるとします。 funct1read_inputという別の関数を呼び出します。x86アセンブリ関数

の質問だから、わずか数
push %rbp 
push %rbx 
sub $0x28, %rsp 
mov $rsp, %rsi 
callq 4014f0 read_input 
cmpl $0x0, (%rsp) 
jne (some terminating function) 

:この場合

  1. は、read_inputだけ %rbx 1つの引数を、持っていない、次のように

    は今でfunct1開始を想定しますか?

  2. さらに、スタックポインタが 0x28だけ減少している場合、これはサイズ0x28の文字列が スタックにプッシュされていることを意味しますか? (私はそれが文字列であることを知っています)。
  3. 関数を呼び出す前に mov %rsp, %rsiの意味は何ですか?
  4. 最後に、read_inputが返された場合、戻り値はどこに置かれますか?

ご質問ありがとうございます。私はx86を学び始めたばかりです。

+0

あなたのコードはどこから来ましたか? Cソースから生成しましたか? – Giorgio

+0

スタックポインタを小さくすると、ローカル変数がスタックに割り当てられている可能性があります。 – Giorgio

+0

4へ:read_inputの呼び出しに続く命令のスタックの先頭と0が比較されるため、戻り値がスタックにある可能性があります。 – Giorgio

答えて

3

あなたのコードはLinux/AMD ABIを使用しているようです。その文脈であなたの質問にお答えします。

  1. いいえ、rbxは、呼び出し先保存(不揮発性)レジスタです。あなたの関数は、呼び出し側の値を妨げないように関数を保存しています。表示されたコードでは復元されていませんが、これは関数全体を表示していないためです。この機能にがさらにの場合、後でこのルーチンでrbxが使用されているからだと思います。
  2. はい、0x28バイトのデータの領域がスタック上に作成されています。 read_inputがパラメータとして文字列を取っているとすれば、あなたの説明は合理的です。しかし、必ずしも正確ではありません。そのデータのいくつかは、read_inputに渡すために割り当てられたバッファだけでなく、他のローカル変数に使用されることがあります。
  3. この命令は、新しく割り当てられたスタックバッファへのポインタをrsiに入れています。 rsiは、AMD x64呼び出し規約の2番目のパラメータ・レジスタです。つまり、最初のパラメータがに渡されても、この関数は、新しいスタックバッファへのポインタとともに、read_inputと呼ぶことになります。
  4. rax
  5. に、それは大きなだ場合、それはrax & rdxに、64ビットの値以下かどう。浮動小数点の場合は、xmm0,ymm0、またはst(0)になります。あなたはおそらく、あなたの呼び出し規約の説明を見て、このようなものを扱うべきでしょう - this linkという素晴らしいPDFファイルがあります。表4を参照してください。
関連する問題