gpt4 book ai didi

c - 为什么gcc在arm汇编中分配了更多的堆栈?

转载 作者:行者123 更新时间:2023-11-30 16:49:20 25 4
gpt4 key购买 nike

我正在尝试读取用 ARM 汇编语言编写的 gcc 的输出。
以下输出对我来说似乎很奇怪。

int succ (int *arr)
{
return arr[0] + 1;
}

int main (int argc)
{
int a[1] = { argc };
return succ (a);
}

通过编译命令gcc -fno-inline -O2 -S ,生成如下汇编程序。我省略了关于 succ 的输出因为它与我的问题无关(只是为了停止消除未使用的变量 a )。

    .global main
.type main, %function
main:
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
str lr, [sp, #-4]!
sub sp, sp, #12
add r3, sp, #8
str r0, [r3, #-4]!
mov r0, r3
bl succ
add sp, sp, #12
@ sp needed
ldr pc, [sp], #4
.size main, .-main

这个main函数似乎为本地数组分配了3个字节a (子 sp,sp,#12)。但我的 C 程序只为 a 分配 int 的一个元素.
其他时间值似乎不使用堆栈。为什么这个程序需要比我预期更多的堆栈量?

我的gcc版本是4.8.5。我在 rasberry-pi 3 中尝试了 raspbian。

已更新
当我修改数组a的长度时更改为 2 ( int a[2} = {argc, argc} ),音量不变(仅 3 个字节)。
对于长度 3 ( int a[3} = {argc, argc, argc} ),在堆栈中分配 5 个字节。

我很好奇。

最佳答案

前几天我也看到了类似的事情。我怀疑发生的事情是它已将 lr 放入堆栈中。它需要将其与 64 位边界对齐,因此堆栈上还需要 4 个字节。然后,a 需要 4 个字节,并且需要对齐,因此在堆栈上添加 4 个字节,但没有意识到 lr 加上 a 就是它们需要分配的全部。

我必须看看我是否可以以与您引起的方式不同的方式重现此问题。

关于c - 为什么gcc在arm汇编中分配了更多的堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42617047/

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