一步一步写ARM汇编(四)

ARM处理器的八种寻址

1. 立即数寻址

add,r0,r0,#1

2. 寄存器寻址

       add r0, r1, r2 

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

       Ldr r0, [r1]

4. 寄存器移位寻址

       mov r1,#7

       mov r2,#1

       add r0, r1, r2 ,lsl #2

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

三种索引方式:

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

       ldr r1,=0x40000000

       mov r2,#0x1

       str r2,[r1,#4]

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

       ldr r1,=0x40000000

       mov r2,#0x1

       str r2,[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

示例代码如下:

       ldr r1,=0x40000000

       mov r2,#0x1

       mov r3,#0x2

       mov r4,#0x3

       mov r5,#0x4

 

       stmia r1!,{r2-r5}

 

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

       blable

lable:

 

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

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

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

示例代码如下:

       ldr sp,=0x40001000

 

       movr1,#0x1

       movr2,#0x2

       movr3,#0x3

       movr4,#0x4

 

       stmfd sp!,{r1-r4}

 

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

 

     area example,code,readonly

       entry

 

start

       ;初始化堆栈值

       ldr sp,=0x40001000

       movr1,#0x1

       movr2,#0x2

       movr3,#0x3

       movr4,#0x4

       bl func1

       b over

 

func1     

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

       stmfd sp!,{r1-r4,lr}

     mov r1,#0xf

       mov r2,#0xf

       mov r3,#0xf

       mov r4,#0xf

       bl func2

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

       ldmfd sp!,{r1-r4,pc}

 

func2

       ;如上

       stmfdsp!,{r1-r4,lr}

     mov r1,#0xe

       mov r2,#0xe

       mov r3,#0xe

       mov r4,#0xe

       ;如上

       ldmfd sp!,{r1-r4,pc}

      

over

       bover

       end

 


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值