我编译 c 代码来武装这个网站https://godbolt.org/
int F(int a, int b)
{
int c=0;
for(int i=0;i<=10;i++)
{
c+=a+b;
}
return c;
}
结果是
F(int, int):
str fp, [sp, #-4]!
add fp, sp, #0
sub sp, sp, #20
str r0, [fp, #-16]
str r1, [fp, #-20]
mov r3, #0
str r3, [fp, #-8]
mov r3, #0
str r3, [fp, #-12]
.L3:
ldr r3, [fp, #-12]
cmp r3, #10
bgt .L2
ldr r2, [fp, #-16]
ldr r3, [fp, #-20]
add r3, r2, r3
ldr r2, [fp, #-8]
add r3, r2, r3
str r3, [fp, #-8]
ldr r3, [fp, #-12]
add r3, r3, #1
str r3, [fp, #-12]
b .L3
.L2:
ldr r3, [fp, #-8]
mov r0, r3
sub sp, fp, #0
ldr fp, [sp], #4
bx lr
我在这里看到参数在堆栈上移动而不是通过寄存器移动。
我有 3 行我不明白
add fp, sp, #0
sub sp, sp, #20
str r0, [fp, #-16]
- 为什么 fp 得到值= 0?我读过 fp 但我不确定我是否理解它。
- 为什么sp降到20?我知道通常为本地 var 保存 plav,但为什么是 20?
- 为什么
str r0, [fp, #-16]
我不明白
顺便说一句,为什么她的参数在堆栈中而不是在寄存器上传递?谢谢你们