标签:

int func(int a, int b, int c, int d)
{
return 1;
}
int main()
{
int i = 1, j = 2;
func(i, j, 3, 4);
return 0;
}
使用arm-linux-gcc编译后,使用ida打开:
.text:000083D0 EXPORT main
.text:000083D0 main ; DATA XREF: .text:000082C4o
.text:000083D0 ; .text:off_82DCo
.text:000083D0
.text:000083D0 b = -0x14
.text:000083D0 a = -0x10
.text:000083D0
.text:000083D0 IP = R12
.text:000083D0 FP = R11
.text:000083D0 MOV IP, SP
.text:000083D4 STMFD SP!, {FP,IP,LR,PC}
.text:000083D8 SUB FP, IP, #4
.text:000083DC SUB SP, SP, #8
.text:000083E0 MOV R3, #1
.text:000083E4 STR R3, [FP,#a]
.text:000083E8 MOV R3, #2
.text:000083EC STR R3, [FP,#b]
.text:000083F0 LDR R0, [FP,#a]
.text:000083F4 LDR R1, [FP,#b]
.text:000083F8 MOV R2, #3
.text:000083FC MOV R3, #4
.text:00008400 BL func
.text:00008404 MOV R3, #0
.text:00008408 MOV R0, R3
.text:0000840C SUB SP, FP, #0xC
.text:00008410 LDMFD SP, {FP,SP,PC}
.text:00008410 ; End of function main
可以发现,在main函数中,使用IP(R12)暂时保存栈指针sp,然后使用堆栈操作指令stmfd将栈帧(FP)、IP、程序返回地址(LR)、程序计数器(PC)压栈,以保护现场,然后使用sub fp,ip,#4使fp指向当前函数栈帧的栈底,sub sp,sp,#8,为当前函数局部变量分配看空间。接下来通过寄存器传递参数r1,r2,r3,r4。使用BL指令调用函数,BL指令同时也会将当前指令的下一条指令地址赋给LR,以跳转回来。最后使用ldmfd恢复现场。
.text:000083A0 ; =============== S U B R O U T I N E =======================================
.text:000083A0
.text:000083A0 ; Attributes: bp-based frame
.text:000083A0
.text:000083A0 EXPORT func
.text:000083A0 func ; CODE XREF: main+30p
.text:000083A0
.text:000083A0 var_1C = -0x1C
.text:000083A0 var_18 = -0x18
.text:000083A0 var_14 = -0x14
.text:000083A0 var_10 = -0x10
.text:000083A0
.text:000083A0 MOV R12, SP
.text:000083A4 STMFD SP!, {R11,R12,LR,PC}
.text:000083A8 SUB R11, R12, #4
.text:000083AC SUB SP, SP, #0x10
.text:000083B0 STR R0, [R11,#var_10]
.text:000083B4 STR R1, [R11,#var_14]
.text:000083B8 STR R2, [R11,#var_18]
.text:000083BC STR R3, [R11,#var_1C]
.text:000083C0 MOV R3, #1
.text:000083C4 MOV R0, R3
.text:000083C8 SUB SP, R11, #0xC
.text:000083CC LDMFD SP, {R11,SP,PC}
.text:000083CC ; End of function func
.text:000083CC
.text:000083D0
.text:000083D0 ; =============== S U B R O U T I N E =======================================
参考:
http://blog.chinaunix.net/uid-16459552-id-3364761.html
http://m.blog.csdn.net/blog/u011405813/41899197
标签:
原文地址:http://www.cnblogs.com/chyl411/p/4579053.html