自己写了一个简单的代码
[C] 纯文本查看 复制代码 #include<stdio.h>
int main()
{
printf("world");
printf("hello ");
return 0;
} 反汇编后如下
[Asm] 纯文本查看 复制代码 ; 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
现在开始分析
[Asm] 纯文本查看 复制代码 STMFD SP!, {R11,LR}
从右往左压入堆栈中,也就是当前的sp和之前的sp相比 降低了8个字节
sp=sp-8
[Asm] 纯文本查看 复制代码 ADD R11, SP, #4
这句话 让R11 指向LR
[Asm] 纯文本查看 复制代码 MOV R3, #0
MOV R0, R3
这二句其实等于
[Asm] 纯文本查看 复制代码 MOV R0, #0
返回值
[Asm] 纯文本查看 复制代码 LDMFD SP!, {R11,PC}
这句记住 是恢复上我们降低sp的8字节
他是从左边往右弹
所以 R11恢复了
PC 等于LR
有问题一起交流学习啊
|