【发布时间】:2021-12-20 05:14:55
【问题描述】:
这是我的源代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 500
int main(int argc, char** argv)
{
if (argc != 2)
exit(1);
char str[MAX];
strcpy(str, argv[1]);
return 0;
}
我 disassembled main 使用 gdb 并得到以下结果:
Dump of assembler code for function main:
0x0000000000001145 <+0>: push %rbp
0x0000000000001146 <+1>: mov %rsp,%rbp
0x0000000000001149 <+4>: sub $0x210,%rsp
.
.
.
End of assembler dump.
这里值得注意的是:
0x0000000000001149 <+4>: sub $0x210,%rsp
我的问题是-
为什么有$0x210(528 字节),而应该是$0x1f4(500 字节)?
【问题讨论】:
-
什么编译器,什么优化选项?
-
@NateEldredge 这是
gcc (Debian 10.2.1-6) 10.2.1 20210110,默认设置。 -
尝试使用
#define MAX 100并注意sub $0xXXX,%rsp是否低于400。这提供了有关填充以及需要多少 base 内存的见解,即使MAX理论上为零。 -
@chux-ReinstateMonica 是的,最近我在考虑填充(松弛字节)。顺便说一句,输出:
0x0000000000001149 <+4>: add $0xffffffffffffff80,%rsp -
@NateEldredge 定义
MAX 0给了我这个汇编代码:0x0000000000001149 <+4>: sub $0x10,%rsp,即 16 字节的缓冲区。正如@chux-ReinstateMonica 所说。
标签: c assembly x86-64 stack-memory