【发布时间】:2014-08-18 14:34:50
【问题描述】:
我试图了解如何在 C 中调用函数。当我反汇编这段代码时(gcc - gdb;我在 Linux 上使用 i5-3320M)以获得函数 toto 的序言:
void nop(){return ;}
void toto(int i, int j)
{
return;
}
int main(int argc, char **argv)
{
int i = 1;
int* pt;
i = 0;
}
我得到了序幕:
0x0000000000400523 <+0>: push %rbp
0x0000000000400524 <+1>: mov %rsp,%rbp
0x0000000000400527 <+4>: sub $0x8,%rsp
这里我不明白为什么rsp 减8,因为我没有在toto 中使用局部变量。此外,如果我确实使用局部变量:
void toto(int i, int j)
{
int i=1
return;
}
我得到以下序言:
0x0000000000400523 <+0>: push %rbp
0x0000000000400524 <+1>: mov %rsp,%rbp
0x0000000000400527 <+4>: sub $0x18,%rsp
这里我不明白为什么rsp 会减少 0x18(24 字节)。我希望有 16 个字节,因为我已经有了一个 8 的神秘偏移量,而且我需要 4 个字节用于 int。但是我的架构是 64 位的,栈中的一个字不能少于 8 个字节所以 8+8 = 16。
【问题讨论】:
-
sub 8很明显,因为在调用函数之前有两个 4 字节变量被压入堆栈(函数参数i和j)。 -
@barakmanos:不!在 64 位模式下,第一个参数在寄存器中传递。
-
@GerardBouchar:我无法复制您的程序集(Debian Wheezy 的 GCC 4.7.2-5)。请发布您的步骤以获取该程序集(完整的命令行)。
标签: c assembly disassembly function-calls