gpt4 book ai didi

c - ARM - 为什么 gcc 为单个字符分配 12 个字节?

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:41 26 4
gpt4 key购买 nike

我有以下代码:

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 所需的单字节更多的空间。但是,我原以为它会分配 4 个字节来为 a 和 3 个填充字节腾出空间。

看起来它正在分配 4 个字节来使插入的 r7 对齐,然后分配另外 8 个字节(1 个用于 a,7 个用于填充)。如果我改为定义一个 9 成员字符数组,它将分配 20 个字节。

为什么压入的 r7 需要自己的 padding?

最佳答案

在 C/C++ 中,在 32/64 位机器上,8 位或 16 位参数作为 32 位参数传递(在某些 64 位机器上可能是 64 位参数)。然后被调用的函数只使用 32 位参数的低 8 位或 16 位。一些(或大多数)32/64 位处理器没有或不使用压入字节或压入短栈操作。如果使用快速调用 API,那么前几个参数将使用 32 位或 64 位寄存器。

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

关于c - ARM - 为什么 gcc 为单个字符分配 12 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34186412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com