反汇编的C代码显示它从堆栈帧为指针参数而不是8个字节分配12个字节

时间:2014-11-06 15:47:28

标签: c assembly 64-bit disassembly objdump

我是汇编的新手,我正试图通过反汇编C代码来学习它。我理解基础知识,但有些事情一直困扰着我一段时间。

这是一个objdump的输出,在简单的C程序中使用了-S和-d选项。 C程序是在x64机器上使用gcc编译的。

00000000004004ac <main>:
#include<stdio.h>

int main(int argc, char *argv[]){
  4004ac:   55                      push   %rbp
  4004ad:   48 89 e5                mov    %rsp,%rbp
  4004b0:   89 7d fc                mov    %edi,-0x4(%rbp)
  4004b3:   48 89 75 f0             mov    %rsi,-0x10(%rbp)
    return 0;       
  4004b7:   b8 00 00 00 00          mov    $0x0,%eax
}

我添加了-S标志,因此可以看到C代码。

我觉得很奇怪
mov    %rsi,-0x10(%rbp)

语句。据我所知,语句mov%edi,-0x4(%rbp)表示它在堆栈顶部下方的前4个字节上复制了int argc的内容。我不明白为什么当C中指针的大小只有8个字节时,下一个语句为char **参数分配了12个字节。当我将一个int和一个指针作为参数传递给函数时,我注意到了这一点。似乎总是为指针分配12个字节而不是预期的8个字节。对此的解释将真正受到赞赏:)。谢谢。

修改

我是新手,我不知道如何以及从堆栈帧分配局部变量和参数的顺序。如果有人可以解释这个过程或提供我可以阅读的资源,那么我们将非常感激。

编辑2

感谢您的参考,对不起。我没有正确的关键字来成功搜索该问题。

0 个答案:

没有答案