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

根据这篇文章:

在这个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, %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