C到程序集转换数据类型大小
根据这篇文章: 在这个c简单程序中:C到程序集转换数据类型大小,c,assembly,C,Assembly,根据这篇文章: 在这个c简单程序中: void function(int a, int b, int c) { char x[10]; } void main() { function(1, 2, 3); } 我使用以下命令获取程序集文件: gcc -m32 -S -o example1.s example1.c 这就是函数的结果(函数): 我的问题是为什么这一行变成: subl $16, %esp 在我预期的情况下: subl $10, %e
void function(int a, int b, int c) {
char x[10];
}
void main() {
function(1, 2, 3);
}
我使用以下命令获取程序集文件:
gcc -m32 -S -o example1.s example1.c
这就是函数的结果(函数):
我的问题是为什么这一行变成:
subl $16, %esp
在我预期的情况下:
subl $10, %esp
我使用kali linux 64
供应商id:GenuineIntel
型号名称:Intel(R)Core(TM)i3 CPU M 350@2.27GHz
架构:x86_64
CPU操作模式:32位、64位
字节顺序:Little Endian这实际上是堆栈对齐 从手册中: -mpc堆栈边界=num 尝试使堆栈边界与提升为num字节的2边界对齐。如果未指定-mprefered stack boundary,则默认值为4(16字节或128位) GCC正在对齐堆栈的底部,使其位于16字节边界上 实际布局为:
x[9]
...
x[0]
padding[5]
...
padding[0] <-- $esp
x[9]
...
x[0]
填充[5]
...
填充[0]它可能是经过优化的,所以应该是subl$12,%esp
而不是subl$16,%esp
?你从哪里得到12?2^4等于16。如果你尝试分配17个字节,你会得到subl$32,%esp
。thanx Stebalien,我得到了!
x[9]
...
x[0]
padding[5]
...
padding[0] <-- $esp