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