嵌入式:ARM间接寻址、变址寻址与多寄存器寻址
文章目录
- 寄存器间接寻址
- 基址加偏址寻址(变址寻址)
- 偏移地址
- 传送数据类型
- 块拷贝寻址(多寄存器寻址)
- 块拷贝寻址示例
寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:
LDR R0,[R1] /*R0←[R1]*/STR R0,[R1] /*[R1]←R0*/
第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。
ARM的数据传送指令都是基于寄存器间接寻址,即通过Load/Store完成对数据的传送操作。
基址加偏址寻址(变址寻址)
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量(用12位表示,不超过4KB)相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。
变址寻址方式可以分为:前变址(Pre-indexed)、自动变址(Auto-indexed)和后变址(Post-indexed)。
前变址模式
LDR R0,[R1,#4] ;R0←[R1+4]
自动变址模式
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
后变址模式
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
偏移地址
地址偏移除了可以是一个12位的立即数,还可以是另一个寄存器,并且在加到基址寄存器之前还可以先经过移位操作,如:
LDR R0,[R1,R2] ;R0←[R1+R2]LDR R0,[R1,R2,LSL #2] ;R0←[R1+R2*4]
传送数据类型
ARM处理器支持的传送数据类型可以是有符号和无符号的8位字节、16位半字、32位字,最高位表示符号位(正数为0,负数为1)。对于字节操作,在指令中增加了字母B,对于半字,在指令中增加了字母H进行标识。默认是字操作,不加数据类型标识。如:
LDRB R0,[R1] ;R0←mem8[R1], 加载8位字节数据到寄存器R0,零扩展到32位
LDRH R1,[R0,#20] ;R0←mem16[R0+20] 加载16位半字到寄存器R1 ,零扩展到32位
这时,传送的地址可与任意字节、半字对齐,而不限于4字节对齐。
块拷贝寻址(多寄存器寻址)
块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。通过一条指令可以把一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。这种寻址方式中的寄存器可以是R0-R15这16个通用寄存器中的部分或全部。如:
LDMIA R0,{R1,R2,R3,R4} ;R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。
LDM/STM指令依据其后缀名(如:IA,DB)的不同,其寻址的方式也有很大不同。这些后缀可以定义存储器地址的增长是向上还是向下,以及地址的增减与指令操作的先后顺序(即:操作先进行还是地址的增减先进行)。
这些后缀可以分成两大类:一类用于数据的存储与读取,这类后缀有:IA、IB、DA、DB;另一类用于堆栈的操作,即压栈和出栈,这类后缀有:FD、ED、FA、EA。
这些后缀的含义是:
- IA(Increment After) 操作完成后地址递增
- IB(Increment Before)地址先增后完成操作
- DA(Decrement After)操作完成后地址递减
- DB(Decrement Before)地址先减后完成操作
- FD (Full Decrement)满递减堆栈
- ED (Empty Decrement)空递减堆栈
- FA(Full Aggrandizement)满递增堆栈
- EA(Empty Aggrandizement)空递增堆栈
块拷贝寻址示例
例:分析下面两条指令的作用,并分析基址寄存器的变化有什么不同?
LDMIA R0!,{R2-R9} STMIA R1,{R2-R9}
这两句的作用是将R0指向的连续8个存储单元的内容拷贝到R1指向的连续8个单元中去。
这两句执行完毕后,R0的内容增加了32个字节,这是由于使用了自动变址符号“!”,而R1的内容保持保持不变。
注意:在堆栈操作中总是要指定自动变址,否则,以前保存的内容会因为堆栈寄存器的基址不变将在下一次堆栈操作时遭到破坏!
参考文献:
孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017.
嵌入式:ARM间接寻址、变址寻址与多寄存器寻址相关推荐
- 计组高分笔记:【04】指令系统 「指令格式与分类 | CISC、RISC | 直接寻址 | 间接寻址 | 寄存器寻址 | 隐式寻址 | 立即寻址| 基址寻址 | 变址寻址 | 相对寻址 | 堆栈寻址」
文章目录 1. 指令格式 1.1 指令的基本概念 1.2 指令的分类 1.2.1 按地址码(操作数)长度/数目分类 1.2.2 按指令的长度分类 1.2.3 按操作码长度分类 1.2.4 按操作类型分 ...
- 【汇编语言】8086汇编,快速搞定各种寻址方式:立即数寻址 / 寄存器寻址 / 存储器寻址
0 前言 众所周知,对于8086汇编语言,有几大寻址方式,不过我觉得这个好墨迹,会用就可以了,为什么命名这么多,这次只说本质,不说命名,至于命名,还是得知道,毕竟是大部分人公认的,不能反抗这点哦,但是 ...
- 嵌入式Arm学习笔记(3)
ARM指令集 精简指令集设计理念(The RISC design philosophy) 设计原则(Design rules) 指令"短小精悍" 应用流水线技术设计 大量采用寄存器 ...
- ARM处理器9种基本寻址方式,和单片机微机原理寻址方式截然不同,(例如没有直接地址寻址,只能间接指针寻址或者寄存器变址寻址,立即数寻址,不是所有立即数都可直接寻址)不可套用理解。需独立学习
基本寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有9 种基本寻址方式. 1.寄存器寻址 操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器 ...
- 嵌入式:ARM立即寻址与寄存器寻址
文章目录 立即寻址 立即数的表示 有效立即数问题 寄存器寻址 寄存器为第2操作数的移位操作 第2操作数的移位方式 立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只 ...
- 寄存器寻址和寄存器间接寻址的区别
寄存器寻址(Register Direct Addressing)和寄存器间接寻址(Register Indirect Addressing)是计算机体系结构中两种不同的寻址模式.它们用于确定指令中操 ...
- 嵌入式ARM汇编详解(持续更新)
文章目录 零.预备知识 1.ARM与X86 2.ARM中指令的执行 3.ARM的九种寻址方式 立即数寻址 寄存器寻址 寄存器间接寻址 寄存器偏移寻址 寄存器基址变址寻址 批量寄存器寻址 相对寻址 堆栈 ...
- 单片机c语言片外寻址指令,51手记之寄存器寻址篇
题记:刚开始练51时就用C语言,现在想再加强一下汇编,所以不得不对单片机的硬件结构,特别是地址空间的分配方面详细的做一下了解了. 于是决定拿起课本北航的<智能化测量控制仪表原理与设计>重新 ...
- 嵌入式ARM设计编程(二) 字符串拷贝
文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者关注公众号[AIShareLab],回复 嵌入式 也可获取. 一.实验目的 通过实验掌握使用 LDB/ ...
最新文章
- Science首发奥密克戎突刺蛋白分子水平分析,揭秘2大传染性增强原因,柳叶刀:全球大流行有望3月结束...
- Oracle维护常用SQL语句
- sysbench mysql 结果_sysbench使用和结果说明
- Python: datetime 转换
- lacp可以在access接口吗_【基础】防火墙接口类型全介绍
- python元编程_python元编程详解(3)
- DelphiXe7开发酒店APP系统
- 理解position与anchorPoint[转]
- 建立桌面文件管理格子_win10桌面分区,win10如何创建桌面格子
- 基于Javaweb实现进销存管理系统
- Three.js-设置环境纹理及加载hdr环境贴图
- 使用kali破解win7密码
- 关于composer安装插件时候提示找不到fxp插件时候的解决办法
- MacBook通过MacBook安装Windows系统出现“下载windows支持软件时未能储存到所选驱动器”
- h5课件制作_一款专业的HTML5课件制作工具:炫课
- oracle角色数达到上限,ROLE启用个数限制
- 支付宝花呗额度一直不涨?阿里老员工说出原因,亲测有效
- MicroChip C18编译器上手及环境设置
- Cloud Foundry 峰会进入中国 全球专家与你面对面
- 测试apk-异常管控Bluetooth攻击者开发