gpt4 book ai didi

gcc - 为什么使用 arm-linux-gnueabi-gcc 编译时堆栈指针比堆栈帧大小向下移动 4 个字节?

转载 作者:行者123 更新时间:2023-12-04 14:33:04 24 4
gpt4 key购买 nike

以下面简单的 C 程序为例。 main() 函数调用 sum 传入 4 个整数。 sum() 使用 4 个本地人。

void sum(int a, int b, int c, int d);

void main(void)
{
sum(11, 12, 13, 14);
}

void sum(int a, int b, int c, int d)
{
int x;
int y;
int z;
int z2;

x = a;
y = b;
z = c;
z2 = d;
}

在我的 Ubuntu 服务器 12.04.04 LTS 上,我使用

arm-linux-gnueabi-gcc -S -mthumb func.c
sum:
@ args = 0, pretend = 0, frame = 32
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
push {r7}
sub sp, sp, #36 <=== why is this 36 and not 32 bytes?
add r7, sp, #0

str r0, [r7, #12]
str r1, [r7, #8]
str r2, [r7, #4]
str r3, [r7, #0] <- paramaters passed

ldr r3, [r7, #12]
str r3, [r7, #16] <- locals
ldr r3, [r7, #8]
str r3, [r7, #20]
ldr r3, [r7, #4]
str r3, [r7, #24]
ldr r3, [r7, #0]
str r3, [r7, #28]

add r7, r7, #36
mov sp, r7
pop {r7}
bx lr

看起来 int 每个都是 4 个字节。该函数的 4 个局部变量和 4 个参数总计为 (4 *4 字节) + (4 * 4 字节) = 32 字节,这与程序集输出“frame = 32”相匹配。

但是为什么堆栈指针会减少 36 而不仅仅是 32?

最佳答案

ARM 的过程调用标准需要 8 字节对齐。

5.2.1.2 Stack constraints at a public interface

The stack must also conform to the following constraint at a public interface:

  • SP mod 8 = 0. The stack must be double-word aligned.

由于您正在生产程序集,因此默认情况下会导出所有内容,因此您将获得 8 字节对齐。 (我试过这个并且 gcc 在生成程序集时没有向静态函数添加 .global <symbol> 指令。我猜这表明即使是静态函数也是公共(public)接口(interface),或者 gcc 只是将每个函数对齐为 8 字节堆栈对齐。)
You can use -fomit-frame-pointer跳过推送 r7那么 gcc 应该将堆栈深度保留为 32。

关于gcc - 为什么使用 arm-linux-gnueabi-gcc 编译时堆栈指针比堆栈帧大小向下移动 4 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22279911/

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