我是汇编的新手,我正试图通过反汇编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
感谢您的参考,对不起。我没有正确的关键字来成功搜索该问题。