Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >嵌入式:ARM间接寻址、变址寻址与多寄存器寻址

嵌入式:ARM间接寻址、变址寻址与多寄存器寻址

作者头像
timerring
发布于 2022-12-19 00:22:08
发布于 2022-12-19 00:22:08
1.6K03
代码可运行
举报
文章被收录于专栏:TechBlogTechBlog
运行总次数:3
代码可运行

文章目录

寄存器间接寻址

寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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)。

前变址模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LDR R0[R1,#4]R0[R14]

自动变址模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LDR R0[R1,#4]!	;R0[R14]R1R14

后变址模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LDR R0[R1] ,#4R0[R1]R1R14

偏移地址

地址偏移除了可以是一个12位的立即数,还可以是另一个寄存器,并且在加到基址寄存器之前还可以先经过移位操作,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  LDR R0[R1R2]R0[R1R2]
  LDR R0[R1R2,LSL #2]R0[R1R2*4]

传送数据类型

ARM处理器支持的传送数据类型可以是有符号和无符号的8位字节、16位半字、32位字,最高位表示符号位(正数为0,负数为1)。对于字节操作,在指令中增加了字母B,对于半字,在指令中增加了字母H进行标识。默认是字操作,不加数据类型标识。如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LDRB R0[R1]	;R0←mem8[R1], 加载8位字节数据到寄存器R0,零扩展到32LDRH R1[R0,#20]	;R0←mem16[R020] 加载16位半字到寄存器R1 ,零扩展到32

这时,传送的地址可与任意字节、半字对齐,而不限于4字节对齐。

块拷贝寻址(多寄存器寻址)

块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。通过一条指令可以把一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。这种寻址方式中的寄存器可以是R0-R15这16个通用寄存器中的部分或全部。如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  LDMIA   R0{R1R2R3R4}R1[R0]R2[R04]R3[R08]R4[R012]

该指令的后缀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)空递增堆栈

块拷贝寻址示例

例:分析下面两条指令的作用,并分析基址寄存器的变化有什么不同?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 LDMIA   R0!,{R2-R9} 
 STMIA    R1,{R2-R9}

这两句的作用是将R0指向的连续8个存储单元的内容拷贝到R1指向的连续8个单元中去。

这两句执行完毕后,R0的内容增加了32个字节,这是由于使用了自动变址符号“!”,而R1的内容保持保持不变。

注意:在堆栈操作中总是要指定自动变址,否则,以前保存的内容会因为堆栈寄存器的基址不变将在下一次堆栈操作时遭到破坏!

参考文献:

孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
嵌入式:Load/Store之单寄存器的存取指令
ARM处理器是Load/Store型的,即它对数据的操作是通过将数据从存储器加载到片内寄存器中进行处理,处理完成后的结果经过寄存器存回到存储器中,以加快对片外存储器进行数据处理的速度。
timerring
2022/12/22
8200
嵌入式:Load/Store之单寄存器的存取指令
嵌入式:ARM多寄存器存取指令详解
多寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。如:可将寄存器列表保存到堆栈,也可将寄存器列表从堆栈中恢复。 这种指令有两个特殊用法: (1)允许操作系统加载或存储用户模式寄存器来保护或恢复用户处理状态。 (2)作为异常处理返回的一部分,完成从SPSR中恢复CPSR。 这种指令与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。
timerring
2022/12/23
6270
嵌入式:ARM多寄存器存取指令详解
ARM汇编之加载寄存器
寄存器是CPU的组成部分,是有限存贮容量的高速存贮部件,它们可用来暂存 数据、地址、指令。 更多介绍可查看: ARM寄存器。
李玺
2021/11/22
1.2K0
ARM汇编之加载寄存器
【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)
博客地址 : http://blog.csdn.net/shulianghan/article/details/42375701
韩曙亮
2023/03/27
2K0
【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 |  ARM 寻址)
arm汇编指令详解带实例_汇编buf指令
两个 S 用于不同的指令,名称相同,但是在不同的指令结合却有不同的作用
全栈程序员站长
2022/11/04
1.5K0
寄存器与七种寻址方式
BH(8位) BL(8位) BX(16位) (BX又称基址寄存器,唯一作为存储器指针使用寄存器)
全栈程序员站长
2022/07/12
3K0
arm(2)| 汇编指令和伪指令
指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。所以指令和伪指令最大区别就是编译完之后会不会生成机器码。
飞哥
2020/07/10
2.8K0
arm(2)| 汇编指令和伪指令
ARM指令集介绍「建议收藏」
ARM 指令集是针对ARM体系架构设计的指令。在BootLoader引导的第一阶段以及内核的第一阶段都会有一个使用汇编语言编写的文件,在不跑操作系统的裸板中也有一段用来初始化开发板环境的汇编代码。所以无论是开发带操作系统的板子,还是裸板开发,汇编语言都很有必要学习一番,最少要了解一些常用的汇编指令。要想设计出性能超强的系统,ARM的工作原理是必须掌握的。
全栈程序员站长
2022/11/15
2.8K0
ARM指令集介绍「建议收藏」
嵌入式:ARM立即寻址与寄存器寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令: ADD R0,R0,#1 /*R0←R0+1*/ ADD R0,R0,#0x3f /*R0←R0+0x3f*/
timerring
2022/12/18
8700
嵌入式:ARM立即寻址与寄存器寻址
iOS汇编之ARM64基础介绍
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
玖柒的小窝
2021/12/06
1.6K0
iOS汇编之ARM64基础介绍
linux内核1-GNU汇编入门_X86-64&ARM
为了阅读Linux内核源代码,是需要一些汇编语言知识的。因为与架构相关的代码基本上都是用汇编语言编写的,所以掌握一些基本的汇编语言语法,能够更好地理解Linux内核源代码,甚至可以对各种架构的差异有一个更深入的理解。
Tupelo
2022/08/10
5K0
linux内核1-GNU汇编入门_X86-64&ARM
嵌入式:堆栈寻址、相对寻址与ARM指令总结
堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针(SP)的专用寄存器(R13)指示当前的操作位置,堆栈指针总是指向栈顶。
timerring
2022/12/20
1.1K0
计算机指令考前小记
汇编指令movw 4(%ebp),%ax的RTL语言为:R[ax] <- M[R[ebp]+4]
WuShF
2023/11/13
3860
计算机指令考前小记
ARM指令集
ARM指令的基本格式为: <Opcode> {<Cond>} {S} <Rd>, <Rn> { , <Opcode2> } 其中,<>内的项是必需的,{}内的项是可选的。 1)Opcode项 Opcode是指令助记符,即操作码,说明指令需要执行的操作,在指令中是必需的。 2)Cond项(command) Cond项表明了指令的执行的条件,每一条ARM指令都可以在规定的条件下执行,每条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。 条件码共有16种,每种条件码用2个字符表示,这两个字符可以添加至指令助记符的后面,与指令同时使用。 当指令的执行条件满足时,指令才被执行,否则指令被忽略。如果在指令后不写条件码,则使用默认条件AL(无条件执行)。 指令的条件码 条 件 码 助记符后缀 标 志 含 义 0000 EQ Z置位 相等equal 0001 NE Z清零 不相等not equal 0010 CS C置位 无符号数大于或等于Carry Set 0011 CC C清零 无符号数小于 0100 MI N置位 负数minus 0101 PL N清零 正数或零plus 0110 VS V置位 溢出 0111 VC V清零 没有溢出 1000 HI C置位Z清零 无符号数大于high 1001 LS Z置位C清零 无符号数小于或等于less 1010 GE N等于V 带符号数大于或等于 1011 LT N不等于V 带符号数小于least 1100 GT Z清零且(N等于V) 带符号数大于great 1101 LE Z清零或(N不等于V) 带符号数小于或等于 1110 AL 忽略 无条件执行all 1111 条件码应用举例: 例:比较两个值大小,并进行相应加1处理,C语言代码为: if ( a > b ) a++; else b++; 对应的ARM指令如下(其中R0中保存a 的值,R1中保存b的值): CMP R0, R1 ; R0与R1比较,做R0-R1的操作 ADDHI R0, R0, #1 ;若R0 > R1, 则R0 = R0 + 1 ADDLS R1, R1, #1 ; 若R0 <= R1, 则R1 = R1 + 1 CMP比较指令,用于把一个寄存器的内容和另一个寄存器的内容或一个立即数进行比较,同时更新CPSR中条件标志位的值。指令将第一操作数减去第二操作数,但不存储结果,只更改条件标志位。 CMP R1, R0 ;做R1-R0的操作。 CMP R1,#10 ;做R1-10的操作。 3)S项(sign) S项是条件码设置项,它决定本次指令执行的结果是否影响至CPSR寄存器的相应状态位的值。该项是可选的,使用时影响CPSR,否则不影响CPSR。 4)
全栈程序员站长
2022/07/05
8120
汇编语言从入门到精通-3操作数的寻址方式
  操作数是指令或程序的主要处理对象。如果某条指令或某个程序不处理任何操作数,那么,该指令或程序不可能有数据处理功能。在CPU的指令系统中,除NOP(空操作指令)、HLT(停机指令)等少数指令之外,大量的指令在执行过程中都会涉及到操作数。所以,在指令中如何表达操作数或操作数所在位置就是正确运用汇编指令的一个重要因素。
墨文
2020/02/28
2.9K0
汇编语言从入门到精通-3操作数的寻址方式
4.2.2 常见的数据寻址方式
如单地址的指令格式,就不是明显地在地址字段中指出第二操作数的地址,而是规定累加器ACC作为第二操作数,指令格式明显指出的仅是第一操作数的地址。因此,累加器ACC对单地址指令格式来说是隐含地址。
week
2018/08/24
1.3K0
【计组不挂科】计算机组成第三章< 指令系统 >习题库(选择题&判断题&填空题&填空计算题)(含答案与解析)
A.基址寄存器内容加上形式地址(位移量) B.程序计数器内容加上形式地址 C.变址寄存器内容加上形式地址 D.变址寄存器的内容加上基址寄存器的内容
YY的秘密代码小屋
2024/12/05
2560
【计组不挂科】计算机组成第三章< 指令系统 >习题库(选择题&判断题&填空题&填空计算题)(含答案与解析)
ARM汇编语言指令集汇总
ARM汇编语言指令集汇总 跳转指令 存储器和寄存器交互数据指令(内存访问) 数据传送指令 数据算术运算指令 数据逻辑运算指令 比较指令 组合和分离指令 并行指令 测试指令 ThumbEE指令 协处理器指令 伪指令 无线 MMX 技术伪指令 其他指令 寄存器寻址方式 跳转指令 指令 简介 B 无条件跳转 BL 带链接的无条件跳转 BX 带状态跳转,更改指令集 BLX 带链接和状态切换的无条件跳转,更改指令集 BXJ 跳转,更改为 Jazelle TBB , TBH 表跳转字节、半字 存储器和寄存器交互数据指
李玺
2021/11/22
1.4K0
计算机组成原理期末救急--下
将记录下一条地址的职责交给程序计数器后,那么指令就变成三地址了,随之而来的就是A1,A2能表示的地址范围变大了
大忽悠爱学习
2022/06/01
7980
计算机组成原理期末救急--下
嵌入式:ARM汇编语言程序设计基础教程
② CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。
timerring
2022/12/31
1.4K0
嵌入式:ARM汇编语言程序设计基础教程
相关推荐
嵌入式:Load/Store之单寄存器的存取指令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验