自己写了一个简单的代码
[mw_shl_code=c,true]#include<stdio.h>
int main()
{
printf("world");
printf("hello ");
return 0;
}[/mw_shl_code]反汇编后如下
[mw_shl_code=asm,true]; int __cdecl main(int argc, const char **argv, const char **envp)
EXPORT main
main
STMFD SP!, {R11,LR}
ADD R11, SP, #4
LDR R0, =aWorld ; "world"
BL printf
LDR R0, =aHello ; "hello "
BL printf
MOV R3, #0
MOV R0, R3
LDMFD SP!, {R11,PC}
; End of function main[/mw_shl_code]
现在开始分析
[mw_shl_code=asm,true]STMFD SP!, {R11,LR}[/mw_shl_code]
从右往左压入堆栈中,也就是当前的sp和之前的sp相比 降低了8个字节
sp=sp-8
[mw_shl_code=asm,true]ADD R11, SP, #4[/mw_shl_code]
这句话 让R11 指向LR
[mw_shl_code=asm,true]MOV R3, #0
MOV R0, R3[/mw_shl_code]
这二句其实等于
[mw_shl_code=asm,true]MOV R0, #0[/mw_shl_code]
返回值
[mw_shl_code=asm,true]LDMFD SP!, {R11,PC}[/mw_shl_code]
这句记住 是恢复上我们降低sp的8字节
他是从左边往右弹
所以 R11恢复了
PC 等于LR
有问题一起交流学习啊
|