0

元のコード:

void main()
{
    int x = 1;
    printf("%d\n", x);
}

対応するアセンブリ コードは次のとおりです。

   |0x80483f5 <main+17>     mov    $0x80484e0,%eax
   │0x80483fa <main+22>     mov    0x1c(%esp),%edx
   │0x80483fe <main+26>     mov    %edx,0x4(%esp)
   │0x8048402 <main+30>     mov    %eax,(%esp)
   │0x8048405 <main+33>     call   0x8048300 <printf@plt>

It first moves the string "%d\n" in %eax          ---->Extra Step
Then it moves the value of 0x1c(%esp) in %edx     ---->Extra Step

次に、これら 2 つの値は、標準のプロシージャ コール、つまり printf() の呼び出しのためにスタックの一番上に配置されます。

私の質問は、なぜ2つの余分なステップがあるのですか? 2 つのレジスタを使用する代わりに、単にメモリからこれらの値を取得して直接スタックに保持できないのはなぜですか?

4

1 に答える 1

1

x86 アーキテクチャには、メモリからメモリにコピーできるmov命令 (ただし、ここでは関係ありません) がありません。そのため、コードはレジスタを使用して、引数がスタックにコピーされている間に引数を一時的に格納します。movs

メモリ オペランドで使用できることに注意してください。ただしpush、おそらくスタック ポインターは、引数にスペースを割り当てるために既に調整されています。

于 2013-10-21T10:01:51.563 に答える