ARM寻址

ARM几种寻址方式

立即数寻址

寄存器寻址

寄存器间接寻址

基址寻址

相对寻址

堆栈寻址

块拷贝寻址

 

 

  • 立即数寻址

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
原文地址:https://www.cnblogs.com/Lnju/p/4376349.html