章节列表
之一:ARM汇编语言开篇
之二:C/C++程序生成ARM汇编程序的进程剖析
之三:ARM汇编语言程序结构
之四:ARM处理器的寻址方法
之五:ARM指令集与Thumb指令集
之六:NEON指令集与VFP指令集
处理器的寻址方法是经过指令给出的地址码字段来寻觅实在操作数地址的方法,ARM处理器支撑9中寻址方法。
一 当即寻址
当即寻址指令后边的地址码部分为当即数(常量或常数),当即寻址多用于给寄存器赋值。
举例
MOV RO, #1234
指令履行后,R0=1234。
二 寄存器寻址
寄存器寻址中,操作数在寄存器中,指令履行时直接从寄存器中取值进行操作。
举例
MOV R0, R1
指令履行后,R0=R1。
三 寄存器移位寻址
寄存器移位寻址是ARM指令集特有的寻址方法,和寄存器寻址相似,仅仅操作前需要对寄存器操作数进行移位操作。
- LSL:逻辑左移,移位后寄存器空出的低位补0。
- LSR:逻辑右移,移位后寄存器空出的高位补0。
- ASR:算术右移,移位进程中,符号位坚持不变,假如源操作数是正数,则空出的高位补0,不然补1.
- ROR:循环右移,移位后移除的低位填入空出的高位。
- RRX:带扩展的循环右移,操作数右移一位,移位空出的高位用C标志的值填充。
举例
MOV R0, R1, LSL #2
R1寄存器左移两位赋值给R0,指令履行后,R0=R1*4。
四 寄存器直接寻址
寄存器直接寻址中地址码给出的寄存器是操作数的地址指针,所需的操作数保存在寄存器指定的存储单元中。
举例
LDR R0, [R1]
将R1寄存器的数值作为地址,取出此地址中的值赋给R0寄存器。
五 基址寻址
基址寻址是将地址码给出的基址寄存器和偏移量相加,构成操作数的有用地址,所需的操作数保存在有用地址所指向的存储单元中。基址寻址多用于查表和数组拜访等操作。
举例
LDR R0, [R1, #-4]
将寄存器R1的数组减去4作为地址,取出此地址中的值赋值给R0。
六 多寄存器寻址
多寄存器寻址一条指令最多能够完结16个通用寄存器的传送。
举例
LDMIA R0, {R1, R2, R3, R4}
LDM是数据加载指令,指令的后缀IA表明每次履行完加载操作后R0寄存器的值自增1个字。指令履行后,R1=[R0],R2=[R0+#4],R3=[R0+#8],R4=[R0+#12]。
七 仓库寻址
仓库寻址是ARM处理器特有的一种寻址方法,仓库寻址运用特定的指令来完结。
- LDMFA/STMFA
- LDMEA/STMEA
- LDMFD/STMFD
- LDMED/STMED
举例
STMFD SP1, {R1-R7, LR}
将R1-R7,LR入栈,多用于保存子程序现场。
LDMFD SP1, {R1-R7, LR}
将数据出栈,放入R0-R7,LR寄存器,多用于康复程序现场。
八 块复制寻址
块复制寻址可完成接连地址数据从存储器的某一方位复制到另一方位。
- LDMIA/STMIA
- LDMDA/STMDA
- LDMIB/STMIB
- LDMDB/STMDB
举例
LDMIA R0!, {R1-R3}
从R0寄存器的存储单元中读取3个字到R1-R3寄存器中。
STMIA R0!, {R1-R3}
存储在R1-R3寄存器的内容到R0指向ed存储单元。
九 相对寻址
相对寻址以程序计数器PC的当时值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到的操作数作为有用地址。
举例
BL NEXT...NEXT:...
BL NEXT是跳到NEXT标号处履行,这儿的BL便是选用相对寻址,标号NEXT是偏移量。