原始代码:
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
然后将这两个值放在堆栈顶部以进行标准过程调用,即调用 printf()
我的问题是为什么这两个额外的步骤?为什么它不能简单地从内存中获取这些值并将其直接保存在堆栈中而不是使用两个寄存器?