0

私はこのアセンブリコードを持っています、そしてそれがすることは関数を使って印刷することだと思いprintfます。私はCにあまり詳しくありませんが、main関数を作成しprintf("%d, %d", x, y)、xとyが両方ともゼロであるところを印刷しました。

Cコードをアセンブリに変換しましたが、まったく異なるものが得られました。以下のアセンブリコードが何をするのかを誰かが理解するのを手伝ってもらえますか?

            mov    %edx,0x8(%esp)
            mov    %eax,0x4(%esp)
            movl   $0x80486a0,(%esp)
            call   8048360 <printf@plt>
4

3 に答える 3

6

あなたのアセンブリの非常に直訳として、

mov    %edx,0x8(%esp)

edxの値をオフセット8(esp + 8)のスタックに移動します

mov    %eax,0x4(%esp)

eaxの値をオフセット4(esp + 4)のスタックに移動します

movl   $0x80486a0,(%esp)

[32ビット値]0x80486a0をオフセット0のスタックに移動します

これは、関数への引数がスタックに配置される非常に基本的な方法です(RTLまたはCの順序)。最小のオフセットの値が最初の引数(この場合、メモリ内の文字列リテラルのアドレス)であり、最大のオフセットの値が最後の引数です。

電話に出たとき:

call   8048360 <printf@plt>

プログラムは指定されたアドレス(逆アセンブラがprintf関数として識別したアドレス)にジャンプし、スタックから値を読み取り、印刷操作を実行してからコードに戻り、呼び出し後の次の命令で操作を再開します。

あなたの情報源は次のようになっていると思います。

void main()
{
    int x =0, y=0;
    printf("%d, %d", x, y);
}

OS /コンパイラによっては、起動時にeaxとedxの値が0になることが保証されている場合があります。または、スニペットから初期化コードが欠落している可能性があります。

于 2012-09-30T04:01:12.257 に答える
4

見た目からすると、これはスタックに3つのパラメーター(とからの2つのint、edxおよびeaxアドレスのように見えるもの)を配置します。おそらく、文字列リテラル(つまり、フォーマット文字列)を格納するために選択したアドレスです。その後、を呼び出しますprintf

つまり、結論としては、質問で指定したソースコードの非常に単純な実装のように見えるということです。

于 2012-09-30T03:51:13.770 に答える
1

mov %edx,0x8(%esp):edxの値をスタックポインタ(0x8オフセット)に移動しています。
mov %eax,0x4(%esp):上記を参照してください。
movl $0x80486a0,(%esp):スタックポインタにアドレス0x80486a0をロードしています。
call 8048360 <printf@plt>:関数printfを呼び出しています。

于 2012-09-30T04:02:35.717 に答える