我目前正在阅读一本关于C-Security的非常翔实且易于理解的书,目前有一章关于大会。 考虑以下C代码:
1 void funktion (int a, int b, int c)
2 {
3 int buff1[5];
4 char buff2[10];
5 buff1[0] = '6';
6 buff2[0] = 'A';
7 buff2[1] = 'B';
8 }
9
10 int main (void)
11 {
12 int i = 1;
13 funktion (1, 2, 3);
14 return 0;
15 }
当我调试gdb
和disassemble main
中的可执行文件时,我得到以下输出:
# -----------FUNC_PROLOG----------
24 0x00000000004004d4 <+0>: push %rbp
28 0x00000000004004d5 <+1>: mov %rsp,%rbp
33 0x00000000004004d8 <+4>: sub $0x10,%rsp
34
#----------FUNC_OPERATIONS----------
39 0x00000000004004dc <+8>: movl $0x1,-0x4(%rbp)
43 0x00000000004004e3 <+15>: mov $0x3,%edx
44 0x00000000004004e8 <+20>: mov $0x2,%esi
45 0x00000000004004ed <+25>: mov $0x1,%edi
我正在阅读的这本书是从2003开始的,所以我知道我的编辑与本书中的编辑看起来并不完全一样,所以我将这条指令(第33行)解释为当前堆栈框架的放大。在书中,有一个递减(=堆栈帧的放大)4个字节,我有一个16个字节的dec:我认为这是他们做的一个优化,所以本地var的大小({{1} } = 4个字节)+参数的大小(int i
= 12个字节)= 16 字节直接在堆栈中分配,而不是每次都推送堆栈,效率较低。然而,这可能是对我的误解,这与我的真实问题有关:
从第43-45行开始,参数以相反的顺序存储,但它们存储在堆栈中的,不中,您可以在那里看到。
那么为什么会为堆栈中的参数分配内存,尽管它们没有存储在堆栈中?
顺便说一下,问题:
int a, int b, int c
指令。为什么?我认为mov
需要一个大小后缀。