printf函数中汇编语言的额外步骤

时间:2013-10-21 06:11:31

标签: assembly stack

原始代码:

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()

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

1 个答案:

答案 0 :(得分:1)

x86架构没有mov指令(除了movs但这里没有关系)可以从内存复制到内存,这就是代码使用寄存器临时存储参数的原因它们被复制到堆栈中。

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