本文脉络
寻址方式即寻找操作数的方式
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、堆栈寻址(待完善)
堆栈按先进后出的方式工作,堆栈有以下几种分类:
满堆栈:其堆栈指针指向最后压入堆栈的数据
空堆栈:其堆栈指针指向下一个将被放入数据的空位置
升序(递增)堆栈:堆栈地址由低向高生成
降序(递减)堆栈:堆栈地址由高向低生成