Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 最小堆栈帧大小_Linux_Assembly_Stack_I386 - Fatal编程技术网

Linux 最小堆栈帧大小

Linux 最小堆栈帧大小,linux,assembly,stack,i386,Linux,Assembly,Stack,I386,我目前正在做的捕获旗帜事件的条纹你应该检查出来,如果你还没有看到它。该事件要求您经常查看反汇编的可执行文件,而我对asm的了解已经不多了 我一直看到常量0x18显示为某种最小堆栈大小。例如,在分配char[1024]数组并调用函数strcpy的函数中,程序集如下所示: 8048484: 55 push %ebp 8048485: 89 e5 mov %esp,%ebp 8048487: 81

我目前正在做的捕获旗帜事件的条纹你应该检查出来,如果你还没有看到它。该事件要求您经常查看反汇编的可执行文件,而我对asm的了解已经不多了

我一直看到常量0x18显示为某种最小堆栈大小。例如,在分配char[1024]数组并调用函数strcpy的函数中,程序集如下所示:

8048484:    55                      push   %ebp
8048485:    89 e5                   mov    %esp,%ebp
8048487:    81 ec 18 04 00 00       sub    $0x418,%esp
804848d:    8b 45 08                mov    0x8(%ebp),%eax
8048490:    89 44 24 04             mov    %eax,0x4(%esp)
8048494:    8d 85 f8 fb ff ff       lea    -0x408(%ebp),%eax
804849a:    89 04 24                mov    %eax,(%esp)
804849d:    e8 e6 fe ff ff          call   8048388 <strcpy@plt>
80484a2:    c9                      leave  
80484a3:    c3                      ret

为什么需要额外的空间?

编译器正在强制执行16字节对齐。啊,这很有意义。谢谢。等等,那不是必须是0x420吗?0x418不能被16整除。在函数调用之前,堆栈是16字节对齐的。执行呼叫时,将推送一个4字节的返回地址。被调用函数所做的第一件事是将ebp再推4个字节。因此,编译器必须减去8来对齐它,再加上16的倍数来对齐所使用的任何数据。