一步一步写ARM汇编(四)

时间:2022-10-28 15:47:05

ARM处理器的八种寻址

1. 立即数寻址

add,r0,r0,#1

2. 寄存器寻址

       addr0, r1, r2 

3. 寄存器间接寻址:以寄存器中的值作为操作数的地址

       Ldrr0, [r1]

4. 寄存器移位寻址

       movr1,#7

       movr2,#1

       addr0, r1, r2 ,lsl #2

一步一步写ARM汇编(四)

5. 基址变址寻址: 将基址寄存器的内容与指令中给出的偏移量相加,得到一个有效的操作地址。通常用于访问连续的地址空间。

三种索引方式:

前索引   ldr r0, [r1, #4];将r0中的值传递给r1中的值+4的地址,r1中的值保持不变,示例代码如下:

       ldrr1,=0x40000000

       movr2,#0x1

       strr2,[r1,#4]

自动索引 ldr r0, [r1, #4]!;将r0中的值传递给r1中的值+4的地址,r1中的值变为r1中的值+4,示例代码如下:

       ldrr1,=0x40000000

       movr2,#0x1

       strr2,[r1,#4]!

后索引   ldr r0, [r1],#4;将r0中的值传递给r1中的值的地址,r1中的值变为r1中的值+4,示例代码如下:

       ldr r1,=0x40000000

       mov r2,#0x1

       str r2,[r1],#4

 

6. 多寄存器寻址:可以实现一条指令完成多个寄存器值的传送,最多一次传送16个通用寄存器的值,连续的寄存器用‘-’连接,否则用逗号分隔。Xx可以是ia,ib,da,db

ia  每次传递后地址+1

ib  每次传递前地址+1

da 每次传递后地址-1

db 每次传递前地址-1

示例代码如下:

       ldrr1,=0x40000000

       movr2,#0x1

       movr3,#0x2

       movr4,#0x3

       movr5,#0x4

 

       stmiar1!,{r2-r5}

 

7. 相对寻址,如下代码:

       blable

lable:

 

8. 堆栈寻址: 堆栈寻址是一种数据结构,按先进先出的方式操作,r13(sp)寄存器指示当前的栈顶位置,arm支持4种堆栈操作方式ia,ib,da,db。

入栈:stmfd sp!, {r0-r12}

出栈:ldmfd sp!,{r0-r12}

示例代码如下:

       ldrsp,=0x40001000

 

       movr1,#0x1

       movr2,#0x2

       movr3,#0x3

       movr4,#0x4

 

       stmfdsp!,{r1-r4}

 

示例:使用堆栈寻址实现保存调用函数时的返回地址和通用寄存器值。

 

     area example,code,readonly

       entry

 

start

       ;初始化堆栈值

       ldrsp,=0x40001000

       movr1,#0x1

       movr2,#0x2

       movr3,#0x3

       movr4,#0x4

       blfunc1

       bover

 

func1     

       ;保存返回地址和通用寄存器值到栈种

       stmfdsp!,{r1-r4,lr}

     mov r1,#0xf

       movr2,#0xf

       movr3,#0xf

       movr4,#0xf

       blfunc2

       ;将栈中值弹出到通用寄存器中,而且将lr值直接放在pc中,实现返回

       ldmfdsp!,{r1-r4,pc}

 

func2

       ;如上

       stmfdsp!,{r1-r4,lr}

     mov r1,#0xe

       movr2,#0xe

       movr3,#0xe

       movr4,#0xe

       ;如上

       ldmfdsp!,{r1-r4,pc}

      

over

       bover

       end