寻址方式为根据指令中给出的地址码字段寻找操作数地址的方式,cortex-A8有以下几种寻址方式
1、寄存器寻址
寄存器寻址是通过给出的寄存器编号得到所要的操作数,操作数是给出的寄存器的内容
举例:
MOV R1,R2(将R2的内容放到R1中)
SUB R0,R1,R2(R1的内容减去R2的内容放到R0中)
2、立即寻址
一种特殊的寻址方式,指令中在操作码字段后的地址码部分为操作数本身,这种数为立即数,注意立即数以“#”开头
举例:
SUBS R0,R0,#1(R0的内容减去1[1为立即数]后放到R0中)
3、寄存器移位寻址
·LSL:逻辑左移,寄存器的字的低端空出的位补0
·LSR:逻辑右移,寄存器的字的高端空出的位补0
·ASR:算术右移,操作对象为有符号数,移位时保证符号位不变,即操作正数时高位补0,操作负数时高位补1
·ROR:循环右移,低端移出的数填充到高位处
举例:
MOV R0,R2,LSL #3(R2的内容左移3位后[相当于R2内容乘8]放入R0)
4、寄存器间接寻址
指令中的地址码给出某一通用寄存器的编号,在被指定的寄存器中存放操作数的有效地址,而操作数则存放在该地址对应的存储单元中,类似于指针
举例:
LDR R1,[R2](将以R2内容为地址里所存放的数据装载到R1中)
5、变址寻址
变址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,包括基址加偏移和基址加索引两种寻址。
举例:
①基址加偏移:LDR R2,[R3,#-2]:将R3的内容减2作为操作数的地址,将该地址对应的数据装载到R2
②基址加索引:LDR R0,[R3,R2]:将R3的内容加R2的内容作为地址,将地址对应的数据装载到R0中
6、多寄存器寻址
一次可以传送多个寄存器的值,允许一条指令传送16个寄存器(R0~R15)的任何子集
举例:
LDMIA R1!,{R2-R7,R12}:将R1所指的地址的数据读出到R2-R7、R12,R1的自动更新
7、堆栈寻址
堆栈是按特定的顺序进行存取的存储区,顺序为先进后出。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储器区域。堆栈指针所指定的存储单元就是堆栈的栈顶
(1)堆栈分为两种:向上生长型的(地址向高地址方向生长,递增堆栈)和向下生长型的(地址向地地址方向生长,递减堆栈)
(2)满堆栈和空堆栈
满堆栈:堆栈指针指向最后压入堆栈的有效数据项
空堆栈:堆栈指针指向下一个数据要放入的空位置
根据满堆栈和空堆栈,堆栈又可分为四种:
①满递增:堆栈为向上生长,堆栈指针指向最后压入堆栈的有效数据项,指令如LDMFA、STMFA
②满递减:堆栈为向下生长,堆栈指针指向最后压入堆栈的有效数据项,指令如LDMFD、STMFD
③空递增:堆栈为向上生长,堆栈指针指向下一个数据要放入的空位置,指令如LDMEA、STMEA
④空递减:堆栈为向下生长,堆栈指针指向下一个数据要放入的空位置,指令如LDMED、STMED
举例:
STMFD SP!,{R1-R7,LR}(将R1-R7、LR压入堆栈,满递减堆栈)
8、相对寻址
是变址寻址的变通,由程序计数器(PC)提供基址,指令中的地址码字段作为偏移量,两者相加后得到操作数的有效地址。偏移量指出的是操作数与当前指令之间的相对位置。子程序调用指令即是相对寻址指令
举例:
BL ROUTE1(调用ROUTE1子程序)