我有以下代码:
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需要自己的填充?
答案 0 :(得分:1)
在C / C ++中,在32/64位机器上,8位或16位参数作为32位参数传递(在某些64位机器上可能为64位)。然后,被调用的函数仅使用32位参数的低8位或16位。一些(或大多数)32/64位处理器不具有或使用推送字节或推送短路来进行堆栈操作。如果使用快速调用API,则前几个参数将使用32位或64位寄存器。
示例汇编代码可能正在将堆栈对齐到16字节边界,或者它可能正在为局部变量或调试器使用堆栈执行默认分配。