480 likes | 631 Views
ARM 嵌入式系统结构与编程. 大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut.edu.cn 参考教材: 《ARM 嵌入式系统结构与编程 》 清华大学出版社 2009 年 3 月出版. ARM 微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器( PSR )处理指令、加载 / 存储指令、协处理器指令和杂类指令六大类。 本章将分类介绍 ARM 指令语法格式、指令编码格式和 ARM 指令的详细功能。. 第 4 章 ARM 指令集系统. 内容提要. 4 . 1 数据处理指令
E N D
ARM嵌入式系统结构与编程 • 大连理工大学软件学院 邱铁 办公楼409 Tel:87571521 E_mail: qiutie@dlut.edu.cn 参考教材:《ARM嵌入式系统结构与编程》 清华大学出版社2009年3月出版
ARM微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和杂类指令六大类。ARM微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和杂类指令六大类。 本章将分类介绍ARM指令语法格式、指令编码格式和ARM指令的详细功能。 第4章 ARM指令集系统
内容提要 • 4.1 数据处理指令 • 4.2 ARM分支指令 • 4.3 加载/存储指令 • 4.4 批量加载/存储指令 • 4.5 交换指令 • 4.6 程序状态寄存器PSR访问指令 • 4.7 协处理器操作指令 • 4.8 异常产生指令
4.1 数据处理指令 • 基本数据处理指令 • 乘法指令
基本数据处理指令 • ARM基本的数据处理指可以分为4类:数据传送指令、算术运算指令、逻辑运算指令和比较指令。 • ARM基本的数据处理指令汇编指令语法格式: • <opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>
1.数据传送指令 • MOV指令 • MOV指令的汇编语法格式为 • MOV{cond}{S} Rd, operand2 • 将第二操作数operand2表示的数据传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果或移位情况更新CPSR中的相应条件标志位。
MVN指令 • MNV指令的汇编语法格式为 • MVN{cond}{S} Rd, operand2 • 将第二操作数operand2表示的数据按位取反后传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果或移位情况更新CPSR中的相应条件标志位。
2.算术运算指令 • (1)ADD加法指令 • ADD加法指令的汇编语法格式为 • ADD{cond}{S} Rd, Rn, operand2 • ADD指令将operand2表示的数据与寄存器Rn中的值相加,并把结果传送到目标寄存器<Rd>中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(2)ADC带C标志位的加法指令 • ADC{cond}{S} Rd, Rn, operand2 • 功能:ADC带C标志位的加法指令将operand2表示的数据与寄存器Rn中的值相加,再加上CPSR中的C条件标志位的值,并把结果传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。该指令可以实现两个高于32位的数据相加运算。
SUB减法指令 • SUB{cond}{S} Rd, Rn, operand2 • 功能:SUB指令从寄存器Rn中减去operand2表示的数值,并把结果传送到目标寄存器<Rd>中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。 • 注意事项:当指令包含后缀“S”时,如果减法运算有借位,则C=0,否则C=1。
(4)SBC带C标志位的减法指令 • SBC{cond}{S} Rd, Rn, operand2 • SBC指令从寄存器<Rn>中减去operand2表示的数值,再减去寄存器CPSR中C条件标志位的反码,并把结果传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。该指令可以实现两个高于32位的数据相减运算。
RSB逆向减法指令 • RSB{cond}{S} Rd, Rn, operand2 • 功能:RSB指令从第2操作数operand2表示的数值中减去寄存器Rn 值,并把结果传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(6)RSC带C标志位的逆向减法指令 • RSC{cond}{S} Rd,Rn, operand2 • 功能:RSC指令从operand2表示的数值中减去寄存器Rn 值,再减去寄存器CPSR中 C条件标志位的反码,并把结果传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
3.逻辑运算指令 • (1)AND与逻辑运算指令 • AND{cond}{S} Rd, Rn, operand2 • 功能:AND指令将operand2表示的数值与寄存器Rn 的值按位做逻辑与操作,并把结果保存到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(2)ORR或逻辑运算指令 • ORR{cond}{S} Rd, Rn, operand2 • 功能:ORR指令将operand2表示的数值与寄存器Rn的值按位做逻辑或操作,并把结果保存到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(3)EOR异或逻辑运算指令 • ORR{cond}{S} Rd, Rn, operand2 • 功能:ORR指令将operand2表示的数值与寄存器Rn的值按位做逻辑异或操作,并把结果保存到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。EOR指令可用于将寄存器中某些位的值取反。
(4)BIC清除逻辑运算指令 • BIC{cond}{S} Rd, Rn, operand2 • 功能:BIC指令将寄存器Rn的值与operand2表示的数值的反码按位做逻辑与操作,并把结果保存到目标寄存器Rd中
4.比较指令 • 比较指令没有目标寄存器,只用作更新条件标志位,不保存运算结果,指令后缀无需加“S”。在程序设计中,根据操作的结果更新CPSR中相应的条件标志位,后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行。
(1)CMP相减比较指令 • CMP{cond} Rn, operand2 • 功能:CMP指令将寄存器Rn的值减去operand2表示的数值,根据操作结果和寄存器移位情况更新CPSR中的相应条件标志位。
(2)CMN负数比较指令 • CMN{cond} Rn, operand2 • 功能:CMN指令将寄存器Rn的值加上operand2表示的数值,根据操作结果和寄存器移位情况更新CPSR中的相应条件标志位。
(3)TST位测试指令 • TST{cond} Rn, operand2 • 功能:CMN指令将寄存器Rn的值与operand2表示的数值按位作逻辑“与”操作,根据操作结果和寄存器移位情况更新CPSR中的相应条件标志位。
4)TEQ相等测试指令 • TEQ{cond} Rn, operand2 • 功能:TEQ指令将寄存器Rn的值与operand2表示的数值按位作逻辑“异或”操作,根据操作结果和寄存器移位情况更新CPSR中的相应条件标志位。
乘法指令 • ARM乘法指令完成2个寄存器中数据的乘法,按照保存结果的数据长度可以分为两类:一类为32位的乘法指令,即乘法操作的结果为32位;另一类为64位的乘法指令,即乘法操作的结果为64位。
基本的数据处理指令还有很多注意事项,具本参考教材《ARM嵌入式系统结构与编程》第4章4.1节基本的数据处理指令还有很多注意事项,具本参考教材《ARM嵌入式系统结构与编程》第4章4.1节
(1)MUL • MUL{cond}{S} Rd, Rm, Rs • MUL指令实现两个32位的数(可以为无符号数,也可为有符号数)的乘积(Rm * Rs )并将结果存放到一个32位的寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(2)MLA • MLA{cond}{S} Rd, Rm, Rs, Rn • MLA指令实现两个32位的数(可以为无符号数,也可为有符号数)的乘积,再将乘积(Rm * Rs )加上第3个操作数Rn,并将结果存放到一个32位的寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(1)UMULL • UMULL{cond}{S} RdLo, RdHi, Rm, Rs • UMULL指令实现两个32位无符号数的乘积,乘积结果的高32位存放到一个32位的寄存器的RdHi,乘积结果的低32位存放到另一个32位的寄存器的RdLo;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(2)UMLAL • UMLAL{cond}{S} RdLo, RdHi, Rm, Rs • UMLAL指令将两个32位无符号数的64位乘积结果与由(RdHi: RdLo)表示的64位无符号数相加,加法结果的高32位存放到寄存器RdHi中,乘积结果的低32位存放到寄存器RdLo中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(3)SMULL • SMULL{cond}{S} RdLo, RdHi, Rm, Rs • SMULL指令实现两个32位有符号数的乘积,乘积结果的高32位存放到一个32位的寄存器的RdHi,乘积结果的低32位存放到另一个32位的寄存器的RdLo;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
(4)SMLAL • SMLAL{cond}{S} RdLo, RdHi, Rm, Rs • SMLAL指令将两个32位有符号数的64位乘积结果与由(RdHi: RdLo)表示的64位无符号数相加,加法结果的高32位存放到寄存器RdHi中,乘积结果的低32位存放到寄存器RdLo中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。
4.2 ARM分支指令 • 分支指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转: • 使用专门的分支指令。 • 直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,能够保存程序的返回地址值,从而实现在4GB连续地址空间的子程序调用。
分支指令B • 分支指令B可以实现跳转到指定的地址执行程序。 • 指令的汇编语法格式如下: • B{<cond>} <target_address>
带链接的分支指令BL • 带链接的分支指令BL可以实现跳转到指定的地址执行程序,同时BL指令还将程序计数器PC的值保存到LR寄存器中。 • 指令的汇编语法格式如下: • BL{<cond>} <target_address>
L决定是否保存返回地址。当有L时,指令将下一条指令地址保存到LR寄存器中;当无L时同B指令仅执行跳转,当前PC寄存器的值将不会保存到LR寄存器中。从指令的编码可以看出,B与BL指令的唯一区别是bit[24],当bit[24]=0是B指令,当bit[24]=1是BL指令。L决定是否保存返回地址。当有L时,指令将下一条指令地址保存到LR寄存器中;当无L时同B指令仅执行跳转,当前PC寄存器的值将不会保存到LR寄存器中。从指令的编码可以看出,B与BL指令的唯一区别是bit[24],当bit[24]=0是B指令,当bit[24]=1是BL指令。 • BL跳转指令编码中signed_immed_24的含义同B指令。
带状态切换的跳转指令 BX • BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。 • 指令的汇编语法格式如下: • B{<cond>} <Rm>
BX指令跳转到Rm指定的地址执行程序,如果Rm的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,目标地址的代码为Thumb代码;如果Rm的bit[0]为0,则跳转时自动将CPSR中的T标志位清0,目标地址的代码为ARM代码。BX指令跳转到Rm指定的地址执行程序,如果Rm的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,目标地址的代码为Thumb代码;如果Rm的bit[0]为0,则跳转时自动将CPSR中的T标志位清0,目标地址的代码为ARM代码。
带链接和状态切换的跳转指令 BLX • BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将程序计数器PC的当前内容保存到链接寄存器R14中。
(1)由程序标号给出目标地址 • 这种形式的BLX指令汇编语法格式如下: • BLX <target_address>
(2)寄存器的内容作为目标地址 • 这种形式的BLX指令汇编语法格式如下: • BLX{<cond>} <Rm>
第4章 ARM指令集系统 上半部 完
下半部内容提要 • 4.3 加载/存储指令 • 4.4 批量加载/存储指令 • 4.5 交换指令 • 4.6 程序状态寄存器PSR访问指令 • 4.7 协处理器操作指令 • 4.8 异常产生指令