文章目录
- 上一篇
- Thumb指令集概述
- Thumb指令详细介绍
- 数据处理指令
- 数据存储指令
- 转移指令
- 异常中断指令
- 下一篇
上一篇
嵌入式系统复习–ARM指令集(二)
Thumb指令集概述
在编写Thumb指令时,先要用伪指令CODE16声明(ADS的编译环境下),而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。
Thumb指令集特点:
- 采用16位二进制编码,而ARM指令是32位
- Thumb是压缩指令,先动态解压缩,然后作为标准的ARM指令执行
- 由CPSR的T位决定指令流。T置位,执行Thumb指令流,T清0执行ARM指令流
- Thumb指令集没有协处理器指令、信号量指令、乘加指令、64位乘法指令以及访问CPSR和SPSR的指令,而且指令的第2操作数受到限制
- 除了分支指令B有条件执行功能外,其他指令均无条件执行
- 大多数Thumb数据处理指令采用2地址格式
Thumb指令与ARM指令的异同:
- Thumb中也是采用Load/Store结构,有数据处理、数据传送及流控制指令
- 大多数Thumb指令是无条件执行的(除转移指令B),而所有ARM指令都是条件执行。许多Thumb数据处理指令采用2地址格式,即目的寄存器与源寄存器相同,而大多数ARM数据处理指令采用的是3地址格式
- 所有异常都会返回ARM模式状态,由于ARM微处理器字传送地址必须被4整除(字对准),半字传送地址必须可被2整除(即半字对准),但是Thumb是2个字节,所以进入异常Thumb的自然偏移与ARM不同
进入和退出Thumb模式的方式:
- 进入方式:BX和利用异常返回到Thumb
- 退出方式:BX和利用异常进入Thumb
Thumb指令详细介绍
数据处理指令
低寄存器指的是R0~R7, 高寄存器指的是R8 ~ R15
算术运算指令
-
ADD与SUB–低寄存器加法和减法
句法:op Rd, Rn, Rm op Rd, Rn, #expr3 op Rd, #expr8
用法:指令中Rd、Rn、Rm必须是低寄存器(R0~R7)。指令更新NZCV标志
-
ADD–高或低寄存器
句法:ADD Rd, Rm
用法:Rd <- Rd + Rm
Rd和Rm是低寄存器时,更新标记NZCV -
ADD与SUB–SP
句法:ADD SP, #expr SUB SP, #expr
用法:SP <- SP + expr
不影响条件标志码 -
ADD – PC或SP偏移量
句法:ADD Rd, Rp, #expr Rp为 SP或PC
用法:Rd <- Rp + #expr
不影响条件标志码 -
ADC、SBC、MUL
带进位位的加法、带进位位的减法、乘法
句法:op Rd, Rm
用法:
ADC: Rd <- Rd + Rm + C SBC: Rd <- Rd - Rm - (1 - C) 借位 MUL: Rd <- Rd * Rm
限制:Rd和Rm必须是低寄存器(R0~R7)
ADC和SBC影响NZCV
MUL影响NZ -
AND、ORR、EOR和BIC(按位逻辑运算)
句法:op Rd, Rm
用法:EOR异或,BIC:Rd AND NOT Rm
必须是低寄存器影响NZ标志 -
ASR、LSL、LSR、和ROR
算术右移、逻辑左移、逻辑右移、循环右移
句法:op Rd, Rs op Rd, Rm, #expr Rd、Rs、Rm必须是R0~R7范围内的寄存器
-
CMP和CMN(比较和比较负值)
句法:CMP Rn, #expr CMP Rn, Rm CMN Rn, Rm
用法:
只更新条件码标志,不存放结果
CMP: Rn - expr(或Rm)
CMN:Rm + Rn
其中:CMP Rn, Rm指令允许使用高寄存器 -
MOV、MVN和NEG(传送、传送非、取反)
句法:MOV Rd, #expr MOV Rd, Rm MVN Rd, Rm NEG Rd, Rm
用法:
MOV: Rd <- #expr(或Rm)
MVN: Rd <- NOT Rm
NEG: Rd <- Rm * (-1) -
TST(测试)
句法TST Rn, Rm
用法:
Rm AND Rn, 丢弃结果,更新条件码标志NZ
Rn、Rm必须在R0~R7范围内
数据存储指令
- 单寄存器数据存储指令(LDR和STR)
汇编格式<op> Rd, [Rn, <#off5>] // <op> = LDR | LDRB | STR | STRB <op> Rd, [Rn, <#off5>] // <op> = LDRH | STRH <op> Rd, [Rn, Rm] // <op> = LDR | LDRH | LDRSH | LDRB | LDRSB | STR | STRH | STRB <op> Rd, [PC, <#off8>] <op> Rd, [SP, <#off8>] // <op> = LDR | STR 该两条指令偏移量为8位
- 多寄存器数据存储指令
汇编格式:LDMIA Rn!, {<reg list>} STMIA Rn!, {<reg list>} POP {<reg list> {, PC}} PUSH {<reg list> {, LR}}
转移指令
汇编格式:
B <cond> <label> //目标为Thumb代码
B <label> //目标为Thumb代码
BL <label> //目标为Thumb代码
BLX <label> //目标为ARM代码
B{L}X Rm //目标为ARM或Thumb代码
- B分支指令,Thumb中唯一可条件执行的指令
- BL带链接的长分支
- BX分支指令,并可选择地切换指令集
- BLX带链接分支,并可选择地交换指令集
异常中断指令
- Thumb软件中断指令
汇编格式:SWI <8位立即数> //八位立即数为数学表达式取值为0~255内的整数
- 断点中断
汇编格式BKPT immed_8
下一篇
未完待续