我的问题是:MIPS如何在栈上使用帧指针FP?我不太明白指针FP如何与指针SP一起工作。
我的问题是:MIPS如何在栈上使用帧指针FP?我不太明白指针FP如何与指针SP一起工作。
extern unsigned int more_fun ( unsigned int );
unsigned int fun ( unsigned int a, unsigned int b )
{
unsigned int c;
c = a + more_fun(b);
return(c);
}
Mips和ARM等处理器都不需要/不想使用帧指针,你可以全部使用堆栈指针来完成操作。当指令集没有堆栈相对寻址、寄存器数量有限等情况时,这非常有帮助。
在Mips上,以上代码的好或坏示例可能如下所示:
00000000 <fun>:
0: 27bdffe8 addiu sp,sp,-24
4: afb00010 sw s0,16(sp)
8: 00808021 move s0,a0
c: afbf0014 sw ra,20(sp)
10: 0c000000 jal 0 <fun>
14: 00a02021 move a0,a1
18: 8fbf0014 lw ra,20(sp)
1c: 00501021 addu v0,v0,s0
20: 8fb00010 lw s0,16(sp)
24: 03e00008 jr ra
28: 27bd0018 addiu sp,sp,24
堆栈帧被设置,但它使用堆栈指针,堆栈指针用于寻址堆栈以查找函数局部信息。
ARM甚至不需要使用堆栈来存储这些本地项。
00000000 <fun>:
0: e92d4010 push {r4, lr}
4: e1a04000 mov r4, r0
8: e1a00001 mov r0, r1
c: ebfffffe bl 0 <more_fun>
10: e0800004 add r0, r0, r4
14: e8bd4010 pop {r4, lr}
18: e12fff1e bx lr
lr必须被保存用于嵌套调用,r4只是被保存因为调用约定要求在64位边界上保持堆栈对齐,所以这个编译器选择使用了r4,任何寄存器都可以被使用(除了lr、pc或sp)。
现在这里有一个使用帧指针的例子。
00000000 <_fun>:
0: 1166 mov r5, -(sp)
2: 1185 mov sp, r5
4: 1d66 0006 mov 6(r5), -(sp)
8: 09f7 fff4 jsr pc, 0 <_fun>
c: 6d40 0004 add 4(r5), r0
10: 1585 mov (sp)+, r5
12: 0087 rts pc
00000000 <_fun>:
0: 1166 mov r5, -(sp)
2: 1185 mov sp, r5
4: 65c6 fffe add $-2, sp
8: 1d66 0006 mov 6(r5), -(sp)
c: 09f7 fff0 jsr pc, 0 <_fun>
10: 65c6 0002 add $2, sp
14: 1d41 0004 mov 4(r5), r1
18: 6001 add r0, r1
1a: 1075 fffe mov r1, -2(r5)
1e: 1d40 fffe mov -2(r5), r0
22: 1146 mov r5, sp
24: 1585 mov (sp)+, r5
26: 0087 rts pc