Thume指令可以理解为ARM指令集的一个子集
1. 指令格式
ARM指令的基本格式:
<opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}
opcode:为指令助记符,如MOV,ADD等.
cond:为执行条件
条件码助记符 标志
EQ Z=1 @相等
NE Z=0 @不相等
CH/HS C=1 @无符号数大于或等于
CC/LO C=0 @无符号数小于
MI N=1 @负数
PL N=0 @正数或零
VS V=1 @溢出
VC V=0 @没有溢出
HI C=1,Z=0 @无符号大于
LS C=0,Z=1 @无符号小于或等于
GE N=V @有符号数大于或等于
LT N!=V @有符号数小于
GT Z=0,N=V @有符号数大于
LE Z=1,N!=V @有符号数大于或等于
AL 任何 @无条件执行(默认)
S:指令是否影响CPSR寄存器的值,如ADDS,SUBS等
.W与.N为指令宽度说明符,编码默认是16位,也可以是32位则需要为指令加上.W宽度说明
Rd:为目的寄存器、
Rn:为第一个操作数寄存器
operand2:为第二个操作数,可以是立即数、寄存器、寄存器移位操作。如 MOV R0, #2
2. 跳转指令
(1)B跳转指令 : B {cond} label
(2) BL带链接的跳转指令: BL {cond} label
(3) BX带状态切换跳转指令: BX {cond} Rm, 如果cond条件满足,则处理器会判断Rm的位[0]是否为1,则跳转时自动将CPSR寄存器的标志T置位,反之,标志T复位
(4)BLX带链接和状态切换的跳转指令: BLX {cond} Rm
3. 存储器访问指令
存储器访问操作包括从存储器中加载数据、存储数据到存储器、寄存器与存储器之间数据交换
LDR: 用于从存储器中加载数据到寄存器中,格式如下:
LDR{type}{cond} Rd, label
LDRD{cond} Rd, Rd2, label
LDRD R0, R1, label2 @从label2指向的内存加载2个字的数据到R0和R1寄存器中
STR: 用于存储数据到指定地址的存储单元中,格式如下:
STR{type}{cond} Rd, label
STRD{cond} Rd, Rd2, label
STR R0, [R2, #04] @将R0寄存器的数据存储到R2+4所指向的存储单元
LDM:用于从指定的存储单元加载多个数据到一个寄存器列表,格式如下:
LDM{addr_mode}{cond} Rn{!} reglist
LDMIA R0!, {R1-R3} @依次加载R0指向的存储单元的数据到R1、R2、R3寄存器。
@R0为基寄存器,用于存储初始地址, !为可选,有!则最终地址将写回R0寄存器中
STM:将一个寄存器列表的数据存储到指定的存储单元,格式如下:
STM{addr_mode}{cond} Rn{!} reglist
STMDB R1!, {R3-R6, R11} @将R3-R6,R11寄存器的内容存储到R1指向的存储单元
STMFD SP!, {R3-R7} @将R3-R7寄存器压入堆栈
PUSH:将寄存器推入满递减堆栈,格式如下:
PUSH{cond} reglist
PUSH {r0, r4-r7} @将R0/R4-R7寄存器内容压入堆栈
POP:从满递减堆栈中弹出数据到寄存器,格式如下:
POP{cond} reglist
POP {r0, r4-r7} @R0,R4-R7寄存器内容压入堆栈
SWP:用于寄存器与存储器之间的数据交换,格式如下:
SWP{B}{cond} Rd, Rm, [Rn]
SWP R1, R1, [R0] @将R1寄存器与R0指向的存储单元的内容进行交换