arm汇编lr pc b bl ret指令函数调用和返回gif动图演示
文章目录
- pc 寄存器
- lr寄存器 (x30)
- ret返回指令
- bl 跳转指令,带返回
- b 跳转,不带返回
pc 寄存器
pc保存着当前指令执行的地址,相当于win32汇编里的eip寄存器
lr寄存器 (x30)
lr存储函数的返回地址,每次遇到ret返回指令,都会跳转到lr寄存器里保存的地址,这个地址是函数调用的下一条指令,就是应该要执行的指令,cpu遇到ret之后,会把lr赋值给pc,这样cpu了pc里的地址,就是执行函数调用的下一条指令
ret返回指令
作用是返回,
本质上的操作:执行ret之后,会把lr寄存器里的值赋值给pc,这样cpu就会执行到lr地址里的指令了.
bl 跳转指令,带返回
bl执行跳转之前,会把bl的下一条指令地址,赋值给lr,这样,跳转之后的lr就是跳转之前的下一条指令了.当执行到ret指令的时候,会把lr的值赋值给pc,这样就会跳回到bl的下一条指令.
b 跳转,不带返回
b跳转的时候因为没有给lr赋值,所以跳转之后,lr还是跳转之前的lr值,所以跳转之后遇到ret指令以后会跳转到b之前的 lr的地址.
下面用汇编写的fn1方法里面有b和bl 2种跳转,注释掉其中一种,得到不同的结果
//.h中的声明
void fn1(int *a);
oc中的调用,传入一个int类型的地址
//oc调用int a = 11;fn1(&a);NSLog(@"a=%d",a);
汇编中的函数实现
.text
.global _fn1
_fn1:
str wzr,[x0]
mov x10,lr//保存之前的lr值,这样可以返回到调用fn1()的位置
bl label1 //bl跳转到label1之前,会把lr赋值成下一条指令,这样.遇到label1的ret会返回到下面的指令mov w3,0x10
mov lr,x10 //还原之前的lr地址,这样能返回到调用fn1()的位置
mov w3,0x10
str w3,[x0]
ret
label1:
mov w3,0xf
str w3,[x0]
ret//这句执行完以后会把lr赋值给pc,因为lr已经被bl赋值了bl之后指令的地址,所以会跳转到上面的mov w3,0x10指令,这样,变量a就会赋值成了0x10,打印结果a=16
上面代码注释已经写了在执行到bl之后跳转到label1,然后给变量a赋值0xF,再返回到bl label1的下一条指令,再还原之前的lr值,这样再遇到ret的时候就返回到fn1(&a)的调用位置了
下面的gif图片,录制了这段代码的执行过程,其中re read lr 查看了lr的改变,包括执行完fn1之后a被赋值成了0x10 = 16
b 跳转以后不会改变lr的值,遇到ret以后就会返回之前的lr里的地址里的指令,如下图gif
.text
.global _fn1
_fn1:
str wzr,[x0]
mov x10,lr//保存之前的lr值,这样可以返回到调用fn1()的位置
b label1//b跳转到label1之后,lr没有被赋值,而是保持这之前的值,这样label1执行到遇到ret之后,就会返回到现在lr的值,就是调用_fn1的指令的下一条指令
mov lr,x10 //还原之前的lr地址,这样能返回到调用fn1()的位置
mov w3,0x10
str w3,[x0]
ret
label1:
mov w3,0xf
str w3,[x0]
ret
arm汇编lr pc b bl ret指令函数调用和返回gif动图演示相关推荐
- 大脸猫讲逆向之ARM汇编中PC寄存器详解
i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...
- 汇编 第十章 call和ret指令
第十章 call和ret指令 call和ret指令都是转移指令,它们都能修改ip,或同时修改cs和ip 10.1 ret和retf 1.ret指令用栈中的数据,修改ip的内容,从而实现[近转移]CPU ...
- 汇编中的call和ret指令
call和ret指令都是转移指令,它们都修改偏移地址或同时修改段地址和偏移地址.ret指令用栈中的数据,修改偏移地址,从而实现近转移.call可以通过位移和目的地址进行转移.下面来通过汇编代码学习一下 ...
- ARM汇编中ldr伪指令和ldr指令(转载)
转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...
- ARM中LDR B BX BL BLX指令的研究
原来的文章有点乱,所以稍微整理了一下有用的要点: (1) LDR作为伪指令的格式:LDR 寄存器, = 数字常量/Label 如:LDR R2,=0x55aa ; 表示将0x55aa送入寄存器R ...
- ARM 汇编指令集4 协处理器和协处理器指令详解
一.什么是协处理器 SoC 内部另一处理核心,协助主 CPU 实现某些功能,被主 CPU 调用执行一定任务. ARM 设计上支持多达 16 个协处理器,但是一般 SoC 只实现其中的 CP15.( c ...
- 汇编指令mrs_(转)ARM汇编学习笔记——MRS和MSR指令
MRS,状态寄存器传送至通用寄存器类指令 功能:将状态寄存器的内容传送至通用寄存器. 格式: MRS{}Rd,CPSR}SPSR 其中: Rd 目标寄存器,Rd不允许R15. R=0 将CPSR中 ...
- 汇编指令msr_(转)ARM汇编学习笔记——MRS和MSR指令
MRS,状态寄存器传送至通用寄存器类指令 功能:将状态寄存器的内容传送至通用寄存器. 格式: MRS{}Rd,CPSR}SPSR 其中: Rd 目标寄存器,Rd不允许R15. R=0 将CPSR中 ...
- 我去,这几个Linux指令太装B了|动图展示
1. sl 先看一下呼啸而过的火车:安装指令如下: sduo apt-get install sl 执行结果如下: 2. htop 图形化Linux系统性能监测工具,屌不屌: 安装指令如下: sduo ...
最新文章
- 可疑文件_如何识别文件的真假
- Python多进程multiprocessing共享数据Value(包括常用的整数、字符串)、列表及字典以及Queue
- 【Linux】一步一步学Linux——tail命令(42)
- url传递html字符串,将Selenium HTML字符串传递给Scrapy以将url添加到Scrapy的url列表中...
- 批处理--创建当前日期的文件夹
- touch 修改文件时间戳,或者新建一个不存在的文件 - 副本
- html5 服务器手机编程,html5实现服务器发送事件
- [Android] 开源View组件(一)
- c3p0配置及泄露问题
- SQL Server高级查询之数据库安全管理 第六章节
- CSS去掉TextBox边框
- SQL语言入门(一)
- 【luogu2272】 [ZJOI2007]最大半连通子图 [tarjan 缩点][拓扑排序]
- 【Filter】基础知识
- php 解析收货人信息 提取 收货人 地址 电话
- 影响IT人员未来发展的五个IT新技术方向
- C# 在图片上写字
- 点击站AdBux--看广告赚美元
- 【图像重建】基于正交匹配追踪(OMP)算法结合小波变换是图像重建含Matlab源码
- Vue电商系统后台API接口
热门文章
- linux 编译安装TRMPdump(libRTMP)
- 基于C#+Oracle的模拟图书馆管理系统
- 自动化测试===【转】Robot Framework作者建议如何选择自动化测试框架
- java将古诗竖排_古诗词竖排格式
- 以后在此写下自己的后博士时代吧SWE-SPHysics
- RocketMQ源码系列(一) NameServer 核心源码解析
- airsim:体验在虚幻世界中“自由飞行”
- 大数据Flink安装部署
- 【前端】性能优化 - WebP
- 数学建模_数学模型的分类数学建模十大算法