arm的搬运数据指令和x86的有点区别,在x86汇编语言中mov可以实现所有情况下的数据移动,而arm中不同的情况有不同的模式
-
LDR(Load) :专用进口商 。只能把数据从 内存 -> 寄存器。 -
STR(Store) :专用出口商 。只能把数据从 寄存器 -> 内存。 -
MOV(Move) :内部倒手 。只能在 寄存器 <-> 寄存器 之间搬运(或者把立即数搬进寄存器)。
1.寻址模式
其实指令集也是一个二进制编码,而不同的寻址模式其编码方式也是不同的,这也导致了其寻址范围也有所不同
-
基地址模式
-
语法 :
[Xn] -
含义 :最老实模式。
-
动作:
- 看一眼纸条 Xn(写着 100)。
- 直接去 100 号拿东西。
-
结果 :拿到东西。纸条 Xn 上的数字不变。
-
-
基地址加偏移量模式
- 语法 :
[Xn, #offset] - 含义 :多看一眼模式。'
- 动作 :
- 看一眼纸条 Xn(写着 100)。
- 心里算一下:100 + 偏移量(假设是8) = 108。
- 去 108 号拿东西。
- 结果 :拿到东西。注意!纸条 Xn 上的数字还是 100,没有变。
- 语法 :
-
前变基模式 (Pre-indexed Mode)
-
语法 :
[Xn, #offset]!(注意感叹号 ,且偏移量在括号内) -
含义 :先跑再拿模式
-
动作:
- 先更新纸条:把手里纸条上的 100 擦掉,写上 108(100+8)。
- 再拿东西:去新的地址(108 号)拿东西。
-
结果 :拿到东西。纸条 Xn 变成了 108。
-
后变基模式
- 语法 :
[Xn], #offset(注意:没有感叹号 ,且偏移量在括号外!) - 含义 :先拿再跑模式。
- 动作 :
- 先拿东西:直接去纸条上现在的地址(100 号)拿东西。
- 再更新纸条:拿完之后,把纸条上的 100 擦掉,写上 108。
- 结果 :拿到东西(100号的)。纸条 Xn 变成了 108(为下一次做准备)。
- 语法 :
-
PC 相对地址模式
- 语法 :
<label> - 含义 :以我为准模式。
- 原理 :这里的地址不是基于 Xn 寄存器的,而是基于 PC (Program Counter,当前指令的位置)。
- 动作 :
- CPU 并不是去读某个寄存器,而是计算:"目标在离我当前这句话后面 500 字节的地方"。
- 直接去那里拿数据。
- 语法 :