原始代码:
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()
我的问题是为什么这两个额外的步骤?为什么不能简单地从内存中获取这些值并将其直接保存在堆栈中而不是使用两个寄存器?
答案 0 :(得分:1)
x86架构没有mov
指令(除了movs
但这里没有关系)可以从内存复制到内存,这就是代码使用寄存器临时存储参数的原因它们被复制到堆栈中。
请注意,push
可以与内存操作数一起使用,但可能已经调整了堆栈指针以为参数分配空间。