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]
实验验证:
执行第一条指令(MOV r1,0x35000)后寄存器的状态值
当前内存状态
执行第二条指令(LDR r0,[r1])后寄存器状态
能够看到r0寄存器的值已经变成上面内存地址为0x35000处内存的内容了。因为内存中数据的存储是有大小端问题的,因此看上去不同实际是同样的值。
此时寄存器状态
r0保存着地址为0x35000的存储器中的数值,r1当即数赋值0x35000,r2当即数赋值0x34000。
此时内存状态
STR r0,[r2]指令执行完以后,0x34000处状态
该处值已经修改成寄存器r0的值。
LDR和STR指令说明:
LDR 目的寄存器,【存储器地址】
用于从存储器地址处获取一个32位的数据送至目的寄存器,当程序计数器PC被当作目的寄存器时,存储器中取到的数据被当作跳转的目的地址来使用,从而实现程序的跳转。
STR 源寄存器,【存储器地址】
用于将源寄存器中的数据送入存储器地址处。