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

然后将这两个值放在堆栈顶部以进行标准过程调用,即调用 printf()

我的问题是为什么这两个额外的步骤?为什么它不能简单地从内存中获取这些值并将其直接保存在堆栈中而不是使用两个寄存器?

4

1 回答 1

1

x86 体系结构没有可以从内存复制到内存的mov指令(除了movs但与此处无关),这就是代码在将参数复制到堆栈时使用寄存器临时存储参数的原因。

请注意,它push可以与内存操作数一起使用,但大概堆栈指针已经调整为为参数分配空间。

于 2013-10-21T10:01:51.563 回答