目录
1、指令分类
-
数据处理指令∶数据传送指令(mov)、算术逻辑运算指令(ADD、SUM、AND)、比较指令(CMP、TST)
-
跳转指令:PC赋值跳转、专用跳转指令
-
存储访问指令:LDR和STR
-
伪指令:ADR、ADRL、LDR、NOP
1.1、指令
指令:指令是能够被CPU所识别和执行的32位的机器码
机器码
31–28bit:条件段(如:EQ、NE、CS/HS、CC/LO等)
27–26bit:保留位,恒为00
24–21bit:opcode,指令的类型(AND、EOR、SUB、RSB、TST、ADD等)
20bit:该指令是否会影响程序状态字寄存器,是则置一,否则置零
19–16bit:第一个源操作数寄存器Rd
15–12bit:目的寄存器,填充方法同Rn
11–0bit:
指令中的数值数据只有12bit
8bit:来表示数据
4bit:来表示循环右移
1.2、mov
mov:把一个数移动到目标寄存器
指令格式:
mov{条件{s} 目标寄存器,源数据(寄存器存储,可以是常数,左移数值、右移右移数值)
条件:就表示mov指令是否要执行,如果满足条件就执行mov
s:是否影响CPSR的值
示例(其中的@表示注释):
立即数:由0-255之间的任意的八位数据通过循环右移偶数位能够的得到的数据
如:
1.3、移位操作
算数移动和逻辑移动:算数左移和逻辑左移作用一致
左移
LSL:逻辑左移,低位填0
ASL:算数左移,低位填0
@左移
mov r1,#5
mov r2,r1,LSL #2 @ 0101 << 2 = 1 0100(5)
mov r3,r1,ASL #2 @ 0101 << 2 = 1 0100
右移
LSR:逻辑右移,高位填0
ASL:逻辑右移,高位填0
ASR:算数右移,把高位填补原来高位(0 or 1,看原高位值)
@右移
mov r4,#6
mov r5,r4,LSR #2 @ 0110 >> 2 = 0001(1)
mov r6,r4,asr #2 @ 0110 >> 2 = 0001
示例:
2、比较指令
CMP:把寄存器数据与另一个寄存器(或数值)进行比较,同时会更新CPSR的条件标志值。其实该指令就是执行一个减法,不保存运算结果,只会更新CPSR标志位(表示两个操作数的大小关系)。
2.1、条形码
比较指令(CMP)的简单例子:
(1)当r1=r2=2时如下
mov r1,#2
mov r2,#2
cmp r1,r2 @ r1-r2 @ 比较条件结果
moveq r3,r1,LSL #2 @ 上一个条件结果相等(Z=1),才执行 r3=(r1<<2)
movne r4,r2,LSL #3 @ 上一个条件结果不相等(Z=0),才执行 r4=(r2<<2)
(2)当r1=1,r2=2时如下(与上面对比)
m