元のコード:
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 つのレジスタを使用する代わりに、単にメモリからこれらの値を取得して直接スタックに保持できないのはなぜですか?