【划重点】嵌入式系统原理与应用B —期末复习(第3章 ARM7TDMI指令系统)
第三章 ARM7TDMI指令系统
-
几个概念
-
机器指令 : 可供处理器译码电路直接译码执行的二进制编码指令
-
汇编指令 : 助记符化的机器指令
-
汇编器 :将汇编指令‘翻译’成机器指令的翻译器
-
汇编 :将汇编指令‘翻译’成机器指令的操作或过程
-
-
概述
-
ARM处理器基于RISC原理设计
-
ARM7TDMI(-s)支持32位ARM指令集和16位Thumb指令集
-
ARM指令集 功能全 但代码密度低
-
Thumb指令集 较高的代码密度 保持ARM大多数性能上的优势 是ARM指令集的子集
-
所有的ARM指令都是可以有条件执行的,而Thumb指令仅有一条指令具有条件执行功能
-
-
ARM7寻址方式的分类
-
数据处理指令操作数寻址方式
-
立即数寻址
-
操作数直接包含在指令中
-
取出指令的同时也就取出了对应操作数
-
举个栗子:
-
-
-
MOV R0,#0 ;将立即数0送入R0
SUB R0,R0,#1 ;R0的值减去立即数1,然后将结果送回R0
MOV R0,#0xFF000 ;将立即数0xFF000送入R0
-
寄存器寻址
-
当指令执行的操作数是ARM处理器某个寄存器中的数据时,在指令中直接指定该寄存器,使用其中的数据作为操作数,这种寻址方式称为寄存器寻址方式。
-
举个栗子:
-
-
MOV R0,R1 ;将R1中的值送入R0
SUB R0,R1,R2 ;将R1中的值减去R2的值,结果保存到R0
-
寄存器移位寻址
-
是ARM指令集特有的寻址方式
-
源寄存器操作数在送往 ARM ALU(算术逻辑单元)执行时,先经过桶形移位处理的方式,目的是为了增加代码的执行效率。
-
举个栗子:
-
-
MOV R0,R1,LSL #3 ;R1的值逻辑左移三位 放入R0
;无溢出时。即R0 = R1 * 23
MOV R0,R1,ROR R2 ;R1的值循环右移R2位,然后放入R0
AND R0,R1,R2,LSL R3 ;R2的值逻辑左移R3位,再和R1的值相“与”
;结果放入R0
-
存储器访问指令操作数寻址方式
-
寄存器间接寻址
-
指令的操作数存储在ARM处理器的某个寄存器指向的存储单元中
-
举个栗子:
-
-
LDR R0,[R1] ;将R1指向的存储器单元中的数据读出
;保存在R0中,R1是间址寄存器
-
基址变址寻址
-
基址寄存器中的内容与指令中给出的地址偏移量相,形成操作数的存储器地址。
-
基址加偏移量
-
-
LDR R0,[R1,#0x0C];将R1+0x0C所指向的存储器单元
;内容加载到R0中
STR R0,[R1,#-4]! ;将R0中的值存储到R1-4所指向的存储器
;单元中,然后R1=R1-4
-
基址加索引
LDR R0,[R1,R2] ;将R1+R2指向的存储器单元内容加载到R0中
STR R0,[R1,R2,LSL #2] ;将R0的值保存到R1+R2*4
;所指向的存储器单元中
-
相对寻址
-
是基址变址寻址的一种特例,其中基址寄存器是程序计数器PC
-
多寄存器寻址 或 块拷贝寻址
-
堆栈寻址
-
-
ARM7TDMI指令的条件执行
-
CPSR(当前程序状态寄存器)中的条件码标志满足 --- 执行本条指令 , 否则 --- 空操作
-
指令中含有 --- 执行条件
-
执行条件标志 --- 保存在CPSR
-
-
-
ARM汇编指令格式
{lab} <opcode> {cond} {S} <Rd>,<Rn> {,<operand2>}
opcode : 指令助记符
cond : 执行条件
S : 当前操作是否影响CPSR
Rd :目标寄存器,存放运算结果
Rn :第1个操作数的寄存器
operand2 : 第2个操作数
-
cond --- 执行条件
-
ADD R0,R1,R2
-
不带条件标志 --- 无条件AL 指令的执行不受条件标志位的影响
-
-
ADDS R0,R1,R2
-
指令的执行也不受条件标志的影响 --- 附带后缀S 指令执行结果将影响CPSR中条件标志位的值
-
-
ADDEQS R0,R1,R2
-
带条件标志EQ --- 相等则相加 CPSR中Z位置位时执行,否则不执行
-
-
SUMMARY :
-
条件后缀 --- 只影响指令是否执行 后缀声明了指令的执行条件
-
S后缀 --- 决定了本条指令是否根据本指令执行情况修改CPSR的条件标志
-
-
-
oprand2 --- 第2操作数
-
#immed_8r --- 常数表达式
-
Rm --- 寄存器方式
-
Rm,shift --- 寄存器移位方式
-
LSL 逻辑左移
-
LSR 逻辑右移
-
-
逻辑移位 --- 补‘0’
-
ASR 算术右移
-
ROR 循环右移
-
RRX 带扩展的循环右移
-
-
ARM7处理器指令系统概述
-
ARM指令码长 --- 32bit
-
Thumb指令码长 --- 16bit
-
ARM7复位后 --- 默认ARM指令集
-
-
伪指令
-
汇编器伪指令 --- 不生成目标代码
-
ARM伪指令 --- 生成逻辑等效的目标代码
-
-
ARM存储器访问指令
-
LDR 指令从存储器加载一个数据到寄存器中
-
LDR {cond} Rx,<地址>
-
-
STR 把寄存器中的一个数据存储到存储器中
-
STR {cond} Rx,<地址>
-
-
SWP 寄存器和储存器交换指令
-
SWP {cond} {B} Rd,Rm,[Rn]
-
-
-
ARM数据处理指令
-
数据传送指令
-
MOV --- 数据传送指令
-
MOV {<cond>} {S} Rd,operand2
-
-
MVN --- 数据非传送指令
-
-
算术逻辑运算指令
-
ADD 加法指令
-
格式 ADD{<cond>}{S} Rd,Rn,operand2
-
功能 Rd = Rn + operand2
-
举个栗子
-
ADD R0,R1,R2 ; R0 = R1 + R2
-
ADD R0,R1,#5 ; R0 = R1 + 5
-
ADD R0,R1,R2,LSL #2 ; R0 = R1 + R2 * 4
-
-
-
SUB 减法指令
-
格式 SUB{<cond>}{S} Rd,Rn,operand2
-
功能 Rd = Rn - operand2
-
举个栗子
-
SUB R0,R1,R2 ; R0 = R1 - R2
-
SUBS R0,R1,R2.LSL #2 ; R0 = R1 - R2 * 4
-
-
-
ADC 带进位加法指令
-
格式 ADC{<cond>}{S} Rd,Rn,operand2
-
功能 Rd = Rn + operand2 + Cy
-
-
SBC 带仅为减法指令
-
格式 SBC{<cond>}{S} Rd,Rn,operand2
-
功能 Rd = Rn - operand2 - !Cy
-
-
AND 逻辑“与”指令
-
格式 AND{<cond>}{S} Rd,Rn,operand2
-
功能 Rd = Rn & operand2
-
-
ORR 逻辑“或”指令
-
格式 ORR{<cond>}{S} Rd,Rn,operand2
-
功能 Rd = Rn | operand2
-
-
EOR 逻辑“异或”指令
-
格式 EOR{<cond>}{S} Rd,Rn,operand2
-
功能 Rd = Rn 异或 operand2
-
-
-
比较测试指令
-
CMP 比较指令
-
格式 CMP{<cond>} Rn,operand2
-
功能 Rn - operand2
-
备注 不保存试减结果,影响CPSR条件标志位
-
-
-
-
ARM分支指令
-
B 分支指令
-
格式 B{<cond>} label
-
功能 B指令跳转到标号lebel制定的地址执行程序
-
-
BL 带返回值的分值指令
-
格式 BL{<cond>} label
-
功能
-
-
LR ← PC - #4
PC = label
-
LR 备份 PC - #4 以便后返回执行 --- 子程序调用指令
-
BX 带状态切换的分支指令
-
格式 BX{<cond>} Rm
-
功能
-
PC = Rm[31:1] * 2
CPSR[T] = Rm[0]
-
用途 ARM/Thumb转换
-
ARM伪指令
-
LDR大范围的地址读取伪指令
-
格式 LDR{cond} Rm,=addr
-