嵌入式系统结构

上传人:pu****.1 文档编号:592813229 上传时间:2024-09-22 格式:PPT 页数:200 大小:1.46MB
返回 下载 相关 举报
嵌入式系统结构_第1页
第1页 / 共200页
嵌入式系统结构_第2页
第2页 / 共200页
嵌入式系统结构_第3页
第3页 / 共200页
嵌入式系统结构_第4页
第4页 / 共200页
嵌入式系统结构_第5页
第5页 / 共200页
点击查看更多>>
资源描述

《嵌入式系统结构》由会员分享,可在线阅读,更多相关《嵌入式系统结构(200页珍藏版)》请在金锄头文库上搜索。

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

2、指令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协处理器指令协处理器指令5TM54.1.1跳转指令在在ARM中有两种方式可以实现程序的跳转:一种中有两种方式可以实现程序的跳转:一种是跳转指令;另一种是直接向寄存器(是跳转指令;另一种是直接向寄存器(R15)中)中写入目标地址值。写入目标地址值。通过直接向通过直接向PC寄存器中写入目标

3、地址值可以实寄存器中写入目标地址值可以实现在现在4GB的地址空间中任意跳转,这种跳转指令的地址空间中任意跳转,这种跳转指令又成为长跳转。如果在长跳转指令之前使用又成为长跳转。如果在长跳转指令之前使用MOV LR,PC等指令,可以保存将来返回的地址值,就等指令,可以保存将来返回的地址值,就实现了在实现了在4GB的地址空间中的子程序调用。的地址空间中的子程序调用。6TM6 跳转指令ARM的跳转指令可以从当前指令向前或向后的的跳转指令可以从当前指令向前或向后的32MB的的地址空间跳转。这类跳转指令有以下地址空间跳转。这类跳转指令有以下4种:种:B 跳转指令跳转指令BL 带返回的跳转指令带返回的跳转指

4、令BLX 带返回和状态切换的跳转指令带返回和状态切换的跳转指令BX 带状态切换的跳转指令带状态切换的跳转指令7TM71. B(跳转指令)及BL(带返回的跳转指令)B指令和指令和BL指令均可以跳转到指令中的目标地址,这两指令均可以跳转到指令中的目标地址,这两个指令和目标地址处的指令都属于个指令和目标地址处的指令都属于ARM指令集。二者也指令集。二者也都可以根据都可以根据CPSR中条件标志位的值与指令中的执行条中条件标志位的值与指令中的执行条件决定是否执行跳转操作。件决定是否执行跳转操作。二者的不同之处在于,二者的不同之处在于,B指令仅仅执行跳转操作;指令仅仅执行跳转操作;BL指指令同时还将令同时

5、还将PC寄存器的值保存到寄存器的值保存到LR寄存器中。寄存器中。 8TM8B(跳转指令)及BL(带返回的跳转指令) n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nBL 9TM9B(跳转指令)及BL(带返回的跳转指令) n其中:其中:n L决定是否保存返回地址。当有决定是否保存返回地址。当有L时,当时,当PC寄存器的值寄存器的值将保存到将保存到LR寄存器中;当无寄存器中;当无L时,指令仅执行跳转,当前时,指令仅执行跳转,当前PC寄存器的值将不会保存到寄存器的值将不会保存到LR寄存器中。寄存器中。n 为指令执行的条件码。为指令执行的条件码。n 为指令跳转的目标地址。这个目标

6、为指令跳转的目标地址。这个目标地址的计算方法是:将指令中的地址的计算方法是:将指令中的24位带符号的补码立即数扩位带符号的补码立即数扩展为展为32位;将此位;将此32位数左移两位将得到的值增加到位数左移两位将得到的值增加到PC寄存寄存器中,即得到跳转的目标地址。跳转的范围大致为器中,即得到跳转的目标地址。跳转的范围大致为-32MB+32MB。10TM10 跳转指令指令的使用指令的使用BL指令用于实现子程序调用。子程序的返回可以通过将指令用于实现子程序调用。子程序的返回可以通过将LR寄存器中的值复制到寄存器中的值复制到PC寄存器中来实现。通常有寄存器中来实现。通常有3种种方法实现这种复制:方法实

7、现这种复制:BX R14MOV PC, R14当子程序入口中使用了当子程序入口中使用了 STMFD R13!,R14时,时, 可以用指令可以用指令LDMFD R13!,PC返回返回11TM11B(跳转指令)及BL(带返回的跳转指令) 示例解析示例解析12TM122. BLX(1)第一种格式的第一种格式的BLX指令记作指令记作BLX(1)。 BLX(1)指令从指令从ARM指令集跳转到指令中指定的目标地址,并将程序状指令集跳转到指令中指定的目标地址,并将程序状态切换为态切换为Thumb状态,该指令同时将状态,该指令同时将PC寄存器中的内寄存器中的内容复制到容复制到LR寄存器中。寄存器中。本指令属于

8、无条件执行的指令(即条件码为本指令属于无条件执行的指令(即条件码为AL)13TM13BLX(1) n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nBLX n其中:其中:的用法与的用法与B及及BL指令中的用法相同。指令中的用法相同。n位加到目标地址的第一位位加到目标地址的第一位( (为为1 1时半字操作时半字操作) )14TM14 BLX(1)指令的使用:指令的使用: 当子程序为当子程序为Thumb指令集,而调用者为指令集,而调用者为ARM指令集时,指令集时,可以通过可以通过BLX指令实现子程序调用和程序状态的切换。指令实现子程序调用和程序状态的切换。子程序的返回可以通过将

9、子程序的返回可以通过将LR寄存器(寄存器(R14)的值复制到)的值复制到PC寄存器中来实现。寄存器中来实现。BX R14当子程序入口中使用了当子程序入口中使用了PUSH ,R14时,可时,可以用指令以用指令POP,PC15TM153. BLX(2)第一种格式的第一种格式的BLX指令记作指令记作BLX(2)。 BLX(2)指令从指令从ARM指令集跳转到指令中指定的目标地址,目标地址的指令集跳转到指令中指定的目标地址,目标地址的指令可以是指令可以是ARM指令,也可以是指令,也可以是Thumb指令。目标地址指令。目标地址放在指令中的寄存器放在指令中的寄存器中,该地址的中,该地址的bit0值为值为0,

10、目标地址出的指令类型由目标地址出的指令类型由CPSR中的中的T位决定。该指令同位决定。该指令同时将时将PC寄存器的内容复制到寄存器的内容复制到LR寄存器中。寄存器中。16TM16BLX(2) n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nBLX 17TM17 BLX(2)其中:其中:p 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。p 该寄存器中为跳转的目标地址。当该寄存器中为跳转的目标地址。当寄存器寄存器的的bit0值为值为0时,目标地址处的指令为时,目标地址处的指令为ARM指令;当指令;当寄存器的寄存器的bit0值为值为

11、1时,目标地址处的指令为时,目标地址处的指令为Thumb指令。当指令。当寄存器为寄存器为R15时,会产生不可预时,会产生不可预知的结果知的结果18TM18 BLX(2)指令的使用指令的使用: 当当Rm1:0=0b10时,由于时,由于ARM指令是字对齐的,这指令是字对齐的,这时会产生不可预料的结果时会产生不可预料的结果19TM194. BX指令BX指令跳转到指令中指定的目标地址,目标地址处的指指令跳转到指令中指定的目标地址,目标地址处的指令可以是令可以是ARM指令,也可以是指令,也可以是Thumb指令。目标地址值指令。目标地址值为指令的值和为指令的值和0xFFFFFFFE做与操作的结果,目标地址

12、做与操作的结果,目标地址处的指令类型由寄存器处的指令类型由寄存器的的bit0决定。决定。n指令的编码格式:指令的编码格式:20TM20 BX指令指令的语法格式指令的语法格式:BX 其中:其中: 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。n 该寄存器中为跳转的目标地址。当该寄存器中为跳转的目标地址。当寄存器寄存器的的bit0值为值为0时,目标地址处的指令为时,目标地址处的指令为ARM指令;当指令;当寄存器的寄存器的bit0值为值为1时,目标地址处的指令为时,目标地址处的指令为Thumb指令。指令。21TM21 BX指令指令的使用:指令的使用:当当

13、Rm1:0=0b10时,由于时,由于ARM指令是字对齐的,这时指令是字对齐的,这时会产生不可预料的结果。会产生不可预料的结果。当当为为PC寄存器时,即指令寄存器时,即指令BX PC将程序跳转到当将程序跳转到当前指令下面第前指令下面第2条指令处执行,在这种情况下推荐使用条指令处执行,在这种情况下推荐使用MOV PC,PC及指令及指令ADD PC , PC,#0来实现这种功能。来实现这种功能。22TM224.1.2数据处理指令数据处理指令大致分为数据处理指令大致分为3类:数据传送指令、算类:数据传送指令、算术逻辑运算指令、比较指令。术逻辑运算指令、比较指令。数据传送指令用于向寄存器中传入一个常数。

14、该数据传送指令用于向寄存器中传入一个常数。该指令包括一个目标寄存器和一个操作数。指令包括一个目标寄存器和一个操作数。算术逻辑运算指令通常包括一个目标寄存器和两算术逻辑运算指令通常包括一个目标寄存器和两个源操作数。算术逻辑运算指令将运算结果存入个源操作数。算术逻辑运算指令将运算结果存入目标寄存器,同时更新目标寄存器,同时更新CPSR中相应的条件标志中相应的条件标志位。位。比较指令不保存运算结果,只更新比较指令不保存运算结果,只更新CPSR中相应中相应的条件标志位。的条件标志位。23TM23 数据处理指令数据处理指令包括:数据处理指令包括:MOV 数据传送指令数据传送指令MVN 数据反求传送指令数

15、据反求传送指令CMP 比较指令比较指令CMN 基于相反数的比较基于相反数的比较指令指令TST 位测试指令位测试指令TEQ 相等测试指令相等测试指令ADD 加法指令加法指令SUB 减法指令减法指令RSB 逆向减法指令逆向减法指令ADC 带位加法指令带位加法指令SBC 带位减法指令带位减法指令RSC 带位逆向减法指令带位逆向减法指令AND 逻辑与操作指令逻辑与操作指令BIC 为清除指令为清除指令EOR 逻辑异或操作指令逻辑异或操作指令ORR 逻辑或操作指令逻辑或操作指令24TM241. MOV传送指令MOV指令将指令将表示的数据传送到目标表示的数据传送到目标寄存器寄存器中,并根据操作的结果更新中,

16、并根据操作的结果更新CPSR中相应的中相应的条件标志位。条件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:MOV S ,25TM25 MOV传送指令其中:其中: 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。n S决定指令的操作是否影响决定指令的操作是否影响CPSR中条件标志位的值。中条件标志位的值。当没有当没有S时指令不更新时指令不更新CPSR中条件标志位的值;当有中条件标志位的值;当有S时指令更新时指令更新CPSR中条件标志位的值。当有中条件标志位的值。当有S时有两种情时有两种情况:若指令中的目标寄存器况:若指令中的

17、目标寄存器为为R15,则当前处理器,则当前处理器模式对应的模式对应的SPSR的值被复制到的值被复制到CPSR寄存器中,对于用寄存器中,对于用户模式和系统模式,指令执行的结果将不可预料户模式和系统模式,指令执行的结果将不可预料; 26TM26 MOV传送指令 若指令中的目标寄存器若指令中的目标寄存器不为不为R15,指令根据传送,指令根据传送的数值设置的数值设置CPSR中的中的N位和位和Z位,并根据移位器的进位位,并根据移位器的进位值值carryout设置设置CPSR的的C位,位, CPSR中的其他位不受影中的其他位不受影响响 寄存器为目标寄存器。寄存器为目标寄存器。 为向目标寄存器传送的数据。为

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

19、令MVN指令将指令将表示的数据的反码传送表示的数据的反码传送到目标寄存器到目标寄存器中,并根据操作的结果更新中,并根据操作的结果更新CPSR中中相应的条件标志位。相应的条件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:MVN S ,其中,各参数的用法与其中,各参数的用法与MOV传送指令相同。传送指令相同。29TM29 MVN传送指令指令的使用指令的使用:向寄存器中传送一个负数。向寄存器中传送一个负数。求一个数的反码。求一个数的反码。示例解析示例解析30TM303. ADD加法指令ADD指令将指令将表示的数据与寄存器表示的数据与寄存器中的值相加,并把结果传送到目标寄存

20、器中的值相加,并把结果传送到目标寄存器中,中,并根据操作的结果更新并根据操作的结果更新CPSR中相应的条件标志位。中相应的条件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:ADD S ,31TM31 ADD加法指令其中:其中: 、S和和Rd的用法与的用法与MOV传送指令相同。传送指令相同。 寄存器为第寄存器为第1个源操作数所在的寄存器。个源操作数所在的寄存器。 为第为第2个操作数。个操作数。 32TM32 ADD加法指令指令的使用指令的使用:实现两个操作数相加实现两个操作数相加示例解析示例解析33TM334. ADC带位加法指令ADC指令将指令将表示的数据与寄存器表

21、示的数据与寄存器中的值相加,再加上中的值相加,再加上CPSR中的中的C条件标志位的值,条件标志位的值,并把结果传送到目标寄存器并把结果传送到目标寄存器中,并根据操作的结果中,并根据操作的结果更新更新CPSR中相应的条件标志位。中相应的条件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:ADC S ,其中,各参数用法与其中,各参数用法与ADD传送指令相同。传送指令相同。34TM34 ADC带位加法指令指令的使用指令的使用ADC 指令和指令和ADD指令联合使用可以实现两个指令联合使用可以实现两个64位的操位的操作数相加。如果寄存器作数相加。如果寄存器R0和和R1中放置一个

22、中放置一个64位的源操作位的源操作数,其中数,其中R0中放置低中放置低32位数值;寄存器位数值;寄存器R2和和R3中放置中放置另一个另一个64位的源操作数,其中位的源操作数,其中R2中放置低中放置低32位数值。位数值。示例解析示例解析35TM355. SUB减法指令SUB指令从寄存器指令从寄存器中减去中减去表示表示的数值,并把结果传送到目标寄存器的数值,并把结果传送到目标寄存器中,并根据操中,并根据操作的结果更新作的结果更新CPSR中相应的条件标志位。中相应的条件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:SUB S ,其中,各参数用法与其中,各参数用法与ADD传

23、送指令相同。传送指令相同。36TM36 SUB减法指令指令的使用指令的使用:n SUB指令实现两个操作数相减。指令实现两个操作数相减。示例解析示例解析37TM376. SBC带位减法指令SBCSBC指令从寄存器指令从寄存器 中减去中减去 表示的表示的数值,再减去寄存器数值,再减去寄存器CPSRCPSR中中C C条件标志位的反码,并把结条件标志位的反码,并把结果传送到目标寄存器果传送到目标寄存器中,并根据操作的结果更新中,并根据操作的结果更新CPSRCPSR中相应的条件标志位。中相应的条件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:SBC S ,其中,各参数用法与其

24、中,各参数用法与ADDADD传送指令相同。传送指令相同。38TM38 SBC带位减法指令指令的使用指令的使用:SBC指令和指令和SUBS指令联合使用可以实现两个指令联合使用可以实现两个64位的操位的操作数相减。如果寄存器作数相减。如果寄存器R0和和R1中放置一个中放置一个64位的源操作位的源操作数,其中数,其中R0中放置低中放置低32位数值;寄存器位数值;寄存器R2和和R3中放置中放置另一个另一个64位的源操作数,其中位的源操作数,其中R2中放置低中放置低32位数值。位数值。示例解析示例解析39TM397. RSB逆向减法指令RSB指令从中指令从中表示的数值中减去寄表示的数值中减去寄存器存器

25、值,并把结果传送到目标寄存器值,并把结果传送到目标寄存器中,并中,并根据操作的结果更新根据操作的结果更新CPSR中相应的条件标志位。中相应的条件标志位。n指令的编码格式:指令的编码格式:40TM40 RSB逆向减法指令指令的语法格式:指令的语法格式: RSB S ,其中:其中: 寄存器为第寄存器为第2个操作数所在的寄存器个操作数所在的寄存器 为第为第1个操作数。个操作数。 其他参数用法与其他参数用法与ADD传送指令相同。传送指令相同。41TM41 RSB逆向减法指令指令的使用指令的使用:nRSB指令实现两个操作数相减。指令实现两个操作数相减。示例解析示例解析42TM428. RSC带位逆向减法

26、指令RSC指令从中指令从中表示的数值中减去寄表示的数值中减去寄存器存器 值,再减去寄存器值,再减去寄存器CPSR中中 C条件标志位的反条件标志位的反码,并把结果传送到目标寄存器码,并把结果传送到目标寄存器中,并根据操作的中,并根据操作的结果更新结果更新CPSR中相应的条件标志位。中相应的条件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:RSC S ,其中,各参数用法与其中,各参数用法与RSB逆向减法指令相同。逆向减法指令相同。43TM43 RSC带位逆向减法指令指令的使用指令的使用:RSC指令和指令和RSBC指令联合使用可以求一个指令联合使用可以求一个64位数值的位

27、数值的负数。负数。如果寄存器如果寄存器R0和和R1中放置一个中放置一个64位数,其中位数,其中R0中放置中放置低低32位数值;寄存器位数值;寄存器R2和和R3中放置其负数,其中中放置其负数,其中R2中中放置低放置低32位数值。位数值。示例解析示例解析44TM449. AND逻辑与操作指令AND指令将指令将表示的数值与寄存器表示的数值与寄存器 的值按位做逻辑与操作,并把结果保存到目标寄的值按位做逻辑与操作,并把结果保存到目标寄存器存器中,并根据操作的结果更新中,并根据操作的结果更新CPSR中相应的条中相应的条件标志位。件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:A

28、ND S ,45TM45 AND逻辑与操作指令其中:其中: 寄存器为第寄存器为第1 1个操作数所在的寄存器个操作数所在的寄存器 为第为第2 2个操作数。个操作数。 其他参数用法与其他参数用法与MOVMOV传送指令相同。传送指令相同。46TM46 ANDAND逻辑与操作指令逻辑与操作指令指令的使用指令的使用: AND指令可用于提取寄存器中某些位的值。具体作指令可用于提取寄存器中某些位的值。具体作法是设置一个掩码值,将该值中对应于寄存器中欲提取法是设置一个掩码值,将该值中对应于寄存器中欲提取的位设为的位设为1,其他的位设置成,其他的位设置成0。将寄存器的值与该掩码。将寄存器的值与该掩码值作与操作即

29、可得到想提取的位的值。值作与操作即可得到想提取的位的值。47TM4710. ORR逻辑或操作指令ORR指令将指令将表示的数值与寄存器表示的数值与寄存器 的值按位做逻辑或操作,并把结果保存到目标寄的值按位做逻辑或操作,并把结果保存到目标寄存器存器中,并根据操作的结果更新中,并根据操作的结果更新CPSR中相应的条中相应的条件标志位。件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:ORR S ,其中,各参数用法与其中,各参数用法与AND指令相同指令相同。48TM48 ORR逻辑或操作指令指令的使用指令的使用ORR指令可用于将寄存器中某些位的值设置成指令可用于将寄存器中某些

30、位的值设置成1。具体。具体作法是设置一个掩码值,将该值中对应于寄存器中欲提作法是设置一个掩码值,将该值中对应于寄存器中欲提取的位设为取的位设为0,其他的位设置成,其他的位设置成1。将寄存器的值与该掩。将寄存器的值与该掩码值做逻辑或操作即可得到想提取的位的值。码值做逻辑或操作即可得到想提取的位的值。示例解析示例解析49TM4911. EOR逻辑异或操作指令EOR指令将指令将表示的数值与寄存器表示的数值与寄存器 的值按位做逻辑异或操作,并把结果保存到目标的值按位做逻辑异或操作,并把结果保存到目标寄存器寄存器中,并根据操作的结果更新中,并根据操作的结果更新CPSR中相应的中相应的条件标志位。条件标志

31、位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:EOR S ,其中,各参数用法与其中,各参数用法与AND指令相同。指令相同。50TM50 EOR逻辑异或操作指令指令的使用指令的使用:n EOR指令可用于将寄存器中某些位的值取反。将某一指令可用于将寄存器中某些位的值取反。将某一位与位与0做逻辑异或操作,该位值不变:将某一位与做逻辑异或操作,该位值不变:将某一位与1做逻做逻辑异或操作,该位置将被求反。辑异或操作,该位置将被求反。51TM5112. BIC位清除指令BIC指令将指令将 寄存器的值与寄存器的值与表示表示的数值的反码按位做逻辑与操作,并把结果保存到目标的数值的反码按

32、位做逻辑与操作,并把结果保存到目标寄存器寄存器中,并根据操作的结果更新中,并根据操作的结果更新CPSR中相应的中相应的条件标志位。条件标志位。n指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:BIC S ,其中,各参数用法与其中,各参数用法与AND指令相同。指令相同。52TM52 BIC位清除指令指令的使用指令的使用n BIC指令可用于将寄存器中某些位的值设置成指令可用于将寄存器中某些位的值设置成0。将某。将某一位与一位与1做做BIC操作,该位值被设置成操作,该位值被设置成0;将某一位与;将某一位与0做做BIC操作,该位值不变。操作,该位值不变。53TM5313. CMP比较指

33、令CMP指令从寄存器指令从寄存器 中减去中减去表表示的数值,根据操作的结果更新示的数值,根据操作的结果更新CPSR中相应的条件标中相应的条件标志位,后面的指令就可以根据志位,后面的指令就可以根据CPSR中相应的条件标志中相应的条件标志位来判断是否执行。位来判断是否执行。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:CMP ,54TM54 CMP比较指令其中:其中: 寄存器为第寄存器为第1个操作数所在的寄存器个操作数所在的寄存器 为第为第2个操作数。个操作数。 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。指令的使用:指令的使用:

34、CMP指令与指令与SUBS指令的区别在于指令的区别在于CMP指令不保存操指令不保存操作结果。作结果。55TM5514. CMN求和比较指令CMN指令将寄存器指令将寄存器 中的值加上中的值加上表示的数值,根据操作的结果更新表示的数值,根据操作的结果更新CPSR中相应的条件标志位,后面的指令就可以根据中相应的条件标志位,后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行。中相应的条件标志位来判断是否执行。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式: CMN , 其中,各参数用法与其中,各参数用法与CMP指令相同指令相同56TM56 CMN求和比较指令指令的使用指令的使

35、用n CMN指令将寄存器指令将寄存器 中的值加上中的值加上表示的数值,根据加法操作的结果表示的数值,根据加法操作的结果设置设置CPSR中相应的条件标志位。中相应的条件标志位。57TM5715. TST位测试指令TST指令将指令将表示的数值与寄存器表示的数值与寄存器 中的值做逻辑与操作,根据操作的结果更新中的值做逻辑与操作,根据操作的结果更新CPSR中相应的条件标志位。中相应的条件标志位。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:TST ,其中,各参数用法与其中,各参数用法与CMP比较指令相同比较指令相同58TM58 TST位测试指令指令的使用指令的使用n TST指令通常用

36、于测试寄存器中某个(些)位是指令通常用于测试寄存器中某个(些)位是1还还是是0。59TM5916. TEQ相等测试指令TEQ指令将指令将表示的数值与寄存器表示的数值与寄存器 中的值做逻辑异或操作,根据操作的结果更新中的值做逻辑异或操作,根据操作的结果更新CPSR中相应的条件标志位。中相应的条件标志位。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:TEQ ,其中,各参数用法与其中,各参数用法与CMP比较指令相同比较指令相同60TM60 TEQ相等测试指令指令的使用指令的使用TEQ指令通常用于比较两个数是否相等,这种比较操作指令通常用于比较两个数是否相等,这种比较操作通常不影响通

37、常不影响CPSR寄存器的寄存器的V位和位和C位。位。TEQ指令也可用于比较两个操作数符号是否相同,该指指令也可用于比较两个操作数符号是否相同,该指令执行后,令执行后,CPSR寄存器中的寄存器中的N位为两个操作数符号位作位为两个操作数符号位作异或操作的结果。异或操作的结果。61TM614.1.3乘法指令ARM有两类乘法指令:有两类乘法指令: 一类为一类为32位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为32位;位; 另一类为另一类为64位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为64位。位。MUL 32位乘法指令。位乘法指令。MLA 32位带加数的乘法指令。

38、位带加数的乘法指令。SMULL 64位有符号数乘法指令。位有符号数乘法指令。SMLAL 64位带加数的有符号数乘法指令位带加数的有符号数乘法指令UMULL 64位无符号数乘法指令。位无符号数乘法指令。UMLAL 64位带加数的无符号数乘法指令位带加数的无符号数乘法指令62TM621. MUL乘(32位结果)MUL指令实现两个指令实现两个32位的数(可以为无符号数,也可为位的数(可以为无符号数,也可为有符号数)的乘积并将结果存放到一个有符号数)的乘积并将结果存放到一个32位的寄存器中,位的寄存器中,同时根据运算结果设置同时根据运算结果设置CPSR寄存器中相应的条件标志寄存器中相应的条件标志位。位

39、。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:MUL S , , 功能:Rd (Rm*Rs)31:063TM63MUL 乘(32位结果)其中:其中:n 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。n S决定指令的操作是否影响决定指令的操作是否影响CPSR中条件标志位中条件标志位N位和位和Z位的值。当没有位的值。当没有S时指令不更新时指令不更新CPSR中条件标志位的中条件标志位的值;当有值;当有S时指令更新时指令更新CPSR中条件标志位的值。中条件标志位的值。n 寄存器为目标寄存器。寄存器为目标寄存器。n 寄存器为第寄存器为第1

40、个乘数所在的寄存器。个乘数所在的寄存器。n 为第为第2个乘数所在的寄存器。个乘数所在的寄存器。 64TM64MUL乘(32位结果)指令的使用指令的使用由于两个由于两个32的数相乘结果为的数相乘结果为64位,而位,而MUL指令仅仅保存指令仅仅保存了了64位结果低位结果低32位,所以对于带符号的和无符号的操作位,所以对于带符号的和无符号的操作数来说数来说MUL指令执行的结果相同。指令执行的结果相同。寄存器寄存器 为为R15时,指令执行的结果不时,指令执行的结果不可预测。可预测。示例解析示例解析 65TM652. MLA 乘-累加(32位结果)MLA指令实现两个指令实现两个32位的数(可以为无符号数

41、,也可为位的数(可以为无符号数,也可为有符号数)的乘积,再将乘积加上第有符号数)的乘积,再将乘积加上第3个操作数,并将结个操作数,并将结果存放到一个果存放到一个32位的寄存器中,同时根据运算结果设置位的寄存器中,同时根据运算结果设置CPSR寄存器中相应的条件标志位。寄存器中相应的条件标志位。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:MLA S , , ,功能:功能:Rd (Rm*Rs+Rn)31:066TM66 MLA乘-累加(32位结果)其中:其中: 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。n S决定指令的操作是否影响

42、决定指令的操作是否影响CPSR中条件标志位中条件标志位N位和位和Z位的值。当没有位的值。当没有S时指令不更新时指令不更新CPSR中条件标志位的中条件标志位的值;当有值;当有S时指令更新时指令更新CPSR中条件标志位的值。中条件标志位的值。n 寄存器为目标寄存器。寄存器为目标寄存器。n 寄存器为第寄存器为第1个乘数所在的寄存器。个乘数所在的寄存器。n 为第为第2个乘数所在的寄存器。个乘数所在的寄存器。n 为第为第3个操作数所在的寄存器个操作数所在的寄存器,该操作数是一个加该操作数是一个加数数 67TM67 MLA乘-累加(32位结果)指令的使用指令的使用由于两个由于两个32的数相乘结果为的数相乘

43、结果为64位,而位,而MLA指令仅仅保存指令仅仅保存了了64位结果低位结果低32位,所以对于带符号的和无符号的操作位,所以对于带符号的和无符号的操作数来说数来说MUL指令执行的果相同。指令执行的果相同。寄存器寄存器 为为R15时,指令执行的结果不时,指令执行的结果不可预测。可预测。示例解析示例解析68TM683. SMULL 有符号数长乘(64位)SMULL指令实现两个指令实现两个32位有符号数的乘积,乘积结果的位有符号数的乘积,乘积结果的高高32位存放到一个位存放到一个32位的寄存器的位的寄存器的,乘积结果,乘积结果的低的低32位存放到另一个位存放到另一个32位的寄存器的位的寄存器的,同时,

44、同时根据运算结果设置根据运算结果设置CPSR寄存器中相应的条件标志位。寄存器中相应的条件标志位。指令的编码格式:指令的编码格式:69TM69SMULL 有符号数长乘(64位)指令的语法格式:指令的语法格式:SMULL S , , 功能:功能:RdHi:RdLo Rm*Rs其中:其中:n 寄存器存放乘积结果的高寄存器存放乘积结果的高32位数据。位数据。n 寄存器存放乘积结果的低寄存器存放乘积结果的低32位数据。位数据。n 其他参数用法参见其他参数用法参见MUL指令。指令。 70TM70SMULL 有符号数长乘(64位)指令的使用:指令的使用:n 寄存器寄存器 为为R15时,指令时,指令执行的结果

45、不可预测。执行的结果不可预测。示例解析示例解析 71TM714. SMLAL 有符号数长乘-累加(64位)SMLAL指令将两个指令将两个32位有符号数的位有符号数的64位乘积结果与位乘积结果与 和和 中的中的64位数相加,加法结果的高位数相加,加法结果的高32位存放到一个位存放到一个32位的寄存器位的寄存器中,乘积结果的低中,乘积结果的低32位存放到另一个位存放到另一个32位的寄存器的位的寄存器的,同时根据,同时根据运算结果设置运算结果设置CPSR寄存器中相应的条件标志位。寄存器中相应的条件标志位。指令的编码格式:指令的编码格式:72TM72SMLAL 有符号数长乘-累加(64位)指令的语法格

46、式:指令的语法格式:SMLAL S , , 功能:功能:RdHi:RdLo Rm*Rs+RdHi:RdLo其中:其中:n 寄存器在指令执行前存放寄存器在指令执行前存放64位加数的高位加数的高32位,位,指令执行后存放结果的高指令执行后存放结果的高32位数据。位数据。n 寄存器在指令执行前存放寄存器在指令执行前存放64位加数的低位加数的低32位,位,指令执行后存放结果的低指令执行后存放结果的低32位数据。位数据。n 其他参数用法参见其他参数用法参见MUL指令。指令。 73TM73SMLAL 有符号数长乘-累加(64位)n指令的使用:指令的使用:n 寄存器寄存器 为为R15时,指令时,指令执行的结

47、果不可预测。执行的结果不可预测。示例解析示例解析 74TM745. UMULL 无符号数长乘(64位)UMULL指令实现两个指令实现两个32位有符号数的乘积,乘积结果的位有符号数的乘积,乘积结果的高高32位存放到一个位存放到一个32位的寄存器的位的寄存器的,乘积结果,乘积结果的低的低32位存放到另一个位存放到另一个32位的寄存器的位的寄存器的,同时,同时根据运算结果设置根据运算结果设置CPSR寄存器中相应的条件标志位。寄存器中相应的条件标志位。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:UMULL S , , 功能:功能:RdHi:RdLo Rm*Rs其中,各参数用法参见其

48、中,各参数用法参见SMULL指令。指令。75TM75UMULL 无符号数长乘(64位)指令的使用:指令的使用:n 寄存器寄存器 为为R15时,指令时,指令执行的结果不可预测。执行的结果不可预测。示例解析示例解析 76TM766. UMLAL 无符号数长乘累加(64位)UMLAL指令将两个指令将两个32位无符号数的位无符号数的64位乘积结果与位乘积结果与 和和 中的中的64位无符号数相加,加法结果位无符号数相加,加法结果的高的高32位存放到一个位存放到一个32位的寄存器中,乘积结果的低位的寄存器中,乘积结果的低32位存放到另一个位存放到另一个32位的寄存器的位的寄存器的,同时根据运,同时根据运算

49、结果设置算结果设置CPSR寄存器中相应的条件标志位。寄存器中相应的条件标志位。指令的编码格式:指令的编码格式:77TM77UMLAL 无符号数长乘累加(64位)指令的语法格式:指令的语法格式:UMLAL S , , 功能:功能:RdHi:RdLo Rm*Rs+RdHi:RdLo其中:其中:n 寄存器在指令执行前存放寄存器在指令执行前存放64位加数的高位加数的高32位,位,指令执行后存放结果的高指令执行后存放结果的高32位数据。位数据。n 寄存器在指令执行前存放寄存器在指令执行前存放64位加数的低位加数的低32位,位,指令执行后存放结果的低指令执行后存放结果的低32位数据。位数据。n 其他参数用

50、法参见其他参数用法参见MUL指令。指令。 78TM78UMLAL 无符号数长乘累加(64位)指令的使用:指令的使用:n 寄存器寄存器 为为R15时,指令时,指令执行的结果不可预测。执行的结果不可预测。示例解析示例解析 79TM794.1.4Load/Store内存访问指令 Load指令用于从内存中读取数据放入寄存器中;指令用于从内存中读取数据放入寄存器中;Store指令用于将寄存器中的数据保存到内存。指令用于将寄存器中的数据保存到内存。ARM有有两大类的两大类的Load/Store指令:一类用于操作指令:一类用于操作32位的字类型位的字类型数据以及数据以及8位无符号的字节类型;另一类用于操作位

51、无符号的字节类型;另一类用于操作16位半位半字类型的数据以及字类型的数据以及8位的有符号字节类型的数据。位的有符号字节类型的数据。80TM80 Load/Store内存访问指令LDR 字数据读取指令字数据读取指令LDRB 字节数据读取指令字节数据读取指令LDRBT 用户模式的字节数据读取指令用户模式的字节数据读取指令LDRH 半字数据读取指令半字数据读取指令LDRSB 有符号的字节数据读取指令有符号的字节数据读取指令LDRSH 有符号的半字数据读取指令有符号的半字数据读取指令LDRT 用户模式的字数据读取指令用户模式的字数据读取指令STR 字数据写入指令字数据写入指令STRB 字节数据写入指令

52、字节数据写入指令STRBT 用户模式字节数据写入指令用户模式字节数据写入指令STRH 半字数据写入指令半字数据写入指令STRT 用户模式字节数据写入指令用户模式字节数据写入指令81TM811. LDR 字数据读取指令LDRLDR指令用于从内存中将一个指令用于从内存中将一个32位的字数据读取到指令中位的字数据读取到指令中的目标寄存器中。的目标寄存器中。对于对于little-endian内存模式,指令第一次想要读取的字节内存模式,指令第一次想要读取的字节数据存放在目标寄存器的低数据存放在目标寄存器的低8位;对于位;对于big-endian的内存的内存模式,指令第一次想要读取的字节数据存放在目标寄存

53、模式,指令第一次想要读取的字节数据存放在目标寄存器的器的bits31:2482TM82LDR 字数据读取指令n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nLDR , nI:0立即数;立即数;1移位寄存器移位寄存器nP:前:前/后变址后变址 nU:加:加/减减 ;W:回写:回写nL:读取:读取/存储存储83TM83LDR 字数据读取指令其中:其中:n 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。n 寄存器为目标寄存器。寄存器为目标寄存器。n 为指令的寻址方式。为指令的寻址方式。 84TM84LDR 字数据读取指令指令的使用指

54、令的使用用于从内存中读取用于从内存中读取32位字数据到通用寄存器中,然后可位字数据到通用寄存器中,然后可以在该寄存器中对数据进行一定的操作。以在该寄存器中对数据进行一定的操作。当当PC作为指令中的目标寄存器时,指令可以实现程序跳作为指令中的目标寄存器时,指令可以实现程序跳转的功能。转的功能。示例解析示例解析85TM852.LDRB 字节数据读取指令 n LDRB指令用于从内存中将一个指令用于从内存中将一个8位的字节数据读取到位的字节数据读取到指令中的目标寄存器中。并将寄存器的高指令中的目标寄存器中。并将寄存器的高24位清零。位清零。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法

55、格式:nLDRB , n各参数用法参见各参数用法参见LDR指令。指令。86TM86 LDRB 字节数据读取指令 指令的使用指令的使用用于从内存中读取用于从内存中读取8位字节数据到通用寄存器中,然后可位字节数据到通用寄存器中,然后可以在该寄存器中对数据进行一定的操作。以在该寄存器中对数据进行一定的操作。当当PC作为指令中的目标寄存器时,指令可以实现程序跳作为指令中的目标寄存器时,指令可以实现程序跳转的功能。转的功能。87TM873.LDRBT 用户模式的字节数据读取指令 nLDRBT指令用于从内存中将一个指令用于从内存中将一个8位的字节数据读取到指位的字节数据读取到指令中的目标寄存器中。并将寄存

56、器的高令中的目标寄存器中。并将寄存器的高24位清零。当在特位清零。当在特权级的处理器模式下使用本指令时,内存系统将该操作当权级的处理器模式下使用本指令时,内存系统将该操作当作一般用户模式下的内存访问操作作一般用户模式下的内存访问操作n指令的编码格式:指令的编码格式:n指令的语法格式指令的语法格式(只进行后变址回写寻址方式)(只进行后变址回写寻址方式)LDRBT , n各参数用法参见各参数用法参见LDR指令。指令。88TM88 LDRBT 用户模式的字节数据读取指令 指令的使用指令的使用n 异常中断程序是在特权级的处理器模式下异常中断程序是在特权级的处理器模式下执行的,这时如果需要按照用户模式的

57、权限访问执行的,这时如果需要按照用户模式的权限访问内存,可以使用内存,可以使用LDRBT指令。指令。89TM894.LDRH(无符号半字数据读取指令)n LDRH指令用于从内存中将一个指令用于从内存中将一个16位的无符号半字节数据位的无符号半字节数据读取到指令中的目标寄存器中。并将寄存器的高读取到指令中的目标寄存器中。并将寄存器的高16位清零。位清零。如果指令中的内存地址不是半字对齐的,指令会产生不可预如果指令中的内存地址不是半字对齐的,指令会产生不可预知的结果。知的结果。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nLDRH , n各参数用法参见各参数用法参见LDR指

58、令。指令。n22:0寄存器;寄存器;1立即数立即数90TM90 LDRH(半字数据读取指令)指令的使用:指令的使用: LDRH指令通常的用法有以下两种:指令通常的用法有以下两种:用于从内存中读取用于从内存中读取16位半字数据到通用寄存器中,然后位半字数据到通用寄存器中,然后可以在该寄存器中对数据进行一定的操作。可以在该寄存器中对数据进行一定的操作。当当PC作为指令中的目标寄存器时,指令可以实现程序跳作为指令中的目标寄存器时,指令可以实现程序跳转的功能。转的功能。示例解析示例解析91TM915.LDRSB(有符号的字节数据读取指令)n LDRSB指令用于从内存中将一个指令用于从内存中将一个8位的

59、字节数据读取位的字节数据读取到指令中的目标寄存器中。并将寄存器的高到指令中的目标寄存器中。并将寄存器的高24位设置成该字位设置成该字节数据的符号位。节数据的符号位。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nLDRSB , n各参数用法参见各参数用法参见LDR指令。指令。92TM92 LDRSB(有符号的字节数据读取指令)指令的使用指令的使用用于从内存中读取用于从内存中读取8位有符号字节数据到通用寄存器中,位有符号字节数据到通用寄存器中,然后可以在该寄存器中对数据进行一定的操作。然后可以在该寄存器中对数据进行一定的操作。当当PC作为指令中的目标寄存器时,指令可以实现程

60、序跳作为指令中的目标寄存器时,指令可以实现程序跳转的功能。转的功能。93TM936.LDRSH(有符号的半字数据读取指令)n LDRSH指令用于从内存中将一个指令用于从内存中将一个16位的半字数据读取位的半字数据读取到指令中的目标寄存器中。并将寄存器的高到指令中的目标寄存器中。并将寄存器的高16位设置成该半位设置成该半字数据的符号位的值。字数据的符号位的值。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nLDRSH , n其中,各参数用法参见其中,各参数用法参见LDR指令。指令。94TM94 LDRSH(有符号的半字数据读取指令)指令的使用指令的使用用于从内存中读取用于从

61、内存中读取16位有符号半字数据到通用寄存器中,位有符号半字数据到通用寄存器中,然后可以在该寄存器中对数据进行一定的操作。然后可以在该寄存器中对数据进行一定的操作。当当PC作为指令中的目标寄存器时,指令可以实现程序跳作为指令中的目标寄存器时,指令可以实现程序跳转的功能。转的功能。95TM957. LDRT(用户模式的字数据读取指令)LDRT指令用于从内存中将一个指令用于从内存中将一个32位的字数据读取到指令位的字数据读取到指令中的目标寄存器中。对于中的目标寄存器中。对于little-endian内存模式,指令第内存模式,指令第一次想要读取的字节数据存放在目标寄存器的低一次想要读取的字节数据存放在

62、目标寄存器的低8位;对位;对于于big-endian的内存模式,指令第一次想要读取的字节的内存模式,指令第一次想要读取的字节数据存放在目标寄存器的数据存放在目标寄存器的bits31:24。当在特权极的处理器模式下使用本指令时,内存系统将当在特权极的处理器模式下使用本指令时,内存系统将该操作当作一般用户模式下的内存访问操作该操作当作一般用户模式下的内存访问操作96TM96 LDRT(用户模式的字数据读取指令)n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nLDRT , n其中,各参数用法参见其中,各参数用法参见LDR指令。指令。97TM97 LDRT(用户模式的字数据读取指

63、令)指令的使用:指令的使用: 异常中断程序是在特权级的处理器模式下执行的,异常中断程序是在特权级的处理器模式下执行的,这时如果需要按照用户模式的权限访问内存,可以使用这时如果需要按照用户模式的权限访问内存,可以使用LDRT指令。指令。98TM98LDRSB/SH/T指令 示例解析示例解析99TM998. STR(字数据写入指令)n STR指令用于将一个指令用于将一个32位的字数据写入到指令中指定位的字数据写入到指令中指定的内存单元。的内存单元。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nSTR , 100TM100 STR(字数据写入指令)其中:其中:n 为指令执行的

64、条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。n 寄存器为目标寄存器。寄存器为目标寄存器。n 为指令的寻址方式。为指令的寻址方式。n指令的使用指令的使用n STR指令用于将一个指令用于将一个32位的字数据写入到指令中指定位的字数据写入到指令中指定的内存单元。的内存单元。 101TM1019. STRB(字节数据写入指令)n STRB指令用于将一个指令用于将一个8位的字节数据写入到指令中指位的字节数据写入到指令中指定的内存单元,该字节数据为指令中存放源操作数的寄存器定的内存单元,该字节数据为指令中存放源操作数的寄存器的低的低8位。位。n指令的编码格式:指令的编码

65、格式:n指令的语法格式:指令的语法格式:nSTRB , n其中,各参数用法参见其中,各参数用法参见LDR指令。指令。102TM102 STRB(字节数据写入指令)n指令的使用:指令的使用: STRB指令用于将寄存器中低指令用于将寄存器中低8位的字节数据写入到位的字节数据写入到指令中指定的内存单元。指令中指定的内存单元。 103TM10310. STRH(无符号半字数据写入指令)n STRH指令用于将一个指令用于将一个16位的半字数据写入到指令中位的半字数据写入到指令中指定的内存单元,该半字数据为指令中存放源操作数的寄存指定的内存单元,该半字数据为指令中存放源操作数的寄存器的低器的低16位。如果

66、指令中的内存地址不是半字对齐的,指令位。如果指令中的内存地址不是半字对齐的,指令会产生不可预知的结果。会产生不可预知的结果。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nSTRH , n其中,各参数用法参见其中,各参数用法参见LDR指令。指令。104TM104 STRH(半字数据写入指令)n指令的使用:指令的使用:n STRH指令用于将寄存器中低指令用于将寄存器中低16位的半字数据写入到位的半字数据写入到指令中指定的内存单元。指令中指定的内存单元。 105TM10511. STRT(用户模式的字数据写入指令)n STRT指令用于将一个指令用于将一个32位的字数据写入到指

67、令中指位的字数据写入到指令中指定的内存单元。当在特权极的处理器模式下使用本指令时,定的内存单元。当在特权极的处理器模式下使用本指令时,内存系统将该操作当作一般用户模式下的内存访问操作内存系统将该操作当作一般用户模式下的内存访问操作n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:nSTRT , n其中,各参数用法参见其中,各参数用法参见LDR指令。指令。106TM106 STRT(用户模式的字数据写入指令)n指令的使用:指令的使用: 异常中断程序是在特权级的处理器模式下执行的,异常中断程序是在特权级的处理器模式下执行的,这时如果需要按照用户模式的权限访问内存,可以使用这时如果

68、需要按照用户模式的权限访问内存,可以使用STRT指令。指令。 107TM10712. STRBT(用户模式的字节数据写入指令)n STRBT指令用于将一个指令用于将一个8位的字节数据写入到指令中位的字节数据写入到指令中指定的内存单元。当在特权极的处理器模式下使用本指令时,指定的内存单元。当在特权极的处理器模式下使用本指令时,内存系统将该操作当作一般用户模式下的内存访问操作内存系统将该操作当作一般用户模式下的内存访问操作n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:STRBT , n其中,各参数用法参见其中,各参数用法参见LDR指令。指令。108TM108 STRBT(用户

69、模式的字节数据写入指令)n指令的使用:指令的使用: 异常中断程序是在特权级的处理器模式下执行的,异常中断程序是在特权级的处理器模式下执行的,这时如果需要按照用户模式的权限访问内存,可以使用这时如果需要按照用户模式的权限访问内存,可以使用STRBT指令。指令。 109TM109STRData_mode 指令示例解析示例解析110TM1104.1.5批量Load/Store内存访问指令批量批量Load内存访问指令可以一次从连续的内存单元中读取内存访问指令可以一次从连续的内存单元中读取数据,传送到指令中的内存列表中的各个寄存器中。数据,传送到指令中的内存列表中的各个寄存器中。批量批量Store内存访

70、问指令可以将指令中寄存器列表中的各个内存访问指令可以将指令中寄存器列表中的各个寄存器值写入到内存中,内存的地址由指令中的寻址模式寄存器值写入到内存中,内存的地址由指令中的寻址模式确定。确定。批量批量Load/Store内存访问指令的语法格式如下:内存访问指令的语法格式如下:LDM|STM Rn!, 111TM111 批量Load/Store内存访问指令LDM(1) 批量内存字数据读取指令批量内存字数据读取指令LDM(2) 用户模式的批量字数据读取指令用户模式的批量字数据读取指令LDM(3) 带状态寄存器的批量内存字数据读取指令带状态寄存器的批量内存字数据读取指令STM(1) 批量内存字数据写入

71、指令批量内存字数据写入指令STM(2) 用户模式的批量字数据写入指令用户模式的批量字数据写入指令112TM1121.LDM(1)( 批量内存字数据读取指令)批量内存字数据读取指令)LDM(1)指令将数据从连续的内存单元中读取到指令中寄指令将数据从连续的内存单元中读取到指令中寄存器列表中的各寄存器中。它主要用于块数据的读取、存器列表中的各寄存器中。它主要用于块数据的读取、数据栈操作以及从子程序中返回的操作。数据栈操作以及从子程序中返回的操作。当当PC包含在包含在LDM指令的寄存器列表中时,指令从内存中指令的寄存器列表中时,指令从内存中读取字数据将被当作目标地址值,指令执行后程序将从读取字数据将被

72、当作目标地址值,指令执行后程序将从目标地址处开始执行,即实现了跳转操作。目标地址处开始执行,即实现了跳转操作。113TM113 LDM(1)( 批量内存字数据读取指令)批量内存字数据读取指令)n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:LDM Rn!,114TM114 LDM(1)( 批量内存字数据读取指令)批量内存字数据读取指令)其中:其中: 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。n 为指令寻址模式中的基址寄存器。存放地址块的为指令寻址模式中的基址寄存器。存放地址块的最低地址值。最低地址值。n !设置指令中的!设置

73、指令中的W位,使指令执行后将操作数的内存位,使指令执行后将操作数的内存地址写入基址寄存器地址写入基址寄存器中中n 为指令的寻址方式为指令的寻址方式n 为寄存器列表。其中寄存器和内存单元为寄存器列表。其中寄存器和内存单元的对应规则满足这样的规则,即编号低的寄存器对应于的对应规则满足这样的规则,即编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中高地内存中低地址单元,编号高的寄存器对应于内存中高地址单元址单元 115TM115 LDM(1)( 批量内存字数据读取指令)批量内存字数据读取指令)n指令的使用:指令的使用: 如果指令中基址寄存器如果指令中基址寄存器在寄存器列表在寄存器列表中

74、,而且指令中寻址方式指定指令执行后更中,而且指令中寻址方式指定指令执行后更新基址寄存器新基址寄存器 的值,则指令执行会产生不可预知的值,则指令执行会产生不可预知的结果。的结果。 116TM1162.2.LDM(2)(用户模式的(用户模式的 批量内存字数据读取指令)批量内存字数据读取指令)LDM(2)指令将数据从连续的内存单元中读取到指令中寄指令将数据从连续的内存单元中读取到指令中寄存器列表中的各寄存器中。它主要用于块数据的读取、存器列表中的各寄存器中。它主要用于块数据的读取、数据栈操作以及从子程序中返回的操作。数据栈操作以及从子程序中返回的操作。PC寄存器不能包含在寄存器不能包含在LDM指令的

75、寄存器列表中。指令的寄存器列表中。当在访问特权极的处理模式下使用本指令时,内存系统当在访问特权极的处理模式下使用本指令时,内存系统将该操作当作一般用户模式下的内存访问操作。将该操作当作一般用户模式下的内存访问操作。117TM117 LDM(2)n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:LDM ,118TM118 LDM(2)其中:其中:n 为寄存器列表为寄存器列表,本列表不本列表不 能包能包含含PC寄存器。其中寄存器和内存单元的对应规则满足这寄存器。其中寄存器和内存单元的对应规则满足这样的规则,即编号低的寄存器对应于内存中低地址单元,样的规则,即编号低的寄存器对应于内

76、存中低地址单元,编号高的寄存器对应于内存中高地址单元。编号高的寄存器对应于内存中高地址单元。n 中存放地址块的最低地址值。中存放地址块的最低地址值。n 在寄存器列表中不含在寄存器列表中不含PC寄存器,指示指令中所用的寄寄存器,指示指令中所用的寄存器为用户模式下的寄存器。存器为用户模式下的寄存器。n 其他参数用法参见其他参数用法参见LDM(1)指令。指令。 119TM119 LDM(2)指令的使用:指令的使用:本指令后面不能紧跟访问备份寄存器本指令后面不能紧跟访问备份寄存器(banked_registers)的指令,的指令,最好跟一条最好跟一条NOP指令。指令。在用户模式和系统模式下使用本指令会

77、产生不可预知的结果。在用户模式和系统模式下使用本指令会产生不可预知的结果。指令中的基址寄存器是指令执行时的当前处理器模式对应的物理寄指令中的基址寄存器是指令执行时的当前处理器模式对应的物理寄存器,而不是用户模式对应的寄存器。存器,而不是用户模式对应的寄存器。异常中断程序是在特权级的处理器模式下执行的,这是如果需要按异常中断程序是在特权级的处理器模式下执行的,这是如果需要按照用户模式的权限访问内存,可以使用照用户模式的权限访问内存,可以使用LDM(2)指令。指令。120TM1203.LDM(3)(带状态寄存器的批量内存字数据读取指令)LDM(3)指令将数据从连续的内存单元中读取到指令中寄指令将数

78、据从连续的内存单元中读取到指令中寄存器列表中的各寄存器中。它同时将目前处理器模式对存器列表中的各寄存器中。它同时将目前处理器模式对应的应的SPSR寄存器内容复制到寄存器内容复制到CPSR寄存器中。寄存器中。当当PC包含在包含在LDM指令的寄存器列表中时,指令从内存中指令的寄存器列表中时,指令从内存中读取字数据将被当作目标地址值,指令执行后程序将从读取字数据将被当作目标地址值,指令执行后程序将从目标地址处开始执行,即实现了跳转操作。目标地址处开始执行,即实现了跳转操作。121TM121 LDM(3)n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:LDM !,122TM122

79、LDM(3)其中:其中:n 为寄存器列表为寄存器列表,本格式的指令本格式的指令中寄存器列表中必须包含中寄存器列表中必须包含PC寄存器。其中寄存器和内存寄存器。其中寄存器和内存单元的对应规则满足这样的规则,即编号低的寄存器对单元的对应规则满足这样的规则,即编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中应于内存中低地址单元,编号高的寄存器对应于内存中高地址单元。高地址单元。n 中存放地址块的最低地址值。中存放地址块的最低地址值。n 指示指令中执行时将目前处理器模式下的指示指令中执行时将目前处理器模式下的SPSR值复值复制到制到CPSR中。若指令的寄存器列表中不包含中。若指令的寄存

80、器列表中不包含PC寄存器,寄存器,则该指令为一条则该指令为一条LDM(2)格式的指令。格式的指令。n 其他参数用法参见其他参数用法参见LDM(1)指令。指令。 123TM123 LDM(3)指令的使用:指令的使用:如果指令中基址寄存器如果指令中基址寄存器在寄存器列表在寄存器列表中,而且指令中寻址方式指定指令执行后更新基址寄存中,而且指令中寻址方式指定指令执行后更新基址寄存器器 的值,则指令执行会产生不可预知的结果。的值,则指令执行会产生不可预知的结果。本指令主要用于从异常中断模式下返回,如果在用户模本指令主要用于从异常中断模式下返回,如果在用户模式或系统模式下使用该指令,会产生不可预知的结果。

81、式或系统模式下使用该指令,会产生不可预知的结果。124TM1244. STM(1)(批量内存字数据写入指令)n STM(1)指令将指令中寄存器列表中的各寄存器数值写入到连续的指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。它主要用于块数据的写入、数据栈操作以及从进入子程序内存单元中。它主要用于块数据的写入、数据栈操作以及从进入子程序时保存相关的寄存器的操作。时保存相关的寄存器的操作。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:STM !,125TM125 STM(1)(批量内存字数据写入指令)其中:其中:n 为指令寻址模式中的基址寄存器。存放地址块的为指令

82、寻址模式中的基址寄存器。存放地址块的最低地址最低地址,如果如果R15被作为被作为,指令会产生不可预知的,指令会产生不可预知的结果。结果。n 其他参数用法参见其他参数用法参见LDM(1)指令指令 126TM126 STM(1)(批量内存字数据写入指令)指令的使用:指令的使用:如果指令中基址寄存器如果指令中基址寄存器在寄存器列表在寄存器列表中,而且指令中寻址方式指定指令执行后更新基址寄存中,而且指令中寻址方式指定指令执行后更新基址寄存器器 的值,则当的值,则当是是中编号最小的寄中编号最小的寄存器时,指令将存器时,指令将的初始值保存到内存中;否则,指的初始值保存到内存中;否则,指令执行会产生不可预知

83、的结果。令执行会产生不可预知的结果。127TM1275. STM(2)(用户模式的批量内存字数据写入指令用户模式的批量内存字数据写入指令)n STM(2)指令将指令中寄存器列表中的各寄存器数值写指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。它主要用于块数据的写入、数据栈入到连续的内存单元中。它主要用于块数据的写入、数据栈操作以及从进入子程序时保存相关的寄存器的操作。操作以及从进入子程序时保存相关的寄存器的操作。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:STM ,128TM128 STM(2)(用户模式的批量内存字数据写入指令)其中:其中:n 为指令寻址

84、模式中的基址寄存器。存放地址块的为指令寻址模式中的基址寄存器。存放地址块的最低地址最低地址,如果如果R15被作为被作为,指令会产生不可预知的,指令会产生不可预知的结果。结果。n 指示指令中所用的寄存器为用户模式对应的寄存器。指示指令中所用的寄存器为用户模式对应的寄存器。n 其他参数用法参见其他参数用法参见LDM(1)指令指令n 129TM129 STM(2)(用户模式的批量内存字数据写入指令)指令的使用指令的使用本指令后面不能紧跟访问备份寄存器本指令后面不能紧跟访问备份寄存器(banked_registers)的指令,最好跟一条的指令,最好跟一条NOP指令。指令。本指令主要用于异常中断模式下返

85、回,如果在用户模式本指令主要用于异常中断模式下返回,如果在用户模式和系统模式下使用本指令会产生不可预知的结果。和系统模式下使用本指令会产生不可预知的结果。指令中的基址寄存器是指令执行时的当前处理器模式对指令中的基址寄存器是指令执行时的当前处理器模式对应的物理寄存器,而不是用户模式对应的寄存器。应的物理寄存器,而不是用户模式对应的寄存器。130TM130 LDM/STM指令示例解析示例解析131TM1314.1.6杂类的算术指令 在在ARM v5及以上的版本中包含一条特别指令及以上的版本中包含一条特别指令CLZ,用于计算操作数最高端,用于计算操作数最高端0的个数。这条指的个数。这条指令主要用于:

86、令主要用于:计算操作数规范化(使其最高位为计算操作数规范化(使其最高位为1)时需要左)时需要左移的位数。移的位数。确定一个优先级掩码中最高优先级确定一个优先级掩码中最高优先级132TM132CLZ 前导0个数计数指令CLZ前导前导0个数计数指令个数计数指令(用于用于V5T体系体系) CLZ指令用于计算寄存器中操作数最高端指令用于计算寄存器中操作数最高端0的个数。如的个数。如果操作数的果操作数的bit31为为1,则指令返回,则指令返回0;如果操作数为;如果操作数为0,则指令返回则指令返回32。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:CLZ , 133TM133CLZ 前导

87、0个数计数指令其中:其中:n 为指令执行的条件码。当为指令执行的条件码。当忽略时指令为无忽略时指令为无条件执行。条件执行。n 寄存器为目标寄存器寄存器为目标寄存器(用于存放前导用于存放前导0个数进行统计个数进行统计结果结果)。n 寄存器为将对前导寄存器为将对前导0进行统计数据所在的寄存器。进行统计数据所在的寄存器。 134TM134CLZ 前导0个数计数指令指令的使用:指令的使用: n 可以实现将寄存器可以实现将寄存器中数据的规范化。中数据的规范化。示例解析示例解析 135TM1354.1.7状态寄存器访问指令 ARM 中有两条指令用于在状态寄存器和通用中有两条指令用于在状态寄存器和通用寄存器

88、之间传送数据。程序不能通过直接修改寄存器之间传送数据。程序不能通过直接修改CPSR中的中的T控制位直接将程序状态切换到控制位直接将程序状态切换到Thumb状态,必须通过状态,必须通过BX等指令完成程序状态等指令完成程序状态的切换。通常是通过的切换。通常是通过“读取读取-修改修改-写回写回”的操作的操作序列来实现。状态寄存器访问指令包括:序列来实现。状态寄存器访问指令包括:MRS 状态寄存器到通用寄存器的传送指令状态寄存器到通用寄存器的传送指令MSR 通用寄存器到状态寄存器的传送指令通用寄存器到状态寄存器的传送指令136TM1361. MRSMRS指令用于将状态寄存器的内容传送到通用寄存器中。指

89、令用于将状态寄存器的内容传送到通用寄存器中。指令的编码格式:指令的编码格式:指令的语法格式:指令的语法格式:MRS , CPSRMRS , SPSR22:0CPSR;1SPSR137TM137 MRS其中:其中:n为指令执行的条件码。当为指令执行的条件码。当忽略时指令为忽略时指令为无条件执行。无条件执行。n寄存器为目标寄存器。寄存器为目标寄存器。 138TM138 MRS指令的使用指令的使用通常通过通常通过“读取读取-修改修改-写回写回”的操作序列来修改状态寄存的操作序列来修改状态寄存器的内容。器的内容。MRS指令用于将将状态寄存器的内容传送到指令用于将将状态寄存器的内容传送到通用寄存器中。通

90、用寄存器中。当异常中断允许嵌套时,需要在进入异常中断之后,嵌当异常中断允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的套中断发生之前保存当前处理器模式对应的SPSR。这。这时需要先通过时需要先通过MRS指令读出指令读出SPSR的值,再用其他指令的值,再用其他指令将将SPSR值保存起来。值保存起来。在进程切换时也需要保存当前状态寄存器值。在进程切换时也需要保存当前状态寄存器值。139TM1392. MSRMSR指令用于将通用寄存器的内容或一个立即数传送到指令用于将通用寄存器的内容或一个立即数传送到状态寄存器中。状态寄存器中。指令的编码格式:指令的编码格式:指令的源操作

91、数为通用寄存器,指令编码格式为:指令的源操作数为通用寄存器,指令编码格式为:指令的源操作数为立即数,指令编码格式为:指令的源操作数为立即数,指令编码格式为:19:16从高到低依次为从高到低依次为:f、s、x、c,为,为1时修改该位域时修改该位域有效有效140TM140 MSR指令的语法格式:指令的语法格式: MSR CPSR _, # MSR CPSR_, MSR SPSR _, # MSR SPSR_, 其中:其中: 设置状态寄存器中需要操作的位。状态寄存器的设置状态寄存器中需要操作的位。状态寄存器的32可分为可分为4个个8位的域:位的域: bits31:24为条件标志位域,用为条件标志位域

92、,用f表示;表示; bits23:16状态位域,用状态位域,用s表示;表示; bits15:8扩展位域,用扩展位域,用x表示;表示; bits7:0控制位域,用控制位域,用c表示;表示; 为将要传送到状态寄存器中的立即数。为将要传送到状态寄存器中的立即数。 寄存器包含将要传送到状态寄存器中的数据。寄存器包含将要传送到状态寄存器中的数据。 141TM141 MSR指令的使用指令的使用lMSR指令用于恢复状态寄存器的内容或改变状态寄存器指令用于恢复状态寄存器的内容或改变状态寄存器的内容。的内容。 l当退出异常中断处理程序时,如果事先保存了状态寄存当退出异常中断处理程序时,如果事先保存了状态寄存器的

93、内容通常通过器的内容通常通过MSR指令将事先保存的状态寄存器内指令将事先保存的状态寄存器内容恢复到状态寄存器中。容恢复到状态寄存器中。l当需要修改状态寄存器的内容时,通过当需要修改状态寄存器的内容时,通过“读取读取-修改修改-写回写回”指令序列完成,写回操作也是通过指令序列完成,写回操作也是通过MSR指令完成的。指令完成的。l通常在通常在MSR指令中指定指令将要修改的位域。指令中指定指令将要修改的位域。142TM142MRS/MSRMRS/MSR状态寄存器访问指令状态寄存器访问指令示例解析示例解析 143TM1434.1.8 信号量操作指令 信号量用于进程间的同步和互斥。对信号量的操作通信号量

94、用于进程间的同步和互斥。对信号量的操作通常要求是一个原子操作,即在一条指令中完成信号量的常要求是一个原子操作,即在一条指令中完成信号量的读取和修改操作。读取和修改操作。ARM提供了如下两条指令完成信号量提供了如下两条指令完成信号量的操作:的操作:SWP 交换指令。交换指令。SWPB 字节交换指令。字节交换指令。144TM1441. SWP (交换指令)n SWP指令用于将一个内存单元(该单元地址放在寄存指令用于将一个内存单元(该单元地址放在寄存器器中)的内容读取到一个寄存器中)的内容读取到一个寄存器中,同时将另一中,同时将另一个寄存器个寄存器的内容写入到该内存单元中。当的内容写入到该内存单元中

95、。当 和和为同一个寄存器时,指令交换该寄存器和内存单元的为同一个寄存器时,指令交换该寄存器和内存单元的内容。内容。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:SWP , ,145TM145 SWP (交换指令)其中:其中: 为指令执行的条件码。当为指令执行的条件码。当忽略时指令忽略时指令为无条件执行。为无条件执行。n 为目标寄存器。为目标寄存器。n 寄存器包含将要保存到内存中的数值寄存器包含将要保存到内存中的数值n 寄存器中包含将要访问的内存地址寄存器中包含将要访问的内存地址 146TM1462. SWPB (字节交换指令)指令的使用:指令的使用:n SWPB指令用于将

96、一个内存字节单元(该单元地址放在寄存指令用于将一个内存字节单元(该单元地址放在寄存器器中)的内容读取到一个寄存器中)的内容读取到一个寄存器中,寄存器中,寄存器的高的高24设置为设置为0,同时将另一个寄存器,同时将另一个寄存器的低的低8位位数值写入到该内存单元中。当数值写入到该内存单元中。当 和和为同一个寄存为同一个寄存器时,指令交换该寄存器和内存单元的字节数据内容。器时,指令交换该寄存器和内存单元的字节数据内容。147TM147 SWPB (字节交换指令)n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:SWP , , 其中,各参数用法参见其中,各参数用法参见SWP指令指令指

97、令的使用指令的使用n 本指令主要用于实现信号量的操作本指令主要用于实现信号量的操作。 148TM148SWP/SWPB指令示例解析示例解析149TM1494.1.9 异常中断产生指令 ARM有两条异常中断指令:软中断指令有两条异常中断指令:软中断指令SWI用于产生用于产生SWI异常中断,异常中断,ARM正是通过这种机制实现在用户模式正是通过这种机制实现在用户模式对操作系统中特权模式的程序的调用;断点中断指令对操作系统中特权模式的程序的调用;断点中断指令BKPT,主要用于产生软件断点,供调试程序使用。主要用于产生软件断点,供调试程序使用。它将处理器置于监控模式它将处理器置于监控模式(SVC),从

98、地址,从地址0x08开始执行开始执行指令指令SWI 软中断指令。软中断指令。BKPT 断点中断指令。断点中断指令。150TM1501. SWI (软中断指令)n SWI指令用于产生软中断。指令用于产生软中断。n 指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:SWI , n其中:其中: 为指令执行的条件码,当为指令执行的条件码,当忽略时指令为无忽略时指令为无条件执行条件执行; 为为24位的立即数。该立即数被操作系统用来位的立即数。该立即数被操作系统用来判断用户程序请求的服务类型。判断用户程序请求的服务类型。151TM151SWI (软中断指令)执行过程:执行过程:n将将SWI

99、后面指令地址保存到后面指令地址保存到R14_svc;n将将CPSR保存到保存到SPSR_svc;n进和监控模式进和监控模式,将将CPSR4:0设置为设置为0b10011的将的将CPSR7设设置为置为1,禁址禁址IRQ;n将将PC设置为设置为0x08,并且开始执行那里的指令。并且开始执行那里的指令。n返回时:返回时:MOVS PC,R14152TM152 SWI (软中断指令)指令的使用:指令的使用:l 本指令主要用于用户程序调用操作系统的系统服务。本指令主要用于用户程序调用操作系统的系统服务。操作系统在操作系统在SWI的异常中断处理程序中提供相关的系统的异常中断处理程序中提供相关的系统服务,并

100、定义了参数传递的服务。服务,并定义了参数传递的服务。l通常有以下两种用法:通常有以下两种用法: 指令中指令中24位的立即数指定了用户请求的服务类型,参位的立即数指定了用户请求的服务类型,参数通过通用寄存器传递。数通过通用寄存器传递。 指令中的指令中的24位立即数被忽略,用户请求的服务类型由位立即数被忽略,用户请求的服务类型由寄存器寄存器R0的数值决定,参数通过其他的通用寄存器传递。的数值决定,参数通过其他的通用寄存器传递。153TM1532. BKPT (软中断指令)n BKBT指令用于产生软件断点中断。软件调试指令用于产生软件断点中断。软件调试程序可以使用该中断。当系统使用硬件调试部件时可程

101、序可以使用该中断。当系统使用硬件调试部件时可忽略该中断。忽略该中断。n 指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式: BKPT , n其中其中, 为为16位的立即数。该立即数被调位的立即数。该立即数被调试软件用来保存额外的断点信息试软件用来保存额外的断点信息n指令的使用指令的使用n 本指令主要供软件调试程序使用本指令主要供软件调试程序使用154TM154SWI/BKPT异常中断产生指令示例解析示例解析155TM1554.1.10 ARM协处理器指令ARM支持支持16个协处理器。在程序执行过程中,个协处理器。在程序执行过程中,每个协处理器忽略属于每个协处理器忽略属于ARM处

102、理器和其他协处理处理器和其他协处理器的指令。当一个协处理器不能执行属于它的协器的指令。当一个协处理器不能执行属于它的协处理器指令时,将产生未定义指令异常中断,在处理器指令时,将产生未定义指令异常中断,在该异常中断处理程序中,可以通过软件模拟该硬该异常中断处理程序中,可以通过软件模拟该硬件操作。件操作。ARM协处理器可以部分执行一条指令,然后产生协处理器可以部分执行一条指令,然后产生异常中断。这些操作均有异常中断。这些操作均有ARM协处理器决定,协处理器决定,ARM处理器并不参与这些操作。同样处理器并不参与这些操作。同样 ARM协处协处理器指令中的协处理器的寄存器标识符以及操作理器指令中的协处理

103、器的寄存器标识符以及操作类型助记符也由各种不同的实现定义,可以通过类型助记符也由各种不同的实现定义,可以通过宏定义这些指令的语法格式。宏定义这些指令的语法格式。156TM156 ARM协处理器指令ARM协处理器指令包括以下协处理器指令包括以下3类:类:用于用于ARM处理器初始化处理器初始化ARM协处理器的数据处理操协处理器的数据处理操作。作。用于用于ARM处理器的寄存器和处理器的寄存器和ARM协处理器的寄存器协处理器的寄存器间的数据传送操作。间的数据传送操作。用于在用于在ARM协处理器的寄存器和内存单元之间传送协处理器的寄存器和内存单元之间传送数据。数据。157TM157 ARM协处理器指令(

104、选学)这些指令包括以下这些指令包括以下5条:条:CDP 协处理器数据操作指令协处理器数据操作指令LDC 协处理器数据读取指令协处理器数据读取指令STC 协处理器数据写入指令协处理器数据写入指令MCR ARM寄存器到协处理器寄存器的数据传送指令寄存器到协处理器寄存器的数据传送指令MRC 协处理器寄存器到协处理器寄存器到ARM寄存器的数据传送指令寄存器的数据传送指令158TM1581. CDP(协处理器数据操作指令)(协处理器数据操作指令)n CDP指令是指令是ARM处理器用于通知处理器用于通知ARM协处理器执行特协处理器执行特定的操作。该操作由协处理器完成。如果协处理器不能成定的操作。该操作由协

105、处理器完成。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。功的执行该操作,将产生未定义的指令异常中断。n 指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:CDP , 159TM159 CDP(协处理器数据操作指令)(协处理器数据操作指令)其中:其中: 为指令执行的条件码。当为指令执行的条件码。当忽略时指令为忽略时指令为无条件执行。无条件执行。n 为目标寄存器的协处理器寄存器。为目标寄存器的协处理器寄存器。n 为存放第为存放第1个源操作数的协处理器寄存器。个源操作数的协处理器寄存器。n 为存放第为存放第2个源操作数的协处理器寄存器。个源操作数的协处理器寄存器。n

106、 为协处理器的编码。为协处理器的编码。n 为协处理器将执行操作的第一操作码。为协处理器将执行操作的第一操作码。n 为协处理器将执行操作的第二操作码。为协处理器将执行操作的第二操作码。 160TM160 CDP(协处理器数据操作指令)(协处理器数据操作指令)指令的使用:指令的使用: 本指令是本指令是ARM处理器用于通知处理器用于通知ARM协处理器执行的特定协处理器执行的特定的操作。该操作中不涉及的操作。该操作中不涉及ARM寄存器和内存单元。寄存器和内存单元。例例:CDP p3,2,C8,C9,C5,6 ;注:协处理器注:协处理器p3的初始化。的初始化。 其中:操作码其中:操作码1为为2,操作码,

107、操作码2为为6,目标寄存器为,目标寄存器为C8,源操作数寄存器为源操作数寄存器为C9和和C5 161TM1612. LDC(协处理器数据读取指令)(协处理器数据读取指令)n LDC指令从一系列连续的内存单元将数据读取到协处理指令从一系列连续的内存单元将数据读取到协处理器的寄存器中。如果协处理器不能成功的执行该操作,将产器的寄存器中。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。生未定义的指令异常中断。n 指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:LDCL ,162TM162 LDC(协处理器数据读取指令)(协处理器数据读取指令)其中:其中:n L 指示指

108、令为长读取操作(当指示指令为长读取操作(当N=1时)。时)。n 为指令的寻址方式。为指令的寻址方式。n 其他参数参见其他参数参见CDP指令。指令。指令的使用指令的使用n LDC指令从一系列连续的内存单元将数据读取到协处指令从一系列连续的内存单元将数据读取到协处理器的寄存器中。理器的寄存器中。 163TM1633. STC(协处理器数据写入指令)(协处理器数据写入指令)n STC指令将协处理器的寄存器中的数据写入到指令将协处理器的寄存器中的数据写入到一系列连续的内存单元中。如果协处理器不能成功的一系列连续的内存单元中。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。执行该操作,将产

109、生未定义的指令异常中断。n指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式:STCL ,164TM164 STC(协处理器数据写入指令)(协处理器数据写入指令)其中:其中: L 指示指令为长写入操作。指示指令为长写入操作。n 其他参数参见其他参数参见CDP指令和指令和LDC指令。指令。n指令的使用指令的使用n STC指令将协处理器的寄存器中的数据写入到一系列指令将协处理器的寄存器中的数据写入到一系列连续的内存单元中。连续的内存单元中。 165TM165 STC(协处理器数据写入指令)(协处理器数据写入指令)示例:示例: LDC p6,C2,R0 STCL p6,C2,R0,#4

110、 166TM1664. MCR(ARM寄存器到协处理器的数据传送指令)n MCR指令将指令将ARM处理器的寄存器中的数据传送到处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功的执行该协处理器的寄存器中。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。操作,将产生未定义的指令异常中断。n 指令的编码格式:指令的编码格式:n指令的语法格式:指令的语法格式: MCR , 167TM167 MCR其中:其中:为为ARM寄存器,其值将被传送到协处理器寄存器寄存器,其值将被传送到协处理器寄存器中。中。n 为目标寄存器的协处理器寄存器。为目标寄存器的协处理器寄存器。n 为附

111、加的目标寄存器或者源操作数寄存器。为附加的目标寄存器或者源操作数寄存器。n 其他参数参见其他参数参见CDP指令。指令。n指令的使用指令的使用n MCR指令将指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中的数据传送到协处理器的寄存器中。处理器的寄存器中。 168TM1685. MRC(协处理器寄存器到ARM寄存器的数据传送指令)n MRC指令将协处理器的寄存器中的数据传送到指令将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。如果协处理器不能成功的执行该处理器的寄存器中。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。操作,将产生未定义的指令异常中断。n 指令的编

112、码格式:指令的编码格式:n指令的语法格式:指令的语法格式:MRC , 169TM169 MRC其中:其中:n为目标寄存器的为目标寄存器的ARM寄存器寄存器n 为协处理器寄存器,存放第为协处理器寄存器,存放第1个源操作数。个源操作数。n 为附加的目标寄存器或者源操作数寄存器。为附加的目标寄存器或者源操作数寄存器。n 其他参数参见其他参数参见CDP指令。指令。n指令的使用指令的使用n MRC指令将协处理器的寄存器中的数据传送到指令将协处理器的寄存器中的数据传送到ARM处理器的寄处理器的寄存器中。存器中。 170TM170MCR/MRCMCR/MRC(协处理器数据读取(协处理器数据读取/写入指令)写

113、入指令)示例:示例: MCR p6,2,R0,C1,C2 MRC p6,3,R3,C3,C4,6 171TM171 4.2 一些基本的ARM指令功能段 本节介绍一些基本的本节介绍一些基本的ARM指令代码段。通过代码分析,指令代码段。通过代码分析,进一步理解进一步理解ARM指令的用法,逐步学习如何使用指令的用法,逐步学习如何使用ARM指指令编写高效率的程序。本节主要包括以下几个部分的内令编写高效率的程序。本节主要包括以下几个部分的内容:容:算术逻辑运算指令的应用。算术逻辑运算指令的应用。跳转指令的应用。跳转指令的应用。Load/Store指令的应用指令的应用批量批量Load/Store指令的应用

114、指令的应用信号量指令的应用信号量指令的应用与系统相关的一些指令的应用与系统相关的一些指令的应用172TM1724.2.1 算术逻辑运算指令的应用1.位操作指令应用举例位操作指令应用举例 下面的代码将下面的代码将R2中的高中的高8位传送到位传送到R3的低的低8位中位中 MOV R0,R2,LSR #24 ; ORR R3,R0,R3,LSL #8 ;2.实现乘法的指令段举例实现乘法的指令段举例 MOV R0,R0,LSL #n ; ADD R0,R0,R0,LSL #n ; RSB R0,R0,R0,LSL #n ; ADD R0,R0,R0,LSL #2 ; ADD R0,R1,R0,LSL

115、#1 ; 173TM173 算术逻辑运算指令的应用3.64位数据运算举例位数据运算举例 假设假设R0和和R1存放了一个存放了一个64位数据,位数据,R0存放数据的低存放数据的低32位;位;R2和和R3中存放了另一个中存放了另一个64位数据,位数据,R2中存放低中存放低32位数据。下面的指令实现了两个位数据。下面的指令实现了两个64位数据的加法运位数据的加法运算,结果仍保存到算,结果仍保存到R0和和R1中。中。 ADDS R0,R0,R2 ; ADC R1,R1,R3 ; 174TM174 算术逻辑运算指令的应用 下面的指令实现了两个下面的指令实现了两个64位数据的减法运算,结果位数据的减法运算

116、,结果仍保存到仍保存到R0和和R1中。中。 SUBS R0,R0,R2 ; SBC R1,R1,R3 ; 下面的指令实现了两个下面的指令实现了两个64位数据的比较操作,并正位数据的比较操作,并正确设置确设置CPSR中的中的N、Z及及C条件标志位,而条件标志位,而V标志位的标志位的设置可能有错误设置可能有错误 CMP R1,R3 ; CMPEQ R0,R2 ; 175TM175 算术逻辑运算指令的应用4.转换内存中数据存储方式的指令段转换内存中数据存储方式的指令段 数据在内存中有两种存储方式:一种是字数据中的数据在内存中有两种存储方式:一种是字数据中的高位数据存放在高地址处,低位数据存放在低地址

117、处,高位数据存放在高地址处,低位数据存放在低地址处,这种存储方式称为这种存储方式称为little endian方式;另一种是字中高方式;另一种是字中高位数据存放在低地址处,低位数据存放在高地址处,位数据存放在低地址处,低位数据存放在高地址处,这种存储方式称为这种存储方式称为big endian方式。下面代码段可实方式。下面代码段可实现两种存储方式的转换。现两种存储方式的转换。 176TM176 算术逻辑运算指令的应用 下面的代码段将寄存器下面的代码段将寄存器R0中的数据存储方式转换成中的数据存储方式转换成另一种存储方式。指令执行前,另一种存储方式。指令执行前,R0中的数据存储方式中的数据存储方

118、式为:为:R0=A,B,C,D;指令执行后为:指令执行后为:R0=D,C,B,A EOR R1,R0,R0,ROR #16 ; BIC R1,R1,#0xFF0000 ; MOV R0,R0,ROR #8 ; EOR R0,R0,R1,LSR #8 ; 177TM177 算术逻辑运算指令的应用 下面的代码段用于转换大量的字数据的存储方式。下面的代码段用于转换大量的字数据的存储方式。指令执行前,指令执行前,R0中的数据存储方式为:中的数据存储方式为:R0=A,B,C,D;指令执行后为:指令执行后为:R0=D,C,B,A MOV R2,#0xFF ; ORR R2,R2,#0xFF0000 ; 重

119、复下面的指令段,实现数据存放方式的转换重复下面的指令段,实现数据存放方式的转换 AND R1,R2,R0 ; AND R0,R2,R0,ROR #24 ; ORR R0,R0,R1,ROR #6 ; 178TM1784.2.2 跳转指令的应用1.子程序调用子程序调用 BL指令在执行跳转操作的同时保存当前指令在执行跳转操作的同时保存当前PC寄存器值,用于从被调用的子程序寄存器值,用于从被调用的子程序中返回。下面的代码说明了子程序的调用和方法中返回。下面的代码说明了子程序的调用和方法 BL function ; function ; MOV PC, LR ;2. 条件执行条件执行 代码执行前代码执

120、行前R0中存放中存放a,R1中存放中存放b;代码执行后代码执行后R0中存放中存放a和和b的最大公约数的最大公约数 gcd CMP R0,R1 ; SUBGT R0,R0,R1 ; SUBLT R1,R1,R0 ; BNE gcd ; MOV PC,LR ; 179TM179 跳转指令的应用3.条件判断语句条件判断语句 代码执行前代码执行前R0中存放中存放a,R1中存放中存放b。代码执行后。代码执行后R2中存放中存放d和和e的和。的和。 CMP R0,#0 ; CMPNE R1,#1 ; ADDEQ R2,R3,R4 ;4.循环语句循环语句 MOV R0,#loopcout ; LOOP ; S

121、UBS R0,R0,#1 ; BNE loop ; 180TM180 跳转指令的应用5.多路分支程序语句多路分支程序语句 代码根据代码根据maxindex的不同值跳转不同的代码段。程序入口处的不同值跳转不同的代码段。程序入口处R0中中保存了跳转的索引值。保存了跳转的索引值。 CMP R0,#maxindex ; ADDLO PC,PC,R0,LSL #RoutinesSizeLog2; ; Index0Handler ; Index1Handler ; 181TM1814.2.3 Load/Store指令的应用1.链表操作链表操作 下面的代码段在链表中搜索与某一数据相等的元素。链表的每个下面的

122、代码段在链表中搜索与某一数据相等的元素。链表的每个元素包括两个字,第元素包括两个字,第1个字中包含一个字节数据;第个字中包含一个字节数据;第2个字中包含个字中包含指向下一个链表元素的指针,当这个指针为指向下一个链表元素的指针,当这个指针为0时表示链表结束。代时表示链表结束。代码执行前码执行前R0指向链表的头元素,指向链表的头元素,R1中存放要搜索的数据;代码执中存放要搜索的数据;代码执行后行后R0指向第指向第1个匹配的元素,或者当没有匹配元素时,个匹配的元素,或者当没有匹配元素时,R0为为0 llsearch CMP R0,#0 ; LDRNEB R2,R0 ; CMPNE R1,R2 ; L

123、DRNE R0,R0,#4 ; BNE llsearch ; MOV PC,LR ; 182TM182 Load/Store指令的应用2. 简单的串比较简单的串比较 下面的代码段实现比较两个串的大小。代码执行前,下面的代码段实现比较两个串的大小。代码执行前,R0指向第指向第1个个串,串,R1指向第指向第2个串。代码执行后个串。代码执行后R0中保存比较结果,如果两个中保存比较结果,如果两个串相同,串相同,R0为为0;如果第;如果第1个串大于第个串大于第2个串,个串,R00;如果第如果第1个串个串小于第小于第2个串,个串,R01 strcmp LDRB R2,R0,#1 ; LDRB R3,R1,

124、#1 ; CMP R2,#0 ; CMPNE R3 ,#0 ; BEQ strcmp ; return ; SUB R0,R2,R3 ; MOV PC,LR ; 183TM183 Load/Store指令的应用3. 长跳转长跳转 通过直接向通过直接向PC寄存器中读取字数据,程序可以实现在寄存器中读取字数据,程序可以实现在4GB的地址空间的任意跳转,这种跳转叫做长跳转。的地址空间的任意跳转,这种跳转叫做长跳转。在下面的代码段中,程序将跳转到子程序在下面的代码段中,程序将跳转到子程序function处开处开始执行。自程序执行完成后,将返回到始执行。自程序执行完成后,将返回到return_here处

125、。处。 ADD LR,PC,#4 ; ; LDR PC,PC,#-4 ; ; DCD function ; return_here ; 184TM184 Load/Store指令的应用4. 多路跳转多路跳转 下面的代码段通过函数地址表实现多路转移。其中,下面的代码段通过函数地址表实现多路转移。其中,maxindex为跳转的最大索引号,为跳转的最大索引号,R0中为跳转的索引号。中为跳转的索引号。 CMP R0,# maxindex ; LDRO PC,PC,R0,LSL#2 ; B IndexOutOfRange ; DCD Handler0 ; DCD Handler1 ; DCD Handl

126、er2 ; DCD Handler3 ; 185TM1854.2.4 批量Load/Store指令的应用简单的块复制简单的块复制 下面的代码段实现简单的数据块复制,程序一次将下面的代码段实现简单的数据块复制,程序一次将48个字数据从个字数据从R12作为首地址的一段连续的内存单元复制作为首地址的一段连续的内存单元复制到到R13作为首地址的一段连续的内存单元。代码执行前作为首地址的一段连续的内存单元。代码执行前R12为源数据区首地址,为源数据区首地址,R13为目标数据区首地址,为目标数据区首地址,R14为源数据区末地址。为源数据区末地址。 loop: LDMIA R12!, R0-R11 ; ST

127、MIA R13!, R0-R11 ; CMP R12,R14 ; BL loop ; 186TM186 批量Load/Store指令的应用子程序进入和退出是数据的保存和恢复子程序进入和退出是数据的保存和恢复 在调用子程序时,通常利用寄存器在调用子程序时,通常利用寄存器R0R3传递参数和返传递参数和返回结果,这几个参数由子程序的调用者来保存,其他回结果,这几个参数由子程序的调用者来保存,其他的子程序将要用到的寄存器在子程序入口处保存,在的子程序将要用到的寄存器在子程序入口处保存,在子程序返回前恢复这些寄存器。子程序返回前恢复这些寄存器。 function STMFD R13!,R4 R12,R1

128、4 ; Insert the function body here LDMFD R13!,R4 R12,PC ; 187TM1874.2.5 信号量指令的应用 信号量用于实现对临界区数据访问的同步。下面的信号量用于实现对临界区数据访问的同步。下面的代码说明了在代码说明了在ARM中如何实现这一过程。代码中用进中如何实现这一过程。代码中用进程标识符来表示各信号量的所有者,代码执行前进程程标识符来表示各信号量的所有者,代码执行前进程的标识符保存在的标识符保存在R1中,信号量的地址保存在中,信号量的地址保存在R0中。当中。当信号量值为信号量值为0时,表示与该信号量相关的临界区可用;时,表示与该信号量相

129、关的临界区可用;当信号量值为当信号量值为-1时,表示当前有进程正在查看该信号量时,表示当前有进程正在查看该信号量的值。如果当前进程查看的信号量正忙,当前进程将的值。如果当前进程查看的信号量正忙,当前进程将一直等待该信号量。一直等待该信号量。 188TM188 信号量指令的应用 MVN R2,#0 ; spinin SWP R3,R2,R0 ; CMN R3,#1 ; ; BEQ spinin ; CMP R3,#0 ; ; STRNE R3,R0 ; 189TM189 信号量指令的应用 BNE spinin ; STR R1,R0 ; ; spinout SWP R3,R2,R0 ; CMN

130、R3,#1 ; ; BEQ spinout CMP R3,R1 ; BNE CorruptSemaphore ; MOV R2,#0 ; STR R2,R0 ; 190TM1904.2.6 与系统相关的一些指令代码段SWI中断处理程序示例中断处理程序示例 SWI指令使处理器切换到特权模式,在特权模式下请求特定的系统指令使处理器切换到特权模式,在特权模式下请求特定的系统服务。当服务。当SWI指令执行时通常完成下面的工作。指令执行时通常完成下面的工作。 R14_svc=SWI指令的下面一条指令的地址指令的下面一条指令的地址 SPSR_svc=CPSR ; CPSR4:0=0b10011 ; CPS

131、R5=0 ; CPSR7=1 ; if high vectors configured then ; PC=0xFFFF0008 else PC=0x00000008 191TM191 与系统相关的一些指令代码段 下面的代码段是下面的代码段是SWI中断处理程序的基本框架。中断处理程序的基本框架。SWI中断向量存放在内存单元中断向量存放在内存单元0x00000008处。通常是处。通常是该地址处放一条跳转指令,其目标地址为下面代码段该地址处放一条跳转指令,其目标地址为下面代码段的首地址。的首地址。SWI指令中包含指令中包含24位的立即数,用于指定位的立即数,用于指定指令请求的具体指令请求的具体SW

132、I服务。当程序执行到服务。当程序执行到SWI指令时,指令时,程序跳转到程序跳转到 0x00000008处执行,程序接着跳转到下面处执行,程序接着跳转到下面介绍的代码段的首指令处开始执行。在下面的代码段介绍的代码段的首指令处开始执行。在下面的代码段中程序保存相关的寄存器,接着提取中程序保存相关的寄存器,接着提取SWI指令中的立即指令中的立即数,已确定数,已确定SWI指令请求的具体服务。指令请求的具体服务。 192TM192 与系统相关的一些指令代码段 SWIHandler STMFD sp!,r0-r3,r12,lr ; MRS r0,spsr ; TST r0,#0x20 ; LDRNEH r

133、0,lr,#-2 ; r0,#0xff00 ; LDREQ r0,lr,#-4 ; BICEQ r0,r0,#0xff000000 ; CMP r0,#MaxSWI ; LDRLS pc,pc,r0,LSL#2 ; B SWIOutOfRange ; Switable ; DCD do_swi_0 ; DCD do_swi_1 ; : do_swi_0 ; Insert code to handle SWI 0 here LDMFD sp!,r0-r3,r12,pc ; do_swi_1 ; 193TM193 与系统相关的一些指令代码段2. IRQ中断处理程序示例中断处理程序示例 在在ARM中

134、,外部中断管理器或外设通过使能中,外部中断管理器或外设通过使能ARM处理器中的处理器中的IRQ输入管脚产生输入管脚产生IRQ异常中断。异常中断。CPSR寄存器中的寄存器中的I控制位设置为控制位设置为1时时禁止禁止ARM处理器相应处理器相应IRQ中断请求,中断请求, CPSR寄存器中的寄存器中的I控制位设控制位设置为置为0时时ARM处理器在指令边界处检查是否有处理器在指令边界处检查是否有IRQ中断请求中断请求 R14_irq=当前指令地址当前指令地址+8 SPSR_irq=CPSR ; CPSR4:0=0b10010 ; CPSR5=0 ; CPSR7=1 ; if high vectors c

135、onfigured then ; PC=0xFFFF0018 else PC=0x00000018 194TM194 与系统相关的一些指令代码段 下面的代码段是下面的代码段是IRQ中断处理程序的基本框架。中断处理程序的基本框架。IRQ中断向量存放在内存单元中断向量存放在内存单元0x00000018处。通常是处。通常是该地址处放一条跳转指令,其目标地址为下面代码段该地址处放一条跳转指令,其目标地址为下面代码段的首地址。外围中断管理硬件将所有的的首地址。外围中断管理硬件将所有的IRQ异常中断请异常中断请求按优先级排队,并把优先级最高的求按优先级排队,并把优先级最高的IRQ异常中断的相异常中断的相关

136、信息保存到寄存器中。关信息保存到寄存器中。IRQ中断处理程序读取这些信中断处理程序读取这些信息,并跳转到相应的代码处执行。息,并跳转到相应的代码处执行。 195TM195 与系统相关的一些指令代码段SUB r14,r14,#4 ; STMFD r13!,r12,r14 ; MRS r12,spsr ; STMFD r13!,r12 ; MOV r12,#IntBase ; LDR r12, r12,#IntLevel ; ; LDR pc,pc,r12,LSL#2 ; ; DCD Priority0Handler ; DCD Priority1Handler ; Priority0Handle

137、r ; STMFD r13!,r0-r11 ; MRS r12,spsr ; ORR r12,r12,#0x80 ; MSR SPSR_cxsf,r12 ; LDMFD r13!,r0-r12 ; MSR SPSR_cxsf,r12 ; LDMFD r13!,r12,pc ; Priority1Handler ; 196TM196 与系统相关的一些指令代码段3. 进程切换进程切换 进程间切换就是通过某种方式保存当前进程的进程间切换就是通过某种方式保存当前进程的PCB,恢复新进程的恢复新进程的PCB内容到处理器中。这里讨论用户模内容到处理器中。这里讨论用户模式的进程间切换。切换过程是通过式的进程

138、间切换。切换过程是通过IRQ中断处理程序完中断处理程序完成的。成的。 在进入在进入IRQ中断处理程序时,首先计算返回地址,并中断处理程序时,首先计算返回地址,并保存相关的寄存器保存相关的寄存器 SUB r14,r14,#4 ; STMFD r13!,r0-r3,r12,r14 ; 如果如果IRQ中断处理程序返回到被中断的进程则执行下中断处理程序返回到被中断的进程则执行下面的指令。该指令从数据栈中恢复寄存器面的指令。该指令从数据栈中恢复寄存器R0R3及及R12的值,将返回地址传送到的值,将返回地址传送到PC中,并将中,并将SPSR_irq值值复制到复制到CPSR中中 LDMFD r13!,r0-

139、r3,r12,pc 197TM197 与系统相关的一些指令代码段 如果如果IRQ切换到新进程,则要保存被中断的进程切换到新进程,则要保存被中断的进程PCB,然后恢复新进程的,然后恢复新进程的PCB到处理器中。到处理器中。 MRS r12,spsr ; STR r12,r0,#8 ; ; LDMFD r13!,r2,r3 ; STMIA r0!,r2,r3 ; LDMFD r13!,r2,r3,r12,r14 ; STR r14,r0,#-12 ; ; STMIA r0!,r2-r14 ; ; LDMIA r1!,r12,r14 ; MSR SPSR_fsxc,R12 ; LDMIA r1!,r

140、0-r14 ; NOP ;MOVS PC,r14 ; 198TM1984.3 Thumb指令介绍对于内存储系统数据总线为对于内存储系统数据总线为16位的应用系统,位的应用系统,ARM体系提供了体系提供了Thumb指令集。指令集。通常在处理器执行通常在处理器执行ARM程序时,称处理器处于程序时,称处理器处于ARM状态;在处理器执行状态;在处理器执行Thumb程序时,称处理程序时,称处理器处于器处于Thumb状态。状态。Thumb指令集并没有改变指令集并没有改变ARMARM体系底层的程序设计体系底层的程序设计模型,只是在该模型上增加了一些限制条件。模型,只是在该模型上增加了一些限制条件。Thumb

141、指令集中的数据处理指令的操作数仍为指令集中的数据处理指令的操作数仍为3232位,指令寻址地址也是位,指令寻址地址也是3232位。位。199TM199 Thumb指令介绍 Thumb指令集没有提供访问指令集没有提供访问CPSR/SPSR寄存器的指寄存器的指令。处理器根据令。处理器根据CPSR寄存器中的寄存器中的T位来确定指令类型:位来确定指令类型:当当T位为位为0时,指令为时,指令为ARM指令。指令。当当T位为位为1时,指令为时,指令为Thumb指令。指令。200TM200下一讲内容提示下一讲内容提示基于基于ARM体系结构的嵌入式程序设计体系结构的嵌入式程序设计请同学们查阅相关资料作好预习请同学们查阅相关资料作好预习! !

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号