CM4_ 2、ARM指令寻址方式

版权声明:本文为博主原创文章,转载请声明原文出处: https://blog.csdn.net/lucky534528795/article/details/88974540



寻址方式即寻找操作数的方式

1、立即数寻址

立即数寻址的操作数就在指令中,如

ADD R0, RO, #1     			;R0<--R0+1	
MOV R0, #0X3FF				;R0<--0x3FF

Ps: ARM汇编中要求立即数以“#”开头,对十六进制的立即数,还需在“#”后加“0x”或“&”

2、寄存器寻址

寄存器寻址在指令中给出一个寄存器, 寄存器内存放操作数(相比立即数寻址多了个访问寄存器的步骤),如

ADD R0, R1, R2				;R0<--R1+R2
MOV R0, R2					;R1<--R2

3、寄存器间接寻址

寄存器间接寻址在指令中给出一个寄存器, 寄存器内存放操作数的地址(相比立即数寻址除了要访问寄存器外,还要利用寄存器内的地址在内存中寻找操作数),如

ADD R0, R1, [R2]			;R0<--R1+[R2]
LDR R0,[R1]					;R0<--[R1]

Ps: [地址或寄存器] ”表此地址或寄存器指向的值

4、寄存器偏移寻址

寄存器偏移寻址是ARM指令集特有的寻址方式,建立在寄存器寻址的方式上,先将寄存器进行移位操作,然后再作操作数

MOV R0, R2, LSL #3			;R0<--R2*8(向左移3位,2^3=8)
ANDS R1, R1, R2, LSL R3		;R1<--R1&(R2左移R3位)

5、基址变址寻址

基址变址寻址同样建立在寄存器(间接)寻址的方式上,先将寄存器与指令中给出的偏移地址相加,从而得到操作数的有效地址,如

LDR R0, [R1, #0x0F]			;R0<--[R1+0x0F] 		①
LDR R0, [R1], #4			;R0<--[R1]、R1<--R1+4 	②

注意: 第①条与第②条指令虽然都对R0存入了相同的值,但两者所执行的效果是不一样的!
对①指令:执行后R0存放[R1+0x0F],但并不改变寄存器R1内的值
对②指令:执行后先在R0存放[R1],再把寄存器R1的值更新为R1+4

6、多寄存器寻址(待完善)

多寄存器寻址可以一次性传送多个寄存器的值,但一条指令最多传16个寄存器,如

LDMIA R0!, {R1, R2, R3, R4}	;R1<--[R0], R2<--[R0+4], R3<--[R0+8], R4<--[R0+12]
STMIA R0!, {R3-R5, R10}		;R0<--R3, [R0+4]<--R4, [R0+8]<--R4\5, [R0+12]<--R10

多寄存器处理指令后缀表

面向堆栈的后缀 对于存储或推入指令 对于加载或弹出指令
FD(满降序堆栈) DB(之前递减) IA(之后递增)
FA(满升序堆栈) IB(之前递增) DA(之后递减)
ED(空降序堆栈) DA(之后递减) IB(之前递增)
EA(空升序堆栈) IA(之后递增) DB(之前递减)

7、堆栈寻址(待完善)

堆栈按先进后出的方式工作,堆栈有以下几种分类:
满堆栈:其堆栈指针指向最后压入堆栈的数据
空堆栈:其堆栈指针指向下一个将被放入数据的空位置
升序(递增)堆栈:堆栈地址由低向高生成
降序(递减)堆栈:堆栈地址由高向低生成

堆栈寻址有四种堆栈工作方式:

7.1、满升序

7.2、空升序

7.3、满降序

7.4、空降序

猜你喜欢

转载自blog.csdn.net/lucky534528795/article/details/88974540