立即数寻址 |
寄存器寻址 |
寄存器间接寻址 |
基址寻址 |
相对寻址 |
堆栈寻址 |
块拷贝寻址 |
-
立即数寻址
1 SUBS R0,R0,#1 ;R0 =R0 -1 ,结果放入R0(第一个R0寄存器) 2 3 MOV R0,#0xFF ;R0 立即数0xFF装入R0
立即数寻址,把立即数直接编码到opcode(指令编码当中),在可能有
-
寄存器寻址
MOV R1,R2 ;R2 = R1 SUB R0,R1,R2 ;R0 = R1 - R2
操作的是寄存器中的数据,可能会用在一些变量之间的中间运算过程。
-
寄存器间接寻址
LDR R0, [R1] ;R0 <-- mem32[R1] STR R0, [R1] ;mem32[R1] <-- R0
ARM的数据传送指令都是基于这种方式的,通过Load、Store 完成对(内存)数据的存取,全局变量的存取。
-
基址寻址
LDR R2, [R3, #0x0C] ;R2 <-- mem32[R3+0x0C] STR R1, [R0,#-2] ;R1 --> mem32[R0 - 2] LDR R1, [R0, R3, LSL #1] ;R1 <-- mem32[R0 + R3*2] ;前索引寻址---------------------------------------------------------------- LDR R0, [R1, #4] ;R0 <-- mem32[R1+4] LDR R0, [R1, #4]! ;R0 <-- mem32[R1+4] ,R1 =R1 +4 ; ! 表示在完成数据传送后将更新基址寄存器 ;后索引寻址---------------------------------------------------------------- LDR R0, [R1], #4 ;R0 <-- [R1], R1 = R1+4
像对数组的寻址应该就是这种的了吧
-
相对寻址
BL SUBR1 ;跳转到其他位置的时候使用 ;-------------------------------------------------------- BEQ LOOP ;跳转到标号也是这种方式
这种寻址方式和x86里面的E8,E9是差不多的,使用的是偏移量作为跳转的位置。猜想是不是会对当前PC加上一个相对偏移然后跳转这种的。
-
堆栈寻址
STMFD SP!,{R1-R7, LR} ;寄存器R1到R7,LR都入栈 LDMFD SP!,{R1-R7,LR} ;寄存器R1到R7,LR都出栈
R13 即是SP指针
-
堆栈寻址
; IA 存后加 IB 存前加 DA 存后减 DB 存前减 STMIA R9!, {R0, R1, R5} ;第一步 mem32[R9] <-- R0, R9 = R9 +4 ;第一步 mem32[R9] <-- R0, R9 = R9 +4 ;第一步 mem32[R9] <-- R0, R9 = R9 +4