【问题标题】:extra steps in printf function in assembly language汇编语言中 printf 函数的额外步骤
【发布时间】:2013-10-21 06:11:30
【问题描述】:

原代码:

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

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

【问题讨论】:

  • 如果您在打开所有优化的情况下进行编译(假设您还没有),程序集是否会有很大不同?

标签: assembly stack


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2020-09-24
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多