第3章 Thumb-2指令系统_第1页
第3章 Thumb-2指令系统_第2页
第3章 Thumb-2指令系统_第3页
第3章 Thumb-2指令系统_第4页
第3章 Thumb-2指令系统_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Embedded System DevelopmentEmbedded System Development嵌入式系统与应用嵌入式系统与应用 第第3 3章章 Thumb-2Thumb-2指令系统指令系统 3.1 Thumb-2指令集指令集简介简介3.2 Cortex-M33.2 Cortex-M3八种寻址方式八种寻址方式3.3 3.3 简单的简单的Thumb Thumb 汇编程序汇编程序3.4 Thumb-23.4 Thumb-2指令基本指令基本格式格式3.53.5 Cortex-M3Cortex-M3常用常用的的Thumb-2Thumb-2指令集指令集3.1 Thumb-2指令集指令集简介简

2、介FThumb-2Thumb-2继承了传统继承了传统的的1616位长度的位长度的ThumbThumb指令集指令集和和3232位长度位长度的的ARMARM指令集的各自指令集的各自优点优点。使使 Thumb Thumb 成为混合(成为混合(32 32 位和位和 16 16 位)长度指令集,是所有位)长度指令集,是所有 ARMv7 ARMv7 兼容的兼容的 ARM Cortex ARM Cortex 实现所通用的指令集。实现所通用的指令集。FThumb-2Thumb-2与与现有现有 ARM ARM 和和 Thumb Thumb 解决方案向后兼容,同时解决方案向后兼容,同时显著扩展了显著扩展了 Thu

3、mb Thumb 指令集的可用功能,从而使更多应用指令集的可用功能,从而使更多应用程序从程序从 Thumb Thumb 的同类最佳代码密度中获益的同类最佳代码密度中获益。F为为获得性能优化的代码,获得性能优化的代码,Thumb-2 Thumb-2 技术使用少于技术使用少于 31% 31% 的的内存以降低系统成本,同时,提供比现有高密度代码高出内存以降低系统成本,同时,提供比现有高密度代码高出 38% 38% 的性能,因此可用于延长电池寿命,或丰富产品功能的性能,因此可用于延长电池寿命,或丰富产品功能集。集。FCortex-M3Cortex-M3处理器使用的是处理器使用的是Thumb-2Thum

4、b-2指令集指令集的子集,的子集,它的它的指指令令工作状态只有工作状态只有Thumb-2Thumb-2状态状态。FThumb-2Thumb-2指令集体系架构,无需指令集体系架构,无需处理器进行工作状态的显处理器进行工作状态的显示示切换切换,就就可可运行运行1616位与位与3232位混合代码位混合代码,并由同一汇编器并由同一汇编器对其进行汇编。对其进行汇编。 第第3 3章章 Thumb-2Thumb-2指令系统指令系统F3.1 Thumb-2指令集指令集简介简介F3.2 Cortex-M33.2 Cortex-M3八种寻址方式八种寻址方式F3.3 3.3 简单的简单的Thumb Thumb 汇编

5、程序汇编程序F3.4 Thumb-23.4 Thumb-2指令基本指令基本格式格式3.2 3.2 Cortex-M3八种寻址方式寻址方式寻址方式是根据指令中给出的地址码字段来实现寻找寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。真实操作数地址的方式。指令的简单格式:指令的简单格式: , , ,Cortex-M3Cortex-M3处理器支持处理器支持8 8种基本寻址方式:种基本寻址方式:1 1、寄存器寻址、寄存器寻址2 2、立即寻址、立即寻址3 3、寄存器移位寻址、寄存器移位寻址4 4、寄存器间接寻址、寄存器间接寻址5 5、基址寻址、基址寻址6 6、多寄存器寻址、多寄存器寻

6、址7 7、堆栈寻址、堆栈寻址8 8、相对寻址、相对寻址 指令中的地址码字段(指令中的地址码字段(第一或第二操作数第一或第二操作数)给出的)给出的是寄存器编号,操作数的值在寄存器中,指令执行是寄存器编号,操作数的值在寄存器中,指令执行时直接取出寄存器值来操作。例:时直接取出寄存器值来操作。例: MOV R1,R2 ; MOV R1,R2 ;将将R2R2的值存入的值存入R1 R1 1 1、寄存器寻址、寄存器寻址SUB R0,R1,R2 SUB R0,R1,R2 ; ;将将R1R1的值减去的值减去R2R2的值,结果存的值,结果存R0 R0 0 xAA0 x55R2R1MOV R1,R2MOV R1,

7、R20 xAA 地址码字段(地址码字段(第一或第二操作数第一或第二操作数)直接给出是一整数)直接给出是一整数(称立即数),例:(称立即数),例: SUBS R0,R0,#1 ; SUBS R0,R0,#1 ;R0R0减减1 1结果放入结果放入R0R0,影响标志位,影响标志位2 2、立即寻址、立即寻址MOV R0,#0 xFF000 ;MOV R0,#0 xFF000 ;将立即数将立即数0 xFF0000 xFF000装入装入R0R00 x55R0MOV R0,#0 xFF00程序存储0 xFF00从代码中获得数据地址码字段(地址码字段(第一或第二操作数第一或第二操作数)在操作之前,先)在操作之

8、前,先进行移位操作。例:进行移位操作。例:MOVMOVR0,R0,R2,LSL #3 R2,LSL #3 ;R2;R2的值左移的值左移3 3位,结果存位,结果存R0R0, ; ;即是即是R0=R2R0=R28 8 3 3、寄存器移位寻址、寄存器移位寻址ANDSANDSR1,R1,R1,R1,R2,LSL R3 ;R2,LSL R3 ;R2R2的值左移的值左移R3R3位,再和位,再和R1R1相相“与与”操作,结果放入操作,结果放入R1R10 x55R0R20 x01MOV R0,R2,LSL #3MOV R0,R2,LSL #30 x080 x08逻辑左移3位可采用的移位操作可采用的移位操作FL

9、SLLSL逻辑左移逻辑左移(Logical Shift Left)(Logical Shift Left):寄存器中数据位低:寄存器中数据位低端空出的位补端空出的位补0 0;FLSRLSR逻辑右移逻辑右移(Logical Shift Right)(Logical Shift Right):寄存器中数据位高:寄存器中数据位高端空出的位补端空出的位补0 0;FASRASR算术右移算术右移(Arithmetic Shift Right)(Arithmetic Shift Right):移位过程中保:移位过程中保持符号位不变,即若源操作数为正数,则数据位的高端空持符号位不变,即若源操作数为正数,则数据

10、位的高端空出的位补出的位补0 0,否则补,否则补1 1;可采用的移位操作可采用的移位操作FRORROR循环右移循环右移(Rtate Right)(Rtate Right):由数据位的低端移出的位填:由数据位的低端移出的位填入数据位的高端空出的位;入数据位的高端空出的位;FRRXRRX带扩展的循环右移带扩展的循环右移(Rotate Right (Rotate Right eXtendedeXtended by 1 by 1 place)place):操作数右移一位,高端空出的位用原:操作数右移一位,高端空出的位用原C C标志值填标志值填充。充。 地址码段(地址码段(第一或第二操作数第一或第二操作

11、数)给出的是一个通用寄存)给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,例:单元中,即寄存器为操作数的地址指针,例: LDR R1,R2; LDR R1,R2; 将将R2R2指向的存储单元的数据读出存指向的存储单元的数据读出存R1R1 0 x55R1R2 0 x400000000 xAA0 x400000004 4、寄存器间接寻址、寄存器间接寻址LDR R1,R2LDR R1,R20 xAA 就是将基址寄存器的内容与给出的偏移量相加,形成就是将基址寄存器的内容与给出的偏移量相加,形成操作数

12、的有效地址。用于查表、数组操作、功能部件操作数的有效地址。用于查表、数组操作、功能部件寄存器访问等。例:寄存器访问等。例: LDRLDR R2,R3,#0 x0C;R2,R3,#0 x0C;读读R3+0 x0CR3+0 x0C地址上的存储单元的值存地址上的存储单元的值存R2 R2 5 5、基址寻址、基址寻址0 x55R2R3 0 x400000000 xAA0 x4000000CLDR R2,R3,#0 x0CLDR R2,R3,#0 x0C0 xAA将R3+0 x0C作为地址装载数据 多寄存器寻址一次可传送几个寄存器值,允许一条指令多寄存器寻址一次可传送几个寄存器值,允许一条指令传送传送16

13、16个寄存器的任何子集或所有寄存器。例:个寄存器的任何子集或所有寄存器。例: LDMIA R1!,R2-R4,R6 ;LDMIA R1!,R2-R4,R6 ;将将R1R1指向单元中的数据存到指向单元中的数据存到 ;R2;R2R4R4、R6R6中中(R1(R1自动加自动加4) 4) 0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器6 6、多寄存器寻址、多寄存器寻址LDMIA R1!,R2-R4,R6 LDMIA R1!,R2-R4,R6

14、0 x010 x020 x030 x040 x40000010STMIASTMIA R0!,R2-R7,R12 ;R0!,R2-R7,R12 ;将寄存器将寄存器R2R2R7R7、R12R12的值的值 ; ;存到存到R0R0指向的存储单元中指向的存储单元中 ;(R0;(R0自动加自动加4)4)7 7、堆栈寻址、堆栈寻址F堆栈是一个按特定顺序进行存取的存储区,后进先出。堆栈是一个按特定顺序进行存取的存储区,后进先出。F堆栈寻址是隐含的,使用一个专门的寄存器堆栈寻址是隐含的,使用一个专门的寄存器-堆栈指针堆栈指针SP,SP,指向堆栈的存储单元即栈顶,指向堆栈的存储单元即栈顶,2 2种堆栈方式:向上生

15、长与种堆栈方式:向上生长与向下生长的堆栈:向下生长的堆栈:栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP0 x12345678向下增长0 x12345678向上增长0 x123456780 x12345678压栈压栈堆栈寻址堆栈寻址F堆栈指针指向最后压入的有效数据项,称为满堆栈;堆栈指针指向最后压入的有效数据项,称为满堆栈;栈顶SP栈顶SP栈底空堆栈栈底满堆栈0 x123456780 x12345678栈顶SP0 x12345678栈顶SP压栈压栈F堆栈指针指向下一个待压入数据的空位置,称为空堆栈。堆栈指针指向下一个待压入数据的空位置,称为空堆栈。 堆栈寻址堆栈寻址F所以可以组合出四种类型的堆栈方

16、所以可以组合出四种类型的堆栈方式:式: 向上向上生长的满栈、向上生长的空栈生长的满栈、向上生长的空栈、 向下向下生长的满栈、向下生长的空栈。生长的满栈、向下生长的空栈。 FCortex-M3Cortex-M3向下生长的满栈模型。向下生长的满栈模型。F例:例:FSTMDB SP!, R1-R7, LR ; STMDB SP!, R1-R7, LR ; 将将R1R1R7R7、LR LR 入栈入栈FLDMIA SP!, R1-R7, PC ; LDMIA SP!, R1-R7, PC ; 出栈,到出栈,到R1R1R7R7、LR LR 寄存器寄存器8 8、相对寻址、相对寻址F相对寻址是基址寻址的一种变

17、通。由程序计数器相对寻址是基址寻址的一种变通。由程序计数器PCPC提供提供基准地址,指令中的地址码字段作为偏移量,两者相加基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址后得到的地址即为操作数的有效地址。F例:例: B WAITA ; B WAITA ; 跳转到跳转到WAITAWAITA标号标号处处,跳转范围,跳转范围+ +16MB16MB BL BL SUBR1 ; SUBR1 ; 调用到调用到SUBR1SUBR1子程序子程序,并存储返回,并存储返回地地 ;址;址到到LRLR中中,其跳转范围为,其跳转范围为+16MB+16MB SUBR1 SUBR1 WAIT

18、A WAITA 第第3 3章章 Thumb-2Thumb-2指令系统指令系统F3.1 Thumb-2指令集指令集简介简介F3.2 Cortex-M33.2 Cortex-M3八种寻址方式八种寻址方式F3.3 3.3 简单的简单的Thumb-2Thumb-2汇编程序汇编程序F3.4 Thumb-23.4 Thumb-2指令基本指令基本格式格式3.3 3.3 简单的简单的Thumb Thumb 汇编程序汇编程序; ;文件名:文件名:TEST1.S AREA |test1.s|,CODE,READONLY; AREA |test1.s|,CODE,READONLY;声明只读代码段声明只读代码段 DC

19、D _Vectors DCD _Vectors DCD Reset_Handler DCD Reset_Handler EXPORT _Vectors EXPORT _Vectors EXPORT Reset_Handler EXPORT Reset_Handler_Vectors _Vectors Reset_Handler PROCReset_Handler PROC ; PROC/ENDP ; PROC/ENDP函数起始函数起始STARTSTART MOV R0,#15 ;R0 = 15 MOV R0,#15 ;R0 = 15 MOV R1,#8 ; R1 =8 MOV R1,#8 ;

20、R1 =8 ADDS R0,R0,R1; R0 = R0 + R1 ADDS R0,R0,R1; R0 = R0 + R1 B BSTART START ENDP ;ENDP ;此处函数起始标记可省此处函数起始标记可省 END END使用使用“;”进行注释进行注释标号顶格写实际代码段声明文件结束第第3 3章章 Thumb-2Thumb-2指令系统指令系统F3.1 Thumb-23.1 Thumb-2指令集指令集简介简介F3.2 Cortex-M33.2 Cortex-M3八种寻址方式八种寻址方式F3.3 3.3 简单简单的的Thumb Thumb 汇编程序汇编程序F3.4 3.4 Thumb-

21、2Thumb-2指令基本指令基本格式格式F3.53.5 Cortex-M3Cortex-M3常用常用的的Thumb-2Thumb-2指令集指令集3.4 Thumb-23.4 Thumb-2指令基本格式指令基本格式1 1、指令基本格式:、指令基本格式: S.N|.W ,S.N|.W ,F 号内的项是必需的,号内的项是必需的,号内的项是可选的;号内的项是可选的;FOpcodeOpcode 指令助记符,如指令助记符,如LDRLDR、STR STR 等;等;FCondCond 指令执行条件指令执行条件码码,不选为,不选为ALAL(无条件执行);(无条件执行);FS S 有有S S则运算结果影响则运算结

22、果影响APSRAPSR寄存器的标志位;寄存器的标志位;F.N|.W .N.N|.W .N为为1616位编码指令,位编码指令,.W.W为为3232位编码指令,位编码指令, 建议不建议不选选该项让系统自动选择编码类型;该项让系统自动选择编码类型;FRd Rd 目的寄存器;目的寄存器;FRn Rn 第第1 1个个操作数的操作数的寄存器;寄存器;FOperand2 Operand2 第第2 2个个操作数。操作数。F例:例:FLDR.N LDR.N R1,R2,#0 x10 ; R1,R2,#0 x10 ; 16 16 位指令位指令,立即,立即数范围为数范围为0-1240-124 ; ;读读R2+0 x

23、10R2+0 x10存储单元存储单元的的内容,存内容,存到到R1R12 2、指令执行条件码、指令执行条件码F使用指令条件码可以实现高效的逻辑操作,提高代码的使用指令条件码可以实现高效的逻辑操作,提高代码的执行效率。执行效率。不选为不选为ALAL。条件码条件码标志标志含义含义EQEQZ=1Z=1相等相等NENEZ=0Z=0不相等,与不相等,与EQEQ相反相反CS/HSCS/HSC=1C=1进位(无符号数大于或等于)进位(无符号数大于或等于)CC/LOCC/LOC=0C=0未进位(无符号数小于)未进位(无符号数小于)MIMIN=1N=1负数负数PLPLN=0N=0非负数非负数VSVSV=1V=1溢

24、出溢出VCVCV=0V=0没有溢出没有溢出HIHIC = = 1 & Z = = 0C = = 1 & Z = = 0无符号数大于无符号数大于LSLSC = = 0 | Z = = 1C = = 0 | Z = = 1无符号数小于或等于无符号数小于或等于GEGEN=VN=V有符号数大于或等于有符号数大于或等于LTLTN!=VN!=V有符号数小于有符号数小于GTGTZ = = 0 & N = = VZ = = 0 & N = = V有符号数大于有符号数大于LELEZ = = 1 | N ! = VZ = = 1 | N ! = V有符号数小于或等于有符号数小于或等于ALAL无条件执行无条件执行指

25、令执行条件码指令执行条件码F在在 Cortex-M3 Cortex-M3中中,只有,只有分支转移指令(分支转移指令(B B指令)才可以随指令)才可以随意使用条件意使用条件码码。例:。例: BEQ label ;BEQ label ;当当 Z = = 1 Z = = 1 时,程序转移时,程序转移到到labellabelF对于对于其它指令其它指令,只有在,只有在I IF-F-T THENHEN(ITIT)指令块中指令块中( (最多最多4 4条条) )才能才能加条件码,且必须加条件码加条件码,且必须加条件码。FITIT已经已经带了一带了一个个T T,最多,最多再带再带3 3个个T T或或E E( (

26、与与T T相反的条件相反的条件) ),T T、E E排列无顺序排列无顺序。例:例:F CMP CMP R0, R1 R0, R1 ; ; 比较比较R0R0和和R1R1的值,影响标志位的值,影响标志位 ITTEE ITTEE GT GT ; ; 下带下带4 4条指令,条指令,如如R0R1R0R1既既GTGT成立成立,否则,否则LELE成立成立 MOV MOVGTGT R2, R0 ; GTR2, R0 ; GT成立成立,则则 R2 R2 = R0= R0 MOV MOVGTGT R3, R1 ; R3, R1 ; GTGT成立成立,则,则 R3 R3 = R1= R1 MOV MOVLELE R

27、2, R2, R1 R1 ; ; LELE成立成立,则则 R2 R2 = R1= R1 MOV MOVLELE R3, R3, R0 R0 ; ; LELE成立,则成立,则 R3 R3 = = R0R0 3 3、影响标志位的指令、影响标志位的指令在在Cortex-M3Cortex-M3中中,下列指令将会更新,下列指令将会更新 APSR APSR 中的标志位中的标志位:F16 16 位算术逻辑指令;位算术逻辑指令;F32 32 位带位带 S S 后缀的算术逻辑指令;后缀的算术逻辑指令;F比较指令比较指令(如(如CMP/CMNCMP/CMN)和测试指令和测试指令(如(如TST/TEQTST/TEQ

28、);F直接操作直接操作 PSR/APSR PSR/APSR 指令(指令( MRS MRS读和读和MSRMSR写写指令)。指令)。4 4、第第2 2个操作数个操作数的格式的格式F立即数:立即数:# #immNimmN,3 3、5 5、8 8、1212、1616位长度的常数位长度的常数表达式,如:表达式,如: MOVW R1MOVW R1,#0 x1234 ; #0 x1234 ; 操作数操作数为为#imm16#imm16,范围,范围为为065535065535由一个由一个8 8 位数左移任意位而形成的常数,位数左移任意位而形成的常数,如:如:0 x3FC(0 xFF0 x3FC(0 xFF2)2

29、);重复半字形式重复半字形式0 x00XY00XY0 x00XY00XY、0 xXY00XY000 xXY00XY00、0 xXYXYXYXY0 xXYXYXYXY;FRmRm寄存器方式:操作数寄存器方式:操作数即为寄存器的即为寄存器的数值,例数值,例:SUB R1SUB R1,R1R1,R2 ;R2 ; R1R1减减R2R2,保存,保存到到R1R1中中F寄存器移位方式:寄存器移位方式:Rm,ShiftRm,Shift,将,将寄存器的移位结果作为操寄存器的移位结果作为操作数作数,例移位,例移位方法如下:方法如下:ASR ASR #n #n 算术右移算术右移n n位位(1n32)1n32);F例

30、例:ADD R1, R1, R1, LSL #3 ADD R1, R1, R1, LSL #3 ; ;逻辑左移逻辑左移R1 R1 = = R1+R1R1+R18 8第第3 3章章 Thumb-2Thumb-2指令系统指令系统F3.1 Thumb-2指令集指令集简介简介F3.2 Cortex-M33.2 Cortex-M3八种寻址方式八种寻址方式F3.3 3.3 简单简单的的Thumb Thumb 汇编程序汇编程序F3.4 3.4 Thumb-2Thumb-2指令基本指令基本格式格式F3.53.5 Cortex-M3Cortex-M3常用常用的的Thumb-2Thumb-2指令集指令集3.53.

31、5 Cortex-M3Cortex-M3常用常用的的Thumb-2Thumb-2指令集指令集 1、数据数据传送指令传送指令 2、存储器访问存储器访问指令指令 3、算术运算指令算术运算指令 4、逻辑运算逻辑运算指令指令 5、移位和循环指令移位和循环指令 6、符号扩展指令符号扩展指令 7、字节字节调序调序指令指令 8、位位域处理指令域处理指令 9、子程序子程序调用与无条件转移指令调用与无条件转移指令 10、饱和饱和运算运算指令指令1、数据传送指令数据传送指令F 指令指令功能描述功能描述MOVMOV , # , #将将8 8位位立即数立即数传到传到目标寄存器目标寄存器MOV , MOV , 将寄存器

32、将寄存器值值传给传给低目标寄存器低目标寄存器MVNMVN , , 寄存器寄存器值取反后值取反后传给传给目标寄存器目标寄存器MOVS.MOVS.W RdW , , #将将1212位立即数传送到寄存器中位立即数传送到寄存器中MOVS.W , RmMOVS.W , ,shift将移位后的寄存器值将移位后的寄存器值传到寄存器传到寄存器MOVTMOVT.W , #.W , #将将1616位立即数传送到寄存器的高位立即数传送到寄存器的高半字半字31:1631:16 MOVWMOVW.W , #.W , #1616位立即数位立即数传到传到寄存器的低半字寄存器的低半字15:015:0 ,将,将高半字高半字31

33、:1631:16清零清零MRSMRS , d, 读读特殊功能寄存器特殊功能寄存器SRegSRegMSRMSR , , n写写特殊功能寄存器特殊功能寄存器SRegSReg数据传送指令数据传送指令F例例利用利用MOVWMOVW和和MOVTMOVT指令的配合来完成指令的配合来完成3232位立即数的传输位立即数的传输: MOVW R1 MOVW R1,#0 x1234; #0 x1234; R1 = 0 x1234R1 = 0 x1234,此指令的立即数为,此指令的立即数为1616位位 MOVT R1 MOVT R1,#0 x5678;#0 x5678; 此指令的立即数此指令的立即数为为1616位位F

34、两两条指令执行后,条指令执行后,R1 = R1 = 0 x567812340 x56781234,相当于:相当于:R1 R1 = (R1 & 0 x0000FFFF) | = (R1 & 0 x0000FFFF) | 0 x567800000 x56780000F为什么为什么先用先用MOVWMOVW后用后用MOVT MOVT ?颠倒顺序结果如何?颠倒顺序结果如何?FMRS/MSR MRS/MSR 用于特权级别条件下访问特殊功能寄存器用于特权级别条件下访问特殊功能寄存器:2、存储器、存储器访问访问指令指令FCortex-M3Cortex-M3处理器对存储器的访问只能通过加载处理器对存储器的访问只

35、能通过加载LDRLDR和存储和存储STRSTR指令来实现。指令来实现。FLDRLDR是把存储器中的内容加载到寄存器中,是把存储器中的内容加载到寄存器中,STRSTR则是把寄存则是把寄存器内容存储至存储器中,数据类型:字节、半字、字和双器内容存储至存储器中,数据类型:字节、半字、字和双字;字;FLDM/STMLDM/STM多寄存器加载和存储指令可以实现一条指令加载多寄存器加载和存储指令可以实现一条指令加载和存储多个寄存器的内容,且大大高数据操作效率。和存储多个寄存器的内容,且大大高数据操作效率。四种四种传输模式传输模式: :IAIA:每次传送后地址加:每次传送后地址加4 4;DBDB:每次传送前

36、地址减:每次传送前地址减4 4;FDFD:满递减堆栈;:满递减堆栈;EAEA:空递增堆栈。:空递增堆栈。存储器存储器访问访问指令指令指令格式指令格式功能说明功能说明LDRLDRRd,addressingRd,addressing 加载存储器字加载存储器字到到RdRd寄存器寄存器LDRHLDRHRd,addressingRd,addressing 加载存储器半字加载存储器半字15:015:0到到RdRdLDRBLDRBRd,addressingRd,addressing 加载存储器字节加载存储器字节7:07:0到到RdRdLDRSHLDRSHRd,addressingRd,addressing

37、加载有加载有符号半符号半字到字到RdRd,并对,并对其符号扩展其符号扩展LDRSBLDRSBRd,addressingRd,addressing 加载有加载有符号符号字节到字节到RdRd,并对,并对其符号扩展其符号扩展LDRDLDRDRd1,Rd2,addreRd1,Rd2,addre 从连续的地址空间加载双字从连续的地址空间加载双字到到2 2个个寄存器寄存器LDMIA/FDLDM Rn!,reglistRn!,reglist 连续加载多个存储器字连续加载多个存储器字到多个寄存器到多个寄存器STRSTRRd,addressingRd,addressing 把一个寄存器按字存储到把一个寄存器按字

38、存储到存储器存储器STRHSTRHRd,addressingRd,addressing 把一个寄存器按半字把一个寄存器按半字15:015:0存储到存储到存储器存储器STRBSTRBRd,addressingRd,addressing 把一个寄存器按字节把一个寄存器按字节7:07:0存储到存储到存储器存储器STRDSTRDRd1,Rd2,addreRd1,Rd2,addre 存储存储2 2个个寄存器组成的双字到寄存器组成的双字到连续的空间连续的空间STMIA/EASTM Rn!,reglistRn!,reglist 连续存储多个寄存器字到连续存储多个寄存器字到存储器存储器PUSHPUSH reg

39、listreglist,LR,LR 将多个寄存器值压栈将多个寄存器值压栈POPPOP reglistreglist,PC,PC 从栈中弹出多个值到寄存器中从栈中弹出多个值到寄存器中存储器访问存储器访问指令指令STM/LDM STM/LDM 与与 PUSH/POP PUSH/POP 的区别:的区别:FSTM/LDM STM/LDM 能对任意的地址空间进行操作,而能对任意的地址空间进行操作,而 PUSH/POP PUSH/POP 只只能能对堆栈对堆栈空间进行操作空间进行操作;FSTM/LDM STM/LDM 的生长方式可以支持向上和向下两种方式,而的生长方式可以支持向上和向下两种方式,而 PUSH

40、/POP PUSH/POP 只能支持向下只能支持向下生长;生长;F当两对指令的操作数都为当两对指令的操作数都为 SP SP 时,时,STM/LDM STM/LDM 可以选择是否可以选择是否回写修改回写修改 SP SP 值,值,而而PUSH/POP PUSH/POP 指令会自动修改指令会自动修改 SP SP 值值。STMDB SP!,R4-R7STMDB SP!,R4-R7,LR;LR;现场保护,现场保护,R4-R7R4-R7、LRLR入栈入栈等价等价于于: PUSH PUSH R4-R7R4-R7,LRLR ;LDMIA SP!,R4-R7LDMIA SP!,R4-R7,PCPC;恢复现场恢复

41、现场,R4-R7R4-R7、LRLR入栈入栈等价于:等价于: POP R4-R7POP R4-R7,PCPC;3 3、算术运算指令算术运算指令ADD Rd, Rn, Rm ; Rd = Rn+RmADD Rd, Rn, Rm ; Rd = Rn+Rm常规加法常规加法ADD Rd, Rm ; Rd += RmADD Rd, Rm ; Rd += RmADD Rd, #imm ; Rd += immADD Rd, #imm ; Rd += immim8im8(16 16 位指令)或位指令)或im12im12(3232位指令)位指令)ADC Rd, Rn, Rm ; Rd = Rn+Rm+CADC

42、Rd, Rn, Rm ; Rd = Rn+Rm+C带进位的加法带进位的加法, , Im8 Im8 或或im12im12ADC Rd, Rm ; Rd += Rm+CADC Rd, Rm ; Rd += Rm+CADC Rd, #imm ; Rd += imm+CADC Rd, #imm ; Rd += imm+CSUB Rd, Rn ; Rd -= RnSUB Rd, Rn ; Rd -= Rn常规减法常规减法SUB Rd, Rn, #imm3 ; Rd = Rn-imm3SUB Rd, Rn, #imm3 ; Rd = Rn-imm3SUB Rd, #imm8 ; Rd -= imm8SUB

43、 Rd, #imm8 ; Rd -= imm8SUB Rd, Rn, Rm ; Rd = Rm-RmSUB Rd, Rn, Rm ; Rd = Rm-RmSBC Rd, Rm ; Rd -= Rm+CSBC Rd, Rm ; Rd -= Rm+C带借位的减法带借位的减法SBC.W Rd, Rn, #imm12 ; Rd = Rn-imm12-CSBC.W Rd, Rn, #imm12 ; Rd = Rn-imm12-CSBC.W Rd, Rn, Rm ; Rd = Rn-Rm-CSBC.W Rd, Rn, Rm ; Rd = Rn-Rm-C算术运算指令算术运算指令F除法中,除法中,为捕捉为捕捉

44、被零除的非法操作被零除的非法操作,可在,可在NVICNVIC的配置控制的配置控制寄存器中置位寄存器中置位DIVBZERODIVBZERO位。位。F如出现了被零除的情况,将会引发一个用法如出现了被零除的情况,将会引发一个用法faultfault异常。异常。如没有如没有任何措施,任何措施,RdRd将在除数为零时被清零。将在除数为零时被清零。RSB.W Rd, Rn, #imm12 ; Rd = imm12-RnRSB.W Rd, Rn, #imm12 ; Rd = imm12-Rn反向减法反向减法RSB.W Rd, Rn, Rm ; Rd = Rm-RnRSB.W Rd, Rn, Rm ; Rd

45、= Rm-RnMUL Rd, Rm ; Rd MUL Rd, Rm ; Rd * *= Rm= Rm常规乘法常规乘法MUL.W Rd, Rn, Rm ; Rd = RnMUL.W Rd, Rn, Rm ; Rd = Rn* *RmRmMLA Rd, Rm, Rn, Ra ; Rd = Ra+RmMLA Rd, Rm, Rn, Ra ; Rd = Ra+Rm* *RnRn乘加乘加MLS Rd, Rm, Rn, Ra ; Rd = Ra-RmMLS Rd, Rm, Rn, Ra ; Rd = Ra-Rm* *RnRn乘减乘减UDIV Rd, Rn, Rm ; Rd = Rn/Rm UDIV Rd,

46、 Rn, Rm ; Rd = Rn/Rm 无符号除法无符号除法硬件支持的除法,硬件支持的除法,余数被丢弃余数被丢弃SDIV Rd, Rn, Rm ; Rd = Rn/Rm SDIV Rd, Rn, Rm ; Rd = Rn/Rm 带符号除法带符号除法SMULL RL, RH, Rm, Rn ;RH:RL= RmSMULL RL, RH, Rm, Rn ;RH:RL= Rm* *RnRn带符号的带符号的64 64 位乘法位乘法SMLAL RL, RH, Rm, Rn ;RH:RL+= RmSMLAL RL, RH, Rm, Rn ;RH:RL+= Rm* *RnRnUMULL RL, RH, R

47、m, Rn ;RH:RL= RmUMULL RL, RH, Rm, Rn ;RH:RL= Rm* *RnRn无符号的无符号的64 64 位乘法位乘法SMLAL RL, RH, Rm, Rn ;RH:RL+= RmSMLAL RL, RH, Rm, Rn ;RH:RL+= Rm* *RnRn算术运算指令算术运算指令F以加法为例说明以加法为例说明16bit16bit、32bit32bit的算术四则运算指令:的算术四则运算指令:ADD R0, R1 ; R0 += R1ADD R0, #0 x12 ; R0 += 12ADD.W R0, R1, R2 ; R0 = R1+R2F当使用当使用16 16

48、 位加法时,会自动更新位加法时,会自动更新APSR APSR 中的标志位。中的标志位。F在使用了在使用了“.W.W”显式指定了显式指定了32 32 位指令后,就可以通过位指令后,就可以通过“S”S”后缀控制对后缀控制对APSR APSR 的更新:的更新:ADD.W R0, R1, R2 ; 不更新标志位不更新标志位ADDS.W R0, R1, R2 ; 更新标志位更新标志位4 4、逻辑运算指令、逻辑运算指令AND Rd, Rn ; Rd &= RnAND.W Rd, Rn, #imm12 ; Rd = Rn & imm12AND.W Rd, Rm, Rn ; Rd = Rm & Rn按位与OR

49、R Rd, Rn ; Rd |= RnORR.W Rd, Rn, #imm12 ; Rd = Rn | imm12ORR.W Rd, Rm, Rn ; Rd = Rm | Rn按位或BIC Rd, Rn ; Rd &= RnBIC.W Rd, Rn, #imm12 ; Rd = Rn & imm12BIC.W Rd, Rm, Rn ; Rd = Rm & Rn 位清零Rn与operand2 的反码按位逻辑与ORN.W Rd, Rn, #imm12 ; Rd = Rn | imm12ORN.W Rd, Rm, Rn ; Rd = Rm | Rn 按位或反码EOR Rd, Rn ; Rd = Rn

50、EOR.W Rd, Rn, #imm12 ; Rd = Rn imm12EOR.W Rd, Rm, Rn ; Rd = Rm Rn(按位)异或,异或总是按位的5 5、移位和循环指令移位和循环指令LSL Rd, Rn, #imm5 ; Rd = Rnimm5LSL Rd, Rn ; Rd = RnLSL.W Rd, Rm, Rn ; Rd = Rmimm5LSR Rd, Rn ; Rd = RnLSR.W Rd, Rm, Rn ; Rd = RmRn逻辑右移ASR Rd, Rn, #imm5 ; Rd = Rnimm5ASR Rd, Rn ; Rd = RnASR.W Rd, Rm, Rn ;

51、Rd = Rm Rn算术右移ROR Rd, Rn ; Rd = RnROR.W Rd, Rm, Rn ; Rd = Rm Rn循环右移RRX.W Rd, Rn ; Rd=(Rn1)+(C31) 带进位的右移一位F如果是如果是16 位位Thumb-2指令,则总是更新指令,则总是更新C 的。的。F如果在指令上加上如果在指令上加上“S”后缀,会更新进位位后缀,会更新进位位C。6 6、符号扩展指令符号扩展指令F二进制补码表示法中,最高位是符号位二进制补码表示法中,最高位是符号位。F把一个把一个8 8 位或位或16 16 位负数扩展成位负数扩展成32 32 位时位时:对于对于负数负数,必须把所有高位全填

52、必须把所有高位全填1 1,其数值不变其数值不变;至于正数或无符号数,则只需简单地把高位清至于正数或无符号数,则只需简单地把高位清0 0。指令指令功能描述功能描述SXTB Rd, Rm ; Rd = Rm带符号扩展带符号扩展 把带符号字节整数扩展到把带符号字节整数扩展到 32 位位SXTH Rd, Rm ; Rd = Rm带符号扩展带符号扩展把带符号半字整数扩展到把带符号半字整数扩展到 32 位位7 7、字节调序指令字节调序指令REV.W Rd, Rn 在字中调整字节序在字中调整字节序REV16.W Rd, Rn 在高低半字中调整字节序在高低半字中调整字节序REVSH.W 在低半字中调整字节序,

53、并带符号扩展在低半字中调整字节序,并带符号扩展例:例:R0=0 x12345678R0=0 x12345678 REV R1, R0 REV R1, R0; REVH R2, R0 REVH R2, R0; REV16 R3, R0 REV16 R3, R0; 则则R1=0 x78563412R1=0 x78563412, R2=0 x12347856 R2=0 x12347856, R3=0 x34127856 R3=0 x34127856。例:例:R0=0 x33448899R0=0 x33448899 REVSH R1, R0REVSH R1, R0; 后后 R1=0 xFFFF9988

54、 R1=0 xFFFF9988。8 8、位域处理指令位域处理指令例例1 1: LDR R0, =0 x1234FFFF; BFC R0, #4, #10; 结果:结果:R0= 0 x1234C00F。指令指令功能描述功能描述BFC.W Rd, #, #位域位域清零:第清零:第lsb位开始的位开始的width宽度宽度BFI.W Rd, Rn, #, #将寄存器的将寄存器的位域位域插入另一个寄存器中插入另一个寄存器中CLZ.W Rd, Rn 计算前导计算前导0 的数目的数目RBIT.W Rd, Rn 按位旋转按位旋转180 度度SBFX.W Rd, Rn, #, # 拷贝位域,并带符号扩展到拷贝位域,并带符号扩展

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论