x64-Assembly:尽管存储在寄存器中,但在Stack中分配参数

时间:2015-09-24 17:54:39

标签: c++ c assembly 64-bit

我目前正在阅读一本关于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 }

当我调试gdbdisassemble 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行开始,参数以相反的顺序存储,但它们存储在堆栈中的中,您可以在那里看到。

那么为什么会为堆栈中的参数分配内存,尽管它们没有存储在堆栈中?

顺便说一下,问题:

  • 在第28行,您可以看到int a, int b, int c指令。为什么?我认为mov需要一个大小后缀。
  • 是否可以调整gdb,我看到直接值的十进制数,而不是十六进制数?

0 个答案:

没有答案