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

author author     2022-12-19     231

关键词:

寄存器间接寻址

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

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)。

  1. 前变址模式
LDR R0,[R1,#4] ;R0←[R1+4]
  1. 自动变址模式
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
  1. 后变址模式
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)空递增堆栈

块拷贝寻址示例

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

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

LDMIA   R0!,R2-R9 
STMIA R1,R2-R9

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

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

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

参考文献:

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

8086中的七种寻址方式

寻址方式8086/8088有七种基本的寻址方式:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,相对基址变址寻址。其中,后五种寻址方式(即直接寻址、寄存器间接寻址、寄存器相对寻址、基... 查看详情

arm寻址方式

...R0,#0X3F(注意:立即数需要在数据前面加上一个#号) 寄存器寻址:利用寄存器中的数值作为操作数,数据存在寄存器中例子:ADDR0,R1,R2 寄存器间接寻址:数据存放在内存中,寄存其中存放的不是操作数本身,而是其在... 查看详情

计算机中常用的寻址方式有哪几种

存取数据有关的寻址方式:立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址与程序控制有关的寻址方式:段内直接寻址、段间直接寻址、段内间接寻址、段间间接寻址。... 查看详情

什么是ip寻址

...为寻址方式。8086/8088有七种基本的寻址方式:立即寻找,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址加变址寻址,相对基址加变址寻址。直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址和相... 查看详情

linux驱动开发:arm汇编基础(代码片段)

...:1.2伪操作1.3GUN函数二、ARM的寻址方式2.1立即寻址2.2寄存器寻址2.3寄存器间接寻址2.4基址变址寻址2.5多寄存器寻址2.6相对寻址2.7堆栈寻址三、Cortex-A常用汇编指令3.1处理器内部数据传输指令3.2存储器访问指令3.3压栈和出栈指... 查看详情

movax,es:[bx]指令中,源操作数字段的寻址方式是啥?

...技术AMOVAX,ES:[BX]他的源操作数就是es:[bx]这种方式就叫作“寄存器间接寻址” 参考技术B寄存器间接寻址80x86有7大寻址方式1、立即寻址movcx,2129h2、寄存器寻址movcx,ax3、存储器寻址movcx,[2000h]4、寄存器间接寻址movcx,[bp]5、寄存器相对... 查看详情

(计算机组成原理)第四章指令系统-第二节3:数据寻址之偏移寻址(基址寻址变址寻址和相对寻址)

...2)基址寻址的作用二:变址寻址(1)基本概念(2)变址寄存器的作用(3)基址&变址复合寻址三:相对寻址(1)基本概念(2)相对寻址作用本小节承接上一节:(计算机组成原理)第四章指令系统-第二节2:数据寻址(直接寻... 查看详情

考前自学系列·计算机组成原理·常见的数据寻址方式(地址码,操作数位置)

...在存储器中,指令中的地址码字段存放操作数的地址寄存器寻址:操作数在寄存器中,地址码字段给出寄存器的编号寄存器间接寻址操作数在存储器中,地址码中位寄存器编号,寄存器中为操作数地址变址寻... 查看详情

arm寻址方式

寻址方式有9种1.寄存器2.立即数3.寄存器位移4.寄存器间接5.基址6.多寄存器7.堆栈8.块拷贝9.相对 1.MOVR1,R2   R1=R2 2.MOVR0,#0x123R0=0x123 3.MOVR0,R2,LSL#3R0=R2逻辑右移3位后的值 寄存器位移有4类5种方式,位移指令不... 查看详情

汇编小知识

1.8086的寄存器内部寄存器8个:分为数据寄存器,地址寄存器,变址寄存器其中数据寄存器4个:AX,BX,CX,DX,又可分为AH,BH,CH,DH和AL,BL,CL,DL。AX称为累加寄存器,I/O指令均使用该寄存器,访问外部硬件和接口。BX称为基址寄存... 查看详情

汇编寻址方式记录

...l风格AT&T风格操作数顺序目标操作数在前源操作数在前寄存器原样加%前缀立即数原样加$前缀16进制立即数用后缀B与H分别表示二进制与十六进制对于16进制字母开头的要加前缀0加前缀0x访问内存长度的表示前缀BYTEPTR,WORDPTR,DWORDP... 查看详情

(计算机组成原理)第四章指令系统-第二节2:数据寻址(直接寻址间接寻址立即数)

...数据寻址二:数据寻址(1)直接寻址(2)间接寻址(3)寄存器寻址(4)寄存器间接寻址(5)隐含寻址(6)立即寻址一:指令寻址和数据寻址上一节我们讲到了指令寻址:下一条欲执行指令的地址会由程序计数器PCPCP 查看详情

存储器间接寻址试验立即寻址;直接寻址;间接寻址16位指针间接寻址32位指针间接寻址

...sp;(二)直接寻址直接寻址在指令中直接给出存储器或者寄存器的地址,地址包括区域长度和位置信息AQ0.5//输出Q寄存器0的第5位LDBW//DB表述DATABLOCK数据块将数据块中的16位字装载到累加器1的低字LLD22//将32位局部数据双字装载到累... 查看详情

arm指令之寄存器间接寻址的几种表达方式(代码片段)

...指令为例来分别举例分析。LDR指令的格式为:LDR条件目的寄存器,<存储器地址>LDR指令是字加载指令,用于从存储器中将一个32位的字数据送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后... 查看详情

[arm]arm处理器寻址方式(代码片段)

...立即数。ADD  R0,R0,#1MOV  R0,#0X3FF  2、寄存器寻址  在寄存器寻 查看详情

在间接寻址中非法使用寄存器

】在间接寻址中非法使用寄存器【英文标题】:Illegaluseofregisterinindirectaddressing【发布时间】:2013-03-1204:57:12【问题描述】:我正在尝试编写一个在x86汇编(MASM)中添加两个大数的子例程。数字由si和di寄存器指向,函数应该从右到... 查看详情

30331寻址方式(代码片段)

...bsp;       立即寻址MOVAX,3069H 寄存器寻址MOVAL,BH存储器寻址直接寻址MOVAX,[2000H]寄存器间接寻址MOVAX,[BX] 寄存器相对寻址MOVAX,COUNT[S 查看详情

汇编学习笔记-80x86寻址方式

...方式。一共有七种寻址方案    立即数寻址    寄存器寻址    直接寻址    寄存器间接寻址    寄存器相对选址    基址变质寻址    相对基址变质寻址    在此之前,先介绍一个... 查看详情