1 / 48

大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

ARM 嵌入式系统结构与编程. 大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut.edu.cn 参考教材: 《ARM 嵌入式系统结构与编程 》 清华大学出版社 2009 年 3 月出版. ARM 微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器( PSR )处理指令、加载 / 存储指令、协处理器指令和杂类指令六大类。 本章将分类介绍 ARM 指令语法格式、指令编码格式和 ARM 指令的详细功能。. 第 4 章 ARM 指令集系统. 内容提要. 4 . 1 数据处理指令

talmai
Download Presentation

大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ARM嵌入式系统结构与编程 • 大连理工大学软件学院 邱铁 办公楼409 Tel:87571521 E_mail: qiutie@dlut.edu.cn 参考教材:《ARM嵌入式系统结构与编程》 清华大学出版社2009年3月出版

  2. ARM微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和杂类指令六大类。ARM微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和杂类指令六大类。 本章将分类介绍ARM指令语法格式、指令编码格式和ARM指令的详细功能。 第4章 ARM指令集系统

  3. 内容提要 • 4.1 数据处理指令 • 4.2 ARM分支指令 • 4.3 加载/存储指令 • 4.4 批量加载/存储指令 • 4.5 交换指令 • 4.6 程序状态寄存器PSR访问指令 • 4.7 协处理器操作指令 • 4.8 异常产生指令

  4. 4.1 数据处理指令 • 基本数据处理指令 • 乘法指令

  5. 基本数据处理指令 • ARM基本的数据处理指可以分为4类:数据传送指令、算术运算指令、逻辑运算指令和比较指令。 • ARM基本的数据处理指令汇编指令语法格式: • <opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>

  6. 1.数据传送指令 • MOV指令 • MOV指令的汇编语法格式为 • MOV{cond}{S} Rd, operand2 • 将第二操作数operand2表示的数据传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果或移位情况更新CPSR中的相应条件标志位。

  7. MVN指令 • MNV指令的汇编语法格式为 • MVN{cond}{S} Rd, operand2 • 将第二操作数operand2表示的数据按位取反后传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果或移位情况更新CPSR中的相应条件标志位。

  8. 2.算术运算指令 • (1)ADD加法指令 • ADD加法指令的汇编语法格式为 • ADD{cond}{S} Rd, Rn, operand2 • ADD指令将operand2表示的数据与寄存器Rn中的值相加,并把结果传送到目标寄存器<Rd>中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  9. (2)ADC带C标志位的加法指令 • ADC{cond}{S} Rd, Rn, operand2 • 功能:ADC带C标志位的加法指令将operand2表示的数据与寄存器Rn中的值相加,再加上CPSR中的C条件标志位的值,并把结果传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。该指令可以实现两个高于32位的数据相加运算。

  10. SUB减法指令 • SUB{cond}{S} Rd, Rn, operand2 • 功能:SUB指令从寄存器Rn中减去operand2表示的数值,并把结果传送到目标寄存器<Rd>中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。 • 注意事项:当指令包含后缀“S”时,如果减法运算有借位,则C=0,否则C=1。

  11. (4)SBC带C标志位的减法指令 • SBC{cond}{S} Rd, Rn, operand2 • SBC指令从寄存器<Rn>中减去operand2表示的数值,再减去寄存器CPSR中C条件标志位的反码,并把结果传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。该指令可以实现两个高于32位的数据相减运算。

  12. RSB逆向减法指令 • RSB{cond}{S} Rd, Rn, operand2 • 功能:RSB指令从第2操作数operand2表示的数值中减去寄存器Rn 值,并把结果传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  13. (6)RSC带C标志位的逆向减法指令 • RSC{cond}{S} Rd,Rn, operand2 • 功能:RSC指令从operand2表示的数值中减去寄存器Rn 值,再减去寄存器CPSR中 C条件标志位的反码,并把结果传送到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  14. 3.逻辑运算指令 • (1)AND与逻辑运算指令 • AND{cond}{S} Rd, Rn, operand2 • 功能:AND指令将operand2表示的数值与寄存器Rn 的值按位做逻辑与操作,并把结果保存到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  15. (2)ORR或逻辑运算指令 • ORR{cond}{S} Rd, Rn, operand2 • 功能:ORR指令将operand2表示的数值与寄存器Rn的值按位做逻辑或操作,并把结果保存到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  16. (3)EOR异或逻辑运算指令 • ORR{cond}{S} Rd, Rn, operand2 • 功能:ORR指令将operand2表示的数值与寄存器Rn的值按位做逻辑异或操作,并把结果保存到目标寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。EOR指令可用于将寄存器中某些位的值取反。

  17. (4)BIC清除逻辑运算指令 • BIC{cond}{S} Rd, Rn, operand2 • 功能:BIC指令将寄存器Rn的值与operand2表示的数值的反码按位做逻辑与操作,并把结果保存到目标寄存器Rd中

  18. 4.比较指令 • 比较指令没有目标寄存器,只用作更新条件标志位,不保存运算结果,指令后缀无需加“S”。在程序设计中,根据操作的结果更新CPSR中相应的条件标志位,后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行。

  19. (1)CMP相减比较指令 • CMP{cond} Rn, operand2 • 功能:CMP指令将寄存器Rn的值减去operand2表示的数值,根据操作结果和寄存器移位情况更新CPSR中的相应条件标志位。

  20. (2)CMN负数比较指令 • CMN{cond} Rn, operand2 • 功能:CMN指令将寄存器Rn的值加上operand2表示的数值,根据操作结果和寄存器移位情况更新CPSR中的相应条件标志位。

  21. (3)TST位测试指令 • TST{cond} Rn, operand2 • 功能:CMN指令将寄存器Rn的值与operand2表示的数值按位作逻辑“与”操作,根据操作结果和寄存器移位情况更新CPSR中的相应条件标志位。

  22. 4)TEQ相等测试指令 • TEQ{cond} Rn, operand2 • 功能:TEQ指令将寄存器Rn的值与operand2表示的数值按位作逻辑“异或”操作,根据操作结果和寄存器移位情况更新CPSR中的相应条件标志位。

  23. 乘法指令 • ARM乘法指令完成2个寄存器中数据的乘法,按照保存结果的数据长度可以分为两类:一类为32位的乘法指令,即乘法操作的结果为32位;另一类为64位的乘法指令,即乘法操作的结果为64位。

  24. 基本的数据处理指令还有很多注意事项,具本参考教材《ARM嵌入式系统结构与编程》第4章4.1节基本的数据处理指令还有很多注意事项,具本参考教材《ARM嵌入式系统结构与编程》第4章4.1节

  25. 1. 32位乘法指令

  26. (1)MUL • MUL{cond}{S} Rd, Rm, Rs • MUL指令实现两个32位的数(可以为无符号数,也可为有符号数)的乘积(Rm * Rs )并将结果存放到一个32位的寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  27. (2)MLA • MLA{cond}{S} Rd, Rm, Rs, Rn • MLA指令实现两个32位的数(可以为无符号数,也可为有符号数)的乘积,再将乘积(Rm * Rs )加上第3个操作数Rn,并将结果存放到一个32位的寄存器Rd中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  28. 2. 64位乘法指令

  29. (1)UMULL • UMULL{cond}{S} RdLo, RdHi, Rm, Rs • UMULL指令实现两个32位无符号数的乘积,乘积结果的高32位存放到一个32位的寄存器的RdHi,乘积结果的低32位存放到另一个32位的寄存器的RdLo;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  30. (2)UMLAL • UMLAL{cond}{S} RdLo, RdHi, Rm, Rs • UMLAL指令将两个32位无符号数的64位乘积结果与由(RdHi: RdLo)表示的64位无符号数相加,加法结果的高32位存放到寄存器RdHi中,乘积结果的低32位存放到寄存器RdLo中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  31. (3)SMULL • SMULL{cond}{S} RdLo, RdHi, Rm, Rs • SMULL指令实现两个32位有符号数的乘积,乘积结果的高32位存放到一个32位的寄存器的RdHi,乘积结果的低32位存放到另一个32位的寄存器的RdLo;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  32. (4)SMLAL • SMLAL{cond}{S} RdLo, RdHi, Rm, Rs • SMLAL指令将两个32位有符号数的64位乘积结果与由(RdHi: RdLo)表示的64位无符号数相加,加法结果的高32位存放到寄存器RdHi中,乘积结果的低32位存放到寄存器RdLo中;如果指令包含后缀“S”,则根据操作结果更新CPSR中的相应条件标志位。

  33. 4.2 ARM分支指令 • 分支指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转: • 使用专门的分支指令。 • 直接向程序计数器PC写入跳转地址值。

  34. 通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV   LR,PC等类似指令,能够保存程序的返回地址值,从而实现在4GB连续地址空间的子程序调用。

  35. 分支指令B • 分支指令B可以实现跳转到指定的地址执行程序。 • 指令的汇编语法格式如下: • B{<cond>} <target_address>

  36. 在指令的汇编语法中target_address这个目标地址的计算方法是:将指令中的24位带符号的补码立即数扩展为32位;将此32位数左移两位将得到的值写入到程序计数器PC中,即跳转到目标地址。能够实现跳转的范围为-32MB~+32MB。

  37. 带链接的分支指令BL • 带链接的分支指令BL可以实现跳转到指定的地址执行程序,同时BL指令还将程序计数器PC的值保存到LR寄存器中。 • 指令的汇编语法格式如下: • BL{<cond>} <target_address>

  38. 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指令。

  39. 带状态切换的跳转指令 BX • BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。 • 指令的汇编语法格式如下: • B{<cond>} <Rm>

  40. 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代码。

  41. 带链接和状态切换的跳转指令 BLX • BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将程序计数器PC的当前内容保存到链接寄存器R14中。

  42. (1)由程序标号给出目标地址 • 这种形式的BLX指令汇编语法格式如下: • BLX <target_address>

  43. 目标地址target_address的计算方法:先对指令中定义的有符号24位偏移量用符号位扩展为32位,并将该32位数左移2位,然后将其加到程序计数器PC中,H位(bit[24])加到目标地址的第1位(bit[1]),目标地址总是Thumb指令。跳转的范围为-32MB~+32MB。

  44. (2)寄存器的内容作为目标地址 • 这种形式的BLX指令汇编语法格式如下: • BLX{<cond>} <Rm>

  45. BLX指令跳转到Rm指定的地址执行程序,如果Rm的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,目标地址的代码为Thumb代码;如果Rm的bit[0]为0,则跳转时自动将CPSR中的T标志位清0,目标地址的代码为ARM代码。

  46. 第4章 ARM指令集系统 上半部 完

  47. 下半部内容提要 • 4.3 加载/存储指令 • 4.4 批量加载/存储指令 • 4.5 交换指令 • 4.6 程序状态寄存器PSR访问指令 • 4.7 协处理器操作指令 • 4.8 异常产生指令

More Related