C到程序集转换数据类型大小

时间:2015-10-16 19:55:59

标签: c assembly

根据这篇文章:link

在这个简单的程序中:

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

,这是函数(函数)的结果:

function:
.LFB0:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        subl    $16, %esp
        nop
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc

我的问题是为什么这条线变成了:

subl    $16, %esp

我希望它是:

subl    $10, %esp

我使用kali linux 64

vendor_id:GenuineIntel

型号名称:Intel(R)Core(TM)i3 CPU M 350 @ 2.27GHz

架构:x86_64

CPU操作模式:32位,64位

字节顺序:Little Endian

1 个答案:

答案 0 :(得分:2)

这实际上是堆栈对齐。

来自gcc(1)手册:

  

-mpreferred堆栈边界= NUM​​

     

尝试保持堆栈边界对齐2到num字节边界。如果未指定-mpreferred-stack-boundary,则默认值为4(16字节或128位)。

GCC正在对齐堆栈的基础,使其位于16字节边界上。

实际布局是:

x[9]
...
x[0]
padding[5]
...
padding[0] <-- $esp