我试着编写一个像这样的简单测试代码(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)