文章目录

  • 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动图演示相关推荐

  1. 大脸猫讲逆向之ARM汇编中PC寄存器详解

    i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...

  2. 汇编 第十章 call和ret指令

    第十章 call和ret指令 call和ret指令都是转移指令,它们都能修改ip,或同时修改cs和ip 10.1 ret和retf 1.ret指令用栈中的数据,修改ip的内容,从而实现[近转移]CPU ...

  3. 汇编中的call和ret指令

    call和ret指令都是转移指令,它们都修改偏移地址或同时修改段地址和偏移地址.ret指令用栈中的数据,修改偏移地址,从而实现近转移.call可以通过位移和目的地址进行转移.下面来通过汇编代码学习一下 ...

  4. ARM汇编中ldr伪指令和ldr指令(转载)

    转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...

  5. ARM中LDR B BX BL BLX指令的研究

    原来的文章有点乱,所以稍微整理了一下有用的要点: (1)  LDR作为伪指令的格式:LDR 寄存器, = 数字常量/Label 如:LDR   R2,=0x55aa ; 表示将0x55aa送入寄存器R ...

  6. ARM 汇编指令集4 协处理器和协处理器指令详解

    一.什么是协处理器 SoC 内部另一处理核心,协助主 CPU 实现某些功能,被主 CPU 调用执行一定任务. ARM 设计上支持多达 16 个协处理器,但是一般 SoC 只实现其中的 CP15.( c ...

  7. 汇编指令mrs_(转)ARM汇编学习笔记——MRS和MSR指令

    MRS,状态寄存器传送至通用寄存器类指令 功能:将状态寄存器的内容传送至通用寄存器. 格式: MRS{}Rd,CPSR}SPSR 其中: Rd  目标寄存器,Rd不允许R15. R=0  将CPSR中 ...

  8. 汇编指令msr_(转)ARM汇编学习笔记——MRS和MSR指令

    MRS,状态寄存器传送至通用寄存器类指令 功能:将状态寄存器的内容传送至通用寄存器. 格式: MRS{}Rd,CPSR}SPSR 其中: Rd  目标寄存器,Rd不允许R15. R=0  将CPSR中 ...

  9. 我去,这几个Linux指令太装B了|动图展示

    1. sl 先看一下呼啸而过的火车:安装指令如下: sduo apt-get install sl 执行结果如下: 2. htop 图形化Linux系统性能监测工具,屌不屌: 安装指令如下: sduo ...

最新文章

  1. 可疑文件_如何识别文件的真假
  2. Python多进程multiprocessing共享数据Value(包括常用的整数、字符串)、列表及字典以及Queue
  3. 【Linux】一步一步学Linux——tail命令(42)
  4. url传递html字符串,将Selenium HTML字符串传递给Scrapy以将url添加到Scrapy的url列表中...
  5. 批处理--创建当前日期的文件夹
  6. touch 修改文件时间戳,或者新建一个不存在的文件 - 副本
  7. html5 服务器手机编程,html5实现服务器发送事件
  8. [Android] 开源View组件(一)
  9. c3p0配置及泄露问题
  10. SQL Server高级查询之数据库安全管理 第六章节
  11. CSS去掉TextBox边框
  12. SQL语言入门(一)
  13. 【luogu2272】 [ZJOI2007]最大半连通子图 [tarjan 缩点][拓扑排序]
  14. 【Filter】基础知识
  15. php 解析收货人信息 提取 收货人 地址 电话
  16. 影响IT人员未来发展的五个IT新技术方向
  17. C# 在图片上写字
  18. 点击站AdBux--看广告赚美元
  19. 【图像重建】基于正交匹配追踪(OMP)算法结合小波变换是图像重建含Matlab源码
  20. Vue电商系统后台API接口

热门文章

  1. linux 编译安装TRMPdump(libRTMP)
  2. 基于C#+Oracle的模拟图书馆管理系统
  3. 自动化测试===【转】Robot Framework作者建议如何选择自动化测试框架
  4. java将古诗竖排_古诗词竖排格式
  5. 以后在此写下自己的后博士时代吧SWE-SPHysics
  6. RocketMQ源码系列(一) NameServer 核心源码解析
  7. airsim:体验在虚幻世界中“自由飞行”
  8. 大数据Flink安装部署
  9. 【前端】性能优化 - WebP
  10. 数学建模_数学模型的分类数学建模十大算法