1 / 200

嵌入式系统结构

嵌入式系统结构. 主讲教师: 邱铁 E_mail: qiutie@sohu.com Tel: 87571521 参考教材: 1. 嵌入式系统开发与应用,田泽.北京航空航天大学出版社 2. 嵌入式系系结构与编程,杜春蕾 . 清华大学出版社. 本讲将详细介绍各 ARM 指令,并给出一些典型的 ARM 功能代码段。. 第四讲 ARM 指令集. 本讲主要内容有. 4.1ARM 指令集. 4.2 一些基本的 ARM 指令功能段. 4.3Thumb 指令简介. 4.1 ARM 指令集. 4.1.1 跳转指令

eliora
Download Presentation

嵌入式系统结构

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. 嵌入式系统结构 • 主讲教师: • 邱铁 E_mail: qiutie@sohu.com • Tel: 87571521 • 参考教材: • 1.嵌入式系统开发与应用,田泽.北京航空航天大学出版社 • 2.嵌入式系系结构与编程,杜春蕾. 清华大学出版社

  2. 本讲将详细介绍各ARM指令,并给出一些典型的ARM功能代码段。本讲将详细介绍各ARM指令,并给出一些典型的ARM功能代码段。 第四讲 ARM指令集

  3. 本讲主要内容有 • 4.1ARM指令集 • 4.2一些基本的ARM指令功能段 • 4.3Thumb指令简介

  4. 4.1 ARM指令集 • 4.1.1 跳转指令 • 4.1.2 数据处理指令 • 4.1.3 乘法指令 • 4.1.4 杂类的算术指令 • 4.1.5 状态寄存器访问指令 • 4.1.6 Load/Store内存访问指令 • 4.1.7 批量Load/Store内存访问指令 • 4.1.8 信号量操作指令 • 4.1.9 异常中断产生指令 • 4.1.10ARM协处理器指令

  5. 4.1.1跳转指令 • 在ARM中有两种方式可以实现程序的跳转:一种是跳转指令;另一种是直接向寄存器(R15)中写入目标地址值。 • 通过直接向PC寄存器中写入目标地址值可以实现在4GB的地址空间中任意跳转,这种跳转指令又成为长跳转。如果在长跳转指令之前使用MOV LR,PC等指令,可以保存将来返回的地址值,就实现了在4GB的地址空间中的子程序调用。

  6. 跳转指令 • ARM的跳转指令可以从当前指令向前或向后的32MB的地址空间跳转。这类跳转指令有以下4种: • B 跳转指令 • BL 带返回的跳转指令 • BLX 带返回和状态切换的跳转指令 • BX 带状态切换的跳转指令

  7. 1. B(跳转指令)及BL(带返回的跳转指令) • B指令和BL指令均可以跳转到指令中的目标地址,这两个指令和目标地址处的指令都属于ARM指令集。二者也都可以根据CPSR中条件标志位的值与指令中的执行条件决定是否执行跳转操作。 • 二者的不同之处在于,B指令仅仅执行跳转操作;BL指令同时还将PC寄存器的值保存到LR寄存器中。

  8. B(跳转指令)及BL(带返回的跳转指令) • 指令的编码格式: • 指令的语法格式: • B{L}{<cond>} <target_address>

  9. B(跳转指令)及BL(带返回的跳转指令) • 其中: • L决定是否保存返回地址。当有L时,当PC寄存器的值将保存到LR寄存器中;当无L时,指令仅执行跳转,当前PC寄存器的值将不会保存到LR寄存器中。 • <cond>为指令执行的条件码。 • <target_address>为指令跳转的目标地址。这个目标地址的计算方法是:将指令中的24位带符号的补码立即数扩展为32位;将此32位数左移两位将得到的值增加到PC寄存器中,即得到跳转的目标地址。跳转的范围大致为-32MB~+32MB。

  10. 跳转指令 • 指令的使用 • BL指令用于实现子程序调用。子程序的返回可以通过将LR寄存器中的值复制到PC寄存器中来实现。通常有3种方法实现这种复制: • BX R14 • MOV PC, R14 • 当子程序入口中使用了 STMFD R13!,{<registers>,R14}时, 可以用指令LDMFD R13!,{<registers>,PC}返回

  11. B(跳转指令)及BL(带返回的跳转指令) 示例解析

  12. 2. BLX(1) • 第一种格式的BLX指令记作BLX(1)。 BLX(1)指令从ARM指令集跳转到指令中指定的目标地址,并将程序状态切换为Thumb状态,该指令同时将PC寄存器中的内容复制到LR寄存器中。 • 本指令属于无条件执行的指令(即条件码为AL)

  13. BLX(1) • 指令的编码格式: • 指令的语法格式: • BLX <target_address> • 其中:<target_address>的用法与B及BL指令中的用法相同。 • H位加到目标地址的第一位(为1时半字操作)

  14. BLX(1) 指令的使用: • 当子程序为Thumb指令集,而调用者为ARM指令集时,可以通过BLX指令实现子程序调用和程序状态的切换。 • 子程序的返回可以通过将LR寄存器(R14)的值复制到PC寄存器中来实现。 • BX R14 • 当子程序入口中使用了PUSH {<registers>,R14}时,可以用指令POP{<registers>,PC}

  15. 3. BLX(2) • 第一种格式的BLX指令记作BLX(2)。 BLX(2)指令从ARM指令集跳转到指令中指定的目标地址,目标地址的指令可以是ARM指令,也可以是Thumb指令。目标地址放在指令中的寄存器<Rm>中,该地址的bit[0]值为0,目标地址出的指令类型由CPSR中的T位决定。该指令同时将PC寄存器的内容复制到LR寄存器中。

  16. BLX(2) • 指令的编码格式: • 指令的语法格式: • BLX {<cond>} <Rm>

  17. BLX(2) • 其中: • <cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。 • <Rm>该寄存器中为跳转的目标地址。当<Rm>寄存器的bit[0]值为0时,目标地址处的指令为ARM指令;当<Rm>寄存器的bit[0]值为1时,目标地址处的指令为Thumb指令。当<Rm>寄存器为R15时,会产生不可预知的结果

  18. BLX(2) 指令的使用: • 当Rm[1:0]=0b10时,由于ARM指令是字对齐的,这时会产生不可预料的结果

  19. 4. BX指令 • BX指令跳转到指令中指定的目标地址,目标地址处的指令可以是ARM指令,也可以是Thumb指令。目标地址值为指令的值和0xFFFFFFFE做与操作的结果,目标地址处的指令类型由寄存器<Rm>的bit[0]决定。 • 指令的编码格式:

  20. BX指令 • 指令的语法格式: • BX {<cond>} <Rm> • 其中: • <cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。 • <Rm>该寄存器中为跳转的目标地址。当<Rm>寄存器的bit[0]值为0时,目标地址处的指令为ARM指令;当<Rm>寄存器的bit[0]值为1时,目标地址处的指令为Thumb指令。

  21. BX指令 指令的使用: • 当Rm[1:0]=0b10时,由于ARM指令是字对齐的,这时会产生不可预料的结果。 • 当<Rm>为PC寄存器时,即指令BX PC将程序跳转到当前指令下面第2条指令处执行,在这种情况下推荐使用MOV PC,PC及指令ADD PC , PC,#0来实现这种功能。

  22. 4.1.2数据处理指令 • 数据处理指令大致分为3类:数据传送指令、算术逻辑运算指令、比较指令。 • 数据传送指令用于向寄存器中传入一个常数。该指令包括一个目标寄存器和一个操作数。 • 算术逻辑运算指令通常包括一个目标寄存器和两个源操作数。算术逻辑运算指令将运算结果存入目标寄存器,同时更新CPSR中相应的条件标志位。 • 比较指令不保存运算结果,只更新CPSR中相应的条件标志位。

  23. 数据处理指令包括: MOV 数据传送指令 MVN 数据反求传送指令 CMP 比较指令 CMN 基于相反数的比较指令 TST 位测试指令 TEQ 相等测试指令 ADD 加法指令 SUB 减法指令 RSB 逆向减法指令 ADC 带位加法指令 SBC 带位减法指令 RSC 带位逆向减法指令 AND 逻辑与操作指令 BIC 为清除指令 EOR 逻辑异或操作指令 ORR 逻辑或操作指令 数据处理指令

  24. 1. MOV传送指令 • MOV指令将<shifter_operand>表示的数据传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • MOV {<cond>} {S} <Rd>,<shifter_operand>

  25. MOV传送指令 • 其中: • <cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。 • S决定指令的操作是否影响CPSR中条件标志位的值。当没有S时指令不更新CPSR中条件标志位的值;当有S时指令更新CPSR中条件标志位的值。当有S时有两种情况:若指令中的目标寄存器<Rd>为R15,则当前处理器模式对应的SPSR的值被复制到CPSR寄存器中,对于用户模式和系统模式,指令执行的结果将不可预料;

  26. MOV传送指令 • 若指令中的目标寄存器<Rd>不为R15,指令根据传送的数值设置CPSR中的N位和Z位,并根据移位器的进位值carryout设置CPSR的C位, CPSR中的其他位不受影响 • <Rd>寄存器为目标寄存器。 • <shifter_operand>为向目标寄存器传送的数据。

  27. MOV传送指令 • 指令的使用: • 将数据从一个寄存器传送到另一个寄存中 • 将一个常数传送到一个寄存器中。 • 实现单纯的移位操作。 • 当PC寄存器作为目标寄存器时可以实现程序跳转。 • 当PC寄存器作为目标寄存器且指令中S位被设置时,指令在执行跳转操作的同时,将当前处理器模式的SPSR寄存器内容复制到CPSR中。

  28. 2. MVN传送指令 • MVN指令将<shifter_operand>表示的数据的反码传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • MVN {<cond>} {S} <Rd>,<shifter_operand> • 其中,各参数的用法与MOV传送指令相同。

  29. MVN传送指令 • 指令的使用: • 向寄存器中传送一个负数。 • 求一个数的反码。 示例解析

  30. 3. ADD加法指令 • ADD指令将<shifter_operand>表示的数据与寄存器<Rn>中的值相加,并把结果传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • ADD {<cond>} {S} <Rd>,<Rn>,<shifter_operand>

  31. ADD加法指令 • 其中: • <cond>、S和Rd的用法与MOV传送指令相同。 • <Rn>寄存器为第1个源操作数所在的寄存器。 • <shifter_operand>为第2个操作数。

  32. ADD加法指令 • 指令的使用: • 实现两个操作数相加 示例解析

  33. 4. ADC带位加法指令 • ADC指令将<shifter_operand>表示的数据与寄存器<Rn>中的值相加,再加上CPSR中的C条件标志位的值,并把结果传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • ADC {<cond>} {S} <Rd>,<Rn>,<shifter_operand> • 其中,各参数用法与ADD传送指令相同。

  34. ADC带位加法指令 • 指令的使用 • ADC 指令和ADD指令联合使用可以实现两个64位的操作数相加。如果寄存器R0和R1中放置一个64位的源操作数,其中R0中放置低32位数值;寄存器R2和R3中放置另一个64位的源操作数,其中R2中放置低32位数值。 示例解析

  35. 5. SUB减法指令 • SUB指令从寄存器<Rn>中减去<shifter_operand>表示的数值,并把结果传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • SUB {<cond>} {S} <Rd>,<Rn>,<shifter_operand> • 其中,各参数用法与ADD传送指令相同。

  36. SUB减法指令 • 指令的使用: • SUB指令实现两个操作数相减。 示例解析

  37. 6. SBC带位减法指令 • SBC指令从寄存器<Rn>中减去<shifter_operand>表示的数值,再减去寄存器CPSR中C条件标志位的反码,并把结果传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • SBC {<cond>} {S} <Rd>,<Rn>,<shifter_operand> • 其中,各参数用法与ADD传送指令相同。

  38. SBC带位减法指令 • 指令的使用: • SBC指令和SUBS指令联合使用可以实现两个64位的操作数相减。如果寄存器R0和R1中放置一个64位的源操作数,其中R0中放置低32位数值;寄存器R2和R3中放置另一个64位的源操作数,其中R2中放置低32位数值。 示例解析

  39. 7. RSB逆向减法指令 • RSB指令从中<shifter_operand>表示的数值中减去寄存器<Rn> 值,并把结果传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式:

  40. RSB逆向减法指令 • 指令的语法格式: RSB {<cond>} {S} <Rd>,<Rn>,<shifter_operand> • 其中: <Rn>寄存器为第2个操作数所在的寄存器 <shifter_operand>为第1个操作数。 其他参数用法与ADD传送指令相同。

  41. RSB逆向减法指令 • 指令的使用: • RSB指令实现两个操作数相减。 示例解析

  42. 8. RSC带位逆向减法指令 • RSC指令从中<shifter_operand>表示的数值中减去寄存器<Rn> 值,再减去寄存器CPSR中 C条件标志位的反码,并把结果传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • RSC {<cond>} {S} <Rd>,<Rn>,<shifter_operand> • 其中,各参数用法与RSB逆向减法指令相同。

  43. RSC带位逆向减法指令 • 指令的使用: • RSC指令和RSBC指令联合使用可以求一个64位数值的负数。 • 如果寄存器R0和R1中放置一个64位数,其中R0中放置低32位数值;寄存器R2和R3中放置其负数,其中R2中放置低32位数值。 示例解析

  44. 9. AND逻辑与操作指令 • AND指令将<shifter_operand>表示的数值与寄存器<Rn> 的值按位做逻辑与操作,并把结果保存到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • AND {<cond>} {S} <Rd>,<Rn>,<shifter_operand>

  45. AND逻辑与操作指令 • 其中: <Rn>寄存器为第1个操作数所在的寄存器 <shifter_operand>为第2个操作数。 其他参数用法与MOV传送指令相同。

  46. AND逻辑与操作指令 • 指令的使用: AND指令可用于提取寄存器中某些位的值。具体作法是设置一个掩码值,将该值中对应于寄存器中欲提取的位设为1,其他的位设置成0。将寄存器的值与该掩码值作与操作即可得到想提取的位的值。

  47. 10. ORR逻辑或操作指令 • ORR指令将<shifter_operand>表示的数值与寄存器<Rn> 的值按位做逻辑或操作,并把结果保存到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • ORR {<cond>} {S} <Rd>,<Rn>,<shifter_operand> • 其中,各参数用法与AND指令相同。

  48. ORR逻辑或操作指令 • 指令的使用 • ORR指令可用于将寄存器中某些位的值设置成1。具体作法是设置一个掩码值,将该值中对应于寄存器中欲提取的位设为0,其他的位设置成1。将寄存器的值与该掩码值做逻辑或操作即可得到想提取的位的值。 示例解析

  49. 11. EOR逻辑异或操作指令 • EOR指令将<shifter_operand>表示的数值与寄存器<Rn> 的值按位做逻辑异或操作,并把结果保存到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。 • 指令的编码格式: • 指令的语法格式: • EOR {<cond>} {S} <Rd>,<Rn>,<shifter_operand> • 其中,各参数用法与AND指令相同。

  50. EOR逻辑异或操作指令 • 指令的使用: • EOR指令可用于将寄存器中某些位的值取反。将某一位与0做逻辑异或操作,该位值不变:将某一位与1做逻辑异或操作,该位置将被求反。

More Related