发新帖

ARM初试牛刀一

[复制链接]
6890 2
自己写了一个简单的代码
[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
有问题一起交流学习啊

举报 使用道具

回复

精彩评论2

uilukmyn    发表于 2016-9-11 15:39:03 | 显示全部楼层
什么环境?

举报 使用道具

回复
cs1225    发表于 2016-9-17 11:17:31 | 显示全部楼层
从右往左压入堆栈中,也就是当前的sp和之前的sp相比 降低了8个字节
sp=sp-8

这个能细说吗?看不懂

举报 使用道具

回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表