RAM处理器的8种寻址方式

什么是寻址:

寻址是指找到存储数据或指令的地址,然后读取其中的内容。寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。ARM处理器采用的RISC架构,CPU本身是不能直接读取内存的,需要将内存的数据加载到Soc的通用寄存器,CPU再去寄存器进行读取。ARM采用的LADR/STR架构来实现 CPU和内存之间的数据交互。ldr(load register)将内存的数据加载到寄存器,str(store register)将寄存器的内容写到内存中。

8种寻址方式:

1.寄存器寻址:

move r1, r2
操作数在寄存器中,此句代码的功能就是将r2的数据加载到r1中。相当于C语言:r1 = r2

2.立即数寻址:

mov r0, #0xFFFF00
直接给出操作数,但是要受到合法立即数的限制。相当于c语言:r0=0xFFFF00

3.寄存器移位寻址:

mov r0, r1, lsl #3
寄存器中的数进行移位后得到操作数。相当于C语言:r0=r1<<3

4.寄存器间接寻址:

ldr r1,[r2]
操作数不是在寄存器中,而是操作数的所在内存地址在寄存器中。在C语言中,就是r2中存的是一个指针,指针指向的内存地址存的操作数:r1=*r2

5.基址变址寻址:

ldr r1, [r2, #4]
操作数的地址等于寄存器中的值加上偏移量,访问该地址可以得到操作数。相当于C语言:r1=*(r2+4).

6.多寄存器寻址:

ldmia r1!, {r2-r7, r12}
多寄存器寻址就是一次往多个寄存器里写数据,比如上面那条语句就是以r1里的数据为地址,读取地址里的数据依次写到后面的寄存器,每次操作完r1里的地址都+4,再去新的地址读取数据写到寄存器中。这对应于C语言里的数组,知道数组的首地址就可以每次数组首地址+4的方式来读取数组里的元素。

7.堆栈寻址:

stmfd sp!, {r2-r7, lr}
堆栈寻址其实和多寄存寻址很像,几乎就是特殊的多寄存寻址。sp是栈指针,上面的语句就是把栈里的内容依次写到r2-r7还有lr寄存器中。

8.相对寻址:

beq flag
pc当前值为基址,指令中值为偏移量,相加作为操作数的地址。地址分为相对地址和绝对地址,这里就是相对地址,跳转地址=当前地址+偏移量。此句是一个跳转指令,flag是汇编里的标号,相当于C语言中的函数名,eq是指令后缀,当上一句的执行结果为相等时才会执行本句,eq的作用相当于C语言的if条件语句。整句相当于c语言中的函数跳转,调用某个函数时,就会跳转到函数代码去执行,执行完毕后会返回。

总结:

从以上8中寻址方式的分析可以知道,汇编语句和C语句是存在对应关系的,C语言的特性是基于汇编语言的,学习汇编语言可以让我们更好的理解C语言。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值