ARM - 为什么gcc为一个char分配12个字节?

时间:2015-12-09 18:31:18

标签: c assembly stack arm

我有以下代码:

int main()
{
    volatile char a;

    return 0;
}

当我用arm-linux-gnueabihf-gcc -o align.txt -O0 -S align.c反汇编时,我得到以下内容:

push    {r7}
sub sp, sp, #12
...

现在,我知道ARM EABI要求堆栈为8字节对齐,这可以解释gcc分配的空间比a所需的单个字节多一些。但是,我认为它会为a和3个填充字节分配4个字节。

看起来它分配了4个字节来使推送的r7对齐,然后是另外8个(a为1,填充为7)。如果我改为定义一个9个成员的char数组,它将分配20个字节。

为什么推送的r7需要自己的填充?

1 个答案:

答案 0 :(得分:1)

在C / C ++中,在32/64位机器上,8位或16位参数作为32位参数传递(在某些64位机器上可能为64位)。然后,被调用的函数仅使用32位参数的低8位或16位。一些(或大多数)32/64位处理器不具有或使用推送字节或推送短路来进行堆栈操作。如果使用快速调用API,则前几个参数将使用32位或64位寄存器。

示例汇编代码可能正在将堆栈对齐到16字节边界,或者它可能正在为局部变量或调试器使用堆栈执行默认分配。