小编Ala*_*lan的帖子

为什么ARM gcc在函数开头将r3和lr寄存器写入堆栈?

我试着编写一个像这样的简单测试代码(main.c):

main.c
void test(){
}
void main(){
    test();
}
Run Code Online (Sandbox Code Playgroud)

然后我使用arm-non-eabi-gcc编译和objdump来获取汇编代码:

arm-none-eabi-gcc -g -fno-defer-pop -fomit-frame-pointer -c main.c
arm-none-eabi-objdump -S main.o > output
Run Code Online (Sandbox Code Playgroud)

汇编代码将推送r3和lr寄存器,即使函数什么也没做.

main.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <test>:
void test(){
}
   0:   e12fff1e        bx      lr

00000004 <main>:
void main(){
   4:   e92d4008        push    {r3, lr}
        test();
   8:   ebfffffe        bl      0 <test>
}
   c:   e8bd4008        pop     {r3, lr}
  10:   e12fff1e        bx      lr
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么arm gcc选择将r3推入堆栈,甚至test()函数从不使用它?gcc只是随机选择1个寄存器来推送吗?如果它是堆栈对齐(ARM的8个字节)要求,为什么不只是减去sp?谢谢.

==================更新==========================

@KemyLand为了您的答案,我有另一个例子:源代码是:

void test1(){
}
void test(int i){
        test1();
}
void main(){
        test(1);
} …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc arm

7
推荐指数
1
解决办法
2141
查看次数

标签 统计

arm ×1

assembly ×1

c ×1

gcc ×1