ARM寄存器的8种寻址方式01

1、当即数寻址 .net

操做数由指令自己给出 ip

MOV r0,#0x0F //是全部寻址方式里面速度最快的,可是受到合法当即数的限制 内存

当即数要求以#和$开头 get

十六进制,#后跟0x;十进制,#后直接加;八进制,#后跟0;二进制,#后跟0b it

什么是合法当即数?ARM中要求当即数是一个8位的常数循环左移偶数位获得的数值。也就是说只要是在0x00~0xFF中的一个数,或者是在这个区间中的一个数循环左移偶数位的数值,都是合法当即数。 cli

给你们一个快速判断方法: 循环

1、若是该数在0x00~0xFF之间,它是一个合法当即数; 二进制

2、若是该数>0xFF,先把它换算成十进制数,若是能被4整除,它就是一个合法当即数,不然是一个非法当即数。 程序

2、寄存器寻址 方法

利用寄存器中的数值做为操做数进行操做

ADD r0,r1,r2

MOV r0,r1

是速度仅次于当即数寻址的操做。

3、寄存器移位寻址

操做数由寄存器中的数值移位获得,移位的方式由助记符的形式给出,移位数能够是一个当即数也能够是一个寄存器数值

MOV r1,#7

MOV r2,#1

MOV r0,r1,r2,LSL #2

4、寄存器间接寻址

把寄存器中的值当作是被操做的数值在存储器中的地址,操做数自己放在寄存器中。

LDR r0,[r1]

STR r0,[r1]

实验验证:

clip_image002

执行第一条指令(MOV r1,0x35000)后寄存器的状态值

clip_image004

当前内存状态

clip_image006

执行第二条指令(LDR r0,[r1])后寄存器状态

clip_image008

能够看到r0寄存器的值已经变成上面内存地址为0x35000处内存的内容了。因为内存中数据的存储是有大小端问题的,因此看上去不同实际是同样的值。

clip_image010

此时寄存器状态

clip_image012

r0保存着地址为0x35000的存储器中的数值,r1当即数赋值0x35000,r2当即数赋值0x34000。

此时内存状态

clip_image014

clip_image016

STR r0,[r2]指令执行完以后,0x34000处状态

clip_image018

该处值已经修改成寄存器r0的值。

LDR和STR指令说明:

LDR 目的寄存器,【存储器地址】

用于从存储器地址处获取一个32位的数据送至目的寄存器,当程序计数器PC被当作目的寄存器时,存储器中取到的数据被当作跳转的目的地址来使用,从而实现程序的跳转。

STR 源寄存器,【存储器地址】

用于将源寄存器中的数据送入存储器地址处。

相关文章
相关标签/搜索