收藏 分销(赏)

第章指令介绍.ppt

上传人:快乐****生活 文档编号:2404416 上传时间:2024-05-29 格式:PPT 页数:67 大小:1.18MB
下载 相关 举报
第章指令介绍.ppt_第1页
第1页 / 共67页
第章指令介绍.ppt_第2页
第2页 / 共67页
第章指令介绍.ppt_第3页
第3页 / 共67页
第章指令介绍.ppt_第4页
第4页 / 共67页
第章指令介绍.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、2024/5/22周三可编辑1Thumb指令集2024/5/22周三可编辑2Thumb指令 Thumb指令集可以看作是ARM指令压缩形式的子集,它是为减小代码量而提出的,具有16位的代码密度。Thumb指令体系不完整,只支持通用功能。必要时仍需要使用ARM指令,如进入异常时。2024/5/22周三可编辑3简单的Thumb程序;功能:使用BX指令切换处理器状态AREAExample8,CODE,READONLYENTRYCODE32ARM_CODEADRR0,THUMB_CODE+1BXR0;跳转并切换处理器状态CODE16THUMB_CODEMOVR0,#10;R0=10MOVR1,#20;R

2、1=20ADDR0,R1;R0=R0+R1B.END在Thumb程序段之前要用CODE16声明。2024/5/22周三可编辑4Thumb指令集1.Thumb指令集与ARM指令集的区别52.存储器访问指令73.数据处理指令254.分支指令575.杂项指令626.伪指令642024/5/22周三可编辑5Thumb指令集与ARM指令集的区别 Thumb指令集较ARM指令集有如下限制:只有B指令可以条件执行,其它指令都不能条件执行;分支指令的跳转范围有更多限制;数据处理指令的操作结果必须放入其中一个;单寄存器访问指令,只能操作R0R7;LDM和STM指令可以对R0R7的任何子集进行操作;2024/5/

3、22周三可编辑6Thumb指令集1.Thumb指令集与ARM指令集的区别2.存储器访问指令3.数据处理指令4.分支指令5.杂项指令6.伪指令2024/5/22周三可编辑7Thumb存储器访问指令助记符助记符说明说明操作操作影响标志影响标志LDR/STR Rd,addressing 加载加载/存储字数据存储字数据RdRdRn,#immed_5Rn,#immed_544,RdRd、RnRn为为R0R0R7R7无无LDRH/STRH Rd,addressing 加载加载/存储无符号半字数据存储无符号半字数据RdRdRn,#immed_5Rn,#immed_52 2,RdRd、RnRn为为R0R0R7

4、R7无无LDRB/STRB Rd,addressing加载加载/存储无符号字节数据存储无符号字节数据RdRdRn,#immed_5Rn,#immed_51 1,RdRd、RnRn为为R0R0R7R7无无LDRSH Rd,addressing 加载有符号半字数据加载有符号半字数据RdRdRn,RmRn,Rm,RdRd、RnRn、RmRm为为R0R0R7R7无无LDRSB Rd,addressing加载有符号字节数据加载有符号字节数据RdRdRn,RmRn,Rm,RdRd、RnRn、RmRm为为R0R0R7R7无无单寄存器访问指令2024/5/22周三可编辑8LDR和STR加载/存储指令根据指令的

5、寻址方式不同,可以分为以下三类:立即数偏移寻址;寄存器偏移寻址;PC或SP相对偏移寻址;Thumb存储器访问指令2024/5/22周三可编辑9单寄存器访问指令立即数偏移寻址 以这种寻址方式对存储器访问时,存储器的地址以一个寄存器的内容为基址,再偏移一个立即数后指明。指令格式如下:LDRRd,Rn,#immed_54;加载内存中的字数据到寄存器Rd中STRRd,Rn,#immed_54;将Rd中的字数据存储到指定地址的内存中LDRHRd,Rn,#immed_52;加载内存中的半字数据到寄存器Rd的低16位中STRHRd,Rn,#immed_52;存储Rd中的低16位半字数据到指定的内存单元LDR

6、BRd,Rn,#immed_51;加载内存中的字节数据到寄存器Rd中STRBRd,Rn,#immed_51;存储Rd中的低8位字节数据到指定的内存单元其中:Rd表示加载或存储的寄存器。必须为R0R7。Rn表示基址寄存器。必须为R0R7。immed_5N表示立即数偏移量,其取值范围为(031)N。2024/5/22周三可编辑10单寄存器访问指令立即数偏移指令编码指令执行的操作码:0110b:LDR/STR指令;1000b:LDRH/STRH指令;0111b:LDRB/STRB指令;L用于区别加载(L为1)或存储(L为0)Immed_5:5位无符号立即数偏移Rn:基址寄存器Rd:源或目标寄存器20

7、24/5/22周三可编辑11单寄存器访问指令立即数偏移寻址注意:进行字数据访问时,必须保证传送地址为32位对齐。进行半字数据访问时,必须保证传送地址为16位对齐。应用示例:LDRR0,R1,#0 x4STRR3,R4LDRHR5,R0,#0 x02STRHR1,R0,#0 x08LDRBR3,R6,#20STRBR1,R0,#312024/5/22周三可编辑12单寄存器访问指令寄存器偏移寻址 这种寻址方式是以一个寄存器的内容为基址,以另一个寄存器的内容为偏移量,两者相加作为存储器的地址。指令格式如下:LDRRd,Rn,Rm;加载一个字数据STRRd,Rn,Rm;存储一个字数据LDRHRd,Rn

8、,Rm;加载一个无符号半字数据STRHRd,Rn,Rm;存储一个无符号半字数据LDRBRd,Rn,Rm;加载一个无符号字节数据STRBRd,Rn,Rm;存储一个无符号字节数据LDRSH Rd,Rn,Rm;加载一个有符号半字数据LDRSB Rd,Rn,Rm;存储一个有符号半字数据其中:Rd表示加载或存储的寄存器。必须为R0R7。Rn表示基址寄存器。必须为R0R7。Rm表示内含数偏移量的寄存器,必须为R0R7。2024/5/22周三可编辑13单寄存器访问指令寄存器偏移指令编码指令执行的操作码:00b:LDR/STR指令;01b:LDRH/STRH指令;10b:LDRB/STRB指令;L用于区别加载

9、(L为1)或存储(L为0)Rm:偏移量寄存器Rn:基址寄存器Rd:源或目标寄存器说明:当opcode位为11b时,L位 为 0代 表 指 令“LDRSB“,L位为1代表指令“LDRSH”2024/5/22周三可编辑14单寄存器访问指令寄存器偏移寻址注意:进行字数据访问时,必须保证传送地址为32位对齐。进行半字数据访问时,必须保证传送地址为16位对齐。应用示例:LDR R3,R1,R0STR R1,R0,R2LDRHR6,R0,R1STRHR0,R4,R5LDRBR2,R5,R1STRBR1,R3,R2LDRSHR7,R6,R3LDRSBR5,R7,R22024/5/22周三可编辑15单寄存器访

10、问指令相对偏移寻址 这种寻址方式是以PC或SP寄存器的内容为基址,以一个立即数为偏移量,两者相加作为存储器的地址。指令格式如下:LDRRd,PC,#immed_84LDRRd,labelLDRRd,SP,#immed_84STRRd,SP,#immed_84其中:Rd表示加载或存储的寄存器。必须为R0R7。immed_84表示偏移量,取值范围是(0255)4。label表示程序相对偏移表达式,Label必须在当前指令之后的1KB范围内。2024/5/22周三可编辑16单寄存器访问指令相对偏移指令编码L:用于区别加载(L为1)或存储(L为0)Rd:目标或源寄存器immed8:偏移量PC相对偏移L

11、DR指令编码SP相对偏移LDR/STR指令编码2024/5/22周三可编辑17注意:以PC作为基地址的相对偏移寻址指令只有LDR,而没有STR指令。应用示例:LDRR0,PC,#0 x08;读取PC+0 x08地址上的字数据,;保存到R0中LDRR7,LOCALDAT;读取LOCALDAT地址上的;字数据,保存到R7中LDRR3,SP,#1020;读取SP+1020地址上的字数据,;保存到R3中STRR2,SP;存储R2寄存器的数据到SP;指向的存储单元(偏移量为0)单寄存器访问指令相对偏移寻址2024/5/22周三可编辑18PUSH和POP寄存器入栈及出栈指令实现低寄存器和可选的LR寄存器入

12、栈及低寄存器和可选的PC寄存器出栈操作。堆栈地址由SP寄存器设置,堆栈是满递减堆栈。2024/5/22周三可编辑19寄存器入栈及出栈指令PUSHreglist,LRPOPreglist,PC其中:reglist入栈/出栈低寄存器列表,即R0R7。LR入栈时的可选寄存器。PC出栈时的可选寄存器。指令编码指令格式L用于区别出栈(L为1)或入栈(L为0)R用于区别操作寄存器中是否有LR/PC寄存器(有则R为1,否则为0)2024/5/22周三可编辑20PUSHreglist,LRPOPreglist,PC其中:reglist入栈/出栈低寄存器列表,即R0R7。LR入栈时的可选寄存器。PC出栈时的可选

13、寄存器。指令格式 应用示例:PUSHR0-R7,LR;将低寄存器R0R7全部入栈,;LR也入栈POP R0-R7,PC;将堆栈中的数据弹出到;低寄存器R0R7及PC中寄存器入栈及出栈指令2024/5/22周三可编辑21LDMIA和STMIA多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDMIA为加载多个寄存器;STMIA为存储多个寄存器。使用它们允许一条指令传送8个低寄存器R0R7的任何子集。2024/5/22周三可编辑22多寄存器加载/存储指令LDMIA Rn!,reglistSTMIA Rn!,reglist其中:Rn加载/存储的起始地址寄存器。Rn必须为R

14、0R7。reglist加载/存储的寄存器列表。寄存器必须为R0R7。指令编码指令格式L用于区别加载(L为1)还是存储(L为0)2024/5/22周三可编辑23 应用示例:LDMIAR0!,R2-R7;加载R0指向的地址上的多字数据,;保存到R2R7中,R0的值更新。STMIAR1!,R2-R7;将R2R7的数据存储到R1指向的;地址上,R1值更新 LDMIA/STMIA的主要用于数据复制、参数传送等。进行数据传送时,每次传送后地址加4。若Rn在寄存器列表中:对于LDMIA指令,Rn的最终值是加载的值,而不是增加后的地址;对于STMIA指令,若Rn是寄存器列表中的最低数字的寄存器,则Rn存储的值

15、为Rn初值,其它情况不可预知。多寄存器加载/存储指令2024/5/22周三可编辑24Thumb指令集1.Thumb指令集与ARM指令集的区别2.存储器访问指令3.数据处理指令4.分支指令5.杂项指令6.伪指令2024/5/22周三可编辑25Thumb数据处理指令 Thumb数据处理指令涵盖了编译器需要的大多数操作。大部分的Thumb数据处理指令采用2地址格式,不能在单指令中同时完成一个操作数的移位及一个ALU操作。所以数据处理操作比ARM状态的更少,并且访问寄存器R8R15受到限制。数据处理指令分为两类:数据传送指令算术逻辑运算指令2024/5/22周三可编辑26助记符助记符操作操作影响标志影

16、响标志MOV Rd,#exprMOV Rd,#exprRdRdexprexpr,RdRd为为R0R0R7R7影响影响N N、Z ZMOV Rd,RmMOV Rd,RmRdRdRmRm,RdRd、RmRm均可为均可为R0R0R15R15RdRd和和RmRm均为均为R0R0R7R7时,时,影响影响N N、Z Z,清零,清零C C、V V MVN Rd,RmMVN Rd,RmRdRd(Rm)(Rm),RdRd、RmRm均为均为R0R0R7R7影响影响N N、Z ZNEG Rd,RmNEG Rd,RmRdRd(-Rm)(-Rm),RdRd、RmRm均为均为R0R0R7R7影响影响N N、Z Z、C C

17、、V V数据传送指令2024/5/22周三可编辑27 MOV指令将8位立即数或寄存器传送到目标寄存器中.其指令格式如下:数据传送指令MOVMOVRd,#exprMOVRd,Rm其中:Rd目标寄存器。MOVRd,#expr时,Rd必须在R0R7之间。exper8位立即数,即0255。Rm源寄存器。为R0R15。指令编码(立即数传送)指令编码(寄存器传送)2024/5/22周三可编辑28注意:“MOVRd,#expr”指令会更新N和Z标志,对标志C和V无影响。“MOVRd,Rm”指令,若Rd或Rm是高寄存器(R8R15),则标志不受影响,若Rd或Rm都是低寄存器(R0R7),则更新标志N和Z,且清

18、除标志C和V。应用示例:MOVR1,#0 x10;R1=0 x10MOVR0,R8;R0=R8MOVPC,LR;PC=LR,子程序返回数据传送指令MOV2024/5/22周三可编辑29数据传送指令MVN MVN指令将寄存器Rm按位取反后传送到目标寄存器Rd中。指令的执行会更新N和Z标志,对标志C和V无影响。其指令格式如下:MVNRd,Rm其中:Rd目标寄存器。MOVRd,#expr时,Rd必须在R0R7之间。Rm源寄存器。为R0R15。指令编码2024/5/22周三可编辑30 应用示例:MVNR1,R2;将R2取反,结果存于R1MVNRd,Rm其中:Rd目标寄存器。MOVRd,#expr时,R

19、d必须在R0R7之间。Rm源寄存器。为R0R15。MVN指令将寄存器Rm按位取反后传送到目标寄存器Rd中。指令的执行会更新N和Z标志,对标志C和V无影响。其指令格式如下:数据传送指令MVN2024/5/22周三可编辑31数据传送指令NEGNEGRd,Rm其中:Rd目标寄存器,必须在R0R7之间。Rm源寄存器。为R0R15。指令编码 NEG指令将寄存器Rm乘以-1后传送到目标寄存器Rd中。指令会更新N、Z、C和V标志。其指令格式如下:2024/5/22周三可编辑32NEGRd,Rm其中:Rd目标寄存器,必须在R0R7之间。Rm 源寄存器。为R0R15。NEG指令将寄存器Rm乘以-1后传送到目标寄

20、存器Rd中。指令会更新N、Z、C和V标志。其指令格式如下:应用示例:NEGR1,R0;R1=-R0数据传送指令NEG2024/5/22周三可编辑33算术逻辑运算指令 算术逻辑指令包括以下几类:算术指令逻辑运算指令移位指令比较指令2024/5/22周三可编辑34ADD指令将两个数据相加,结果保存到Rd寄存器中。算术运算指令ADDADDRd,Rn,RmADDRd,Rn,#expr3ADDRd,#expr8其中:Rd目标寄存器,必须在R0R7之间。Rn第1个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。expr33位立即数,即07。expr88位立即数,即0255。低

21、寄存器的ADD指令格式:应用示例:ADDR1,R1,R0;R1=R0+R1ADDR1,R1,#7;R1=R1+7ADDR1,#200;R1=R1+2002024/5/22周三可编辑35ADD指令将两个数据相加,结果保存到Rd寄存器中。ADDRd,Rm其中:Rd目标寄存器,也是第一个操作数寄存器。Rm第2个操作数寄存器。高或低寄存器的ADD指令格式:应用示例:ADDR1,R0;R1=R1+R0算术运算指令ADD2024/5/22周三可编辑36ADD指令将两个数据相加,结果保存到Rd寄存器中。ADDSP,#expr其中:SP 目标寄存器,也是第一个操作数寄存器。expr立即数,在-508+508之

22、间的4的整数倍的数。SP操作的ADD指令格式:应用示例:ADDSP,#-500;SP=SP-500算术运算指令ADD2024/5/22周三可编辑37SUB指令将两个数据相减,结果保存到Rd寄存器中。算术运算指令SUBSUBRd,Rn,RmSUBRd,Rn,#expr3SUBRd,#expr8其中:Rd目标寄存器,必须在R0R7之间。Rn第1个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。expr33位立即数,即07。expr88位立即数,即0255。低寄存器的SUB指令格式:应用示例:SUBR1,R1,R0;R1=R1-R0SUBR1,R1,#7;R1=R1-7

23、SUBR1,#200;R1=R1-2002024/5/22周三可编辑38SUB指令将两个数据相减,结果保存到Rd寄存器中。SUBSP,#expr其中:SP目标寄存器,也是第一个操作数寄存器。expr立即数,在-508+508之间的4的整数倍的数。SP操作的SUB指令格式:应用示例:SUBSP,#380;SP=SP-380算术运算指令SUB2024/5/22周三可编辑39 ADC指令将Rm的值相加,再加上CPSR中的C条件标志位,结果保存到Rd寄存器。算术运算指令ADCADCRd,Rm其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。A

24、DC指令格式:应用示例(64位加法):ADDR0,R2ADCR1,R3;(R1、R0)=(R1、R0)+(R3、R2)2024/5/22周三可编辑40 SBC指令用寄存器Rd减去Rm,再减去CPSR中的C条件标志位的非,结果保存到Rd寄存器。算术运算指令SBCSBCRd,Rm其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。SBC指令格式:应用示例(64位减法):SUBR0,R2SBCR1,R3;(R1、R0)=(R1、R0)-(R3、R2)2024/5/22周三可编辑41 MUL乘法指令用寄存器Rd乘以Rm,结果保存到Rd寄存器。算

25、术运算指令MULMULRd,Rm其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。MUL指令格式:应用示例:MULR0,R1;R0=R0R12024/5/22周三可编辑42 AND指令将寄存器Rd的值与寄存器Rm的值按位作逻辑“与”操作,结果保存到Rd寄存器中。逻辑运算指令ANDADDRd,Rm其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。AND指令格式:应用示例:MOVR1,#0 x0FANDR0,R1;R0=R0&R1,清零R0高28位2024/5/22周三可编辑43

26、 ORR指令将寄存器Rd的值与寄存器Rn的值按位作逻辑“或”操作,结果保存到Rd寄存器中。逻辑运算指令ORRORRRd,Rm其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。ORR指令格式:应用示例:MOVR1,#0 x0FORRR0,R1;R0=R0|R1,置位R0低4位2024/5/22周三可编辑44 EOR指令将寄存器Rd的值与寄存器Rn的值按位作逻辑“异或”操作,结果保存到Rd寄存器中。逻辑运算指令EOREORRd,Rm其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间

27、。EOR指令格式:应用示例:MOVR1,#0 x0FEORR0,R1;R0=R0R1,取反R0低4位2024/5/22周三可编辑45 BIC指令将寄存器Rd的值与寄存器Rm的值的反码作逻辑“与”操作,结果保存到Rd寄存器中。逻辑运算指令BICBICRd,Rm其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。BIC指令格式:应用示例:MOVR1,#0 x02BICR0,R1;清零R0的第2位,其它位不变2024/5/22周三可编辑46 ASR指令将数据算术右移,将符号位拷贝到左侧空出的位,移位结果保存到Rd寄存器中。移位指令ASRASR

28、Rd,RsASRRd,Rm,#expr其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rs寄存器控制移位中包含移位位数的寄存器,必须在R0R7之间Rm立即数移位的源寄存器,必须在R0R7之间expr立即数移位位数,值为132ASR指令格式:ASR移位操作:若移位位数为32,则Rd清零,最后移出的位保留在标志C中;若移位位数大于32,则Rd和标志C均被清零;若移位位数为0,则不影响C标志。2024/5/22周三可编辑47 ASR指令将数据算术右移,将符号位拷贝到左侧空出的位,移位结果保存到Rd寄存器中。ASRRd,RsASRRd,Rm,#expr其中:Rd目标寄存器,也是第一个

29、操作数寄存器,必须在R0R7之间。Rs寄存器控制移位中包含移位位数的寄存器,必须在R0R7之间Rm立即数移位的源寄存器,必须在R0R7之间expr立即数移位位数,值为132ASR指令格式:应用示例:ASRR1,R2ASRR3,R1,#2移位指令ASR2024/5/22周三可编辑48 LSL指令将数据逻辑左移,空位清零,移位结果保存到Rd寄存器中。移位指令LSLLSL Rd,RsLSL Rd,Rm,#expr其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rs 寄存器控制移位中包含移位位数的寄存器,必须在R0R7之间 Rm 立即数移位的源寄存器,必须在R0R7之间 expr

30、立即数移位位数,值为131LSL指令格式:若移位位数为32,则Rd清零,最后移出的位保留在标志C中;若移位位数大于32,则Rd和标志C均被清零;若移位位数为0,则不影响C标志。LSL移位操作:02024/5/22周三可编辑49 LSL指令将数据逻辑左移,空位清零,移位结果保存到Rd寄存器中。LSL Rd,RsLSL Rd,Rm,#expr其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rs寄存器控制移位中包含移位位数的寄存器,必须在R0R7之间 Rm 立即数移位的源寄存器,必须在R0R7之间 expr 立即数移位位数,值为131LSL指令格式:应用示例:LSL R6,R7

31、LSL R1,R6,#2移位指令LSL2024/5/22周三可编辑50 LSR指令将数据逻辑右移,空位清零,移位结果保存到Rd寄存器中。移位指令LSRLSR Rd,RsLSR Rd,Rm,#expr其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rs寄存器控制移位中包含移位位数的寄存器,必须在R0R7之间 Rm 立即数移位的源寄存器,必须在R0R7之间 expr 立即数移位位数,值为132LSR指令格式:若移位位数为32,则Rd清零,最后移出的位保留在标志C中;若移位位数大于32,则Rd和标志C均被清零;若移位位数为0,则不影响C标志。LSR移位操作:02024/5/22周

32、三可编辑51 LSR指令将数据逻辑右移,空位清零,移位结果保存到Rd寄存器中。LSR Rd,RsLSR Rd,Rm,#expr其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0R7之间。Rs寄存器控制移位中包含移位位数的寄存器,必须在R0R7之间 Rm 立即数移位的源寄存器,必须在R0R7之间 expr 立即数移位位数,值为132LSR指令格式:应用示例:LSR R3,R0 LSR R5,R2,#2移位指令LSR2024/5/22周三可编辑52 ROR指令将数据循环右移,寄存器右侧移出的位放入左侧空出的位上,移位结果保存到Rd寄存器中。移位指令RORROR Rd,Rs其中:Rd 目标寄

33、存器,也是第一个操作数寄存器,必须在R0R7之间。Rs寄存器控制移位中包含移位位数的寄存器,必须在R0R7之间 ROR指令格式:ROR移位操作:应用示例:ROR R3,R02024/5/22周三可编辑53 CMP指令使用寄存器Rn的值减去第二个操作数的值,根据操作的结果更新CPSR中的N、Z、C和V标志位。比较指令CMPCMP Rn,RmCMP Rn,#expr其中:Rn 第一个操作数寄存器,必须在R0R7之间。Rm第二个操作数寄存器,必须在R0R7之间。expr 立即数,值为0255ROR指令格式:应用示例:CMP R1,#10;R1与10比较,设置相关标志位 CMP R1,R2;R1与R2

34、比较,设置相关标志位2024/5/22周三可编辑54 CMN指令使用寄存器Rn的值加上寄存器Rm的值,根据操作的结果更新CPSR中的N、Z、C和V标志位。比较指令CMNCMN Rn,Rm其中:Rn 第一个操作数寄存器,必须在R0R7之间。Rm第二个操作数寄存器,必须在R0R7之间。ROR指令格式:应用示例:CMN R0,R2;R0与-R2比较,设置相关标志位2024/5/22周三可编辑55 TST指令将寄存器Rn的值与寄存器Rm的值按位作逻辑“与”操作,根据操作的结果更新CPSR中的N、Z、C和V标志位。比较指令TSTTST Rn,Rm其中:Rn 第一个操作数寄存器,必须在R0R7之间。Rm第

35、二个操作数寄存器,必须在R0R7之间。TST指令格式:应用示例:MOV R0,#0 x01 TST R1,R0;判断R1的最低位是否为02024/5/22周三可编辑56Thumb指令集1.Thumb指令集与ARM指令集的区别2.存储器访问指令3.数据处理指令4.分支指令5.杂项指令6.伪指令2024/5/22周三可编辑57Thumb分支指令助记符说明操作条件码位置B label分支指令PClabelBcondBL label带链接的分支指令LRPC-4,PClabel无BX Rm带状态切换的分支指令PClabel,切换处理器状态无2024/5/22周三可编辑58 B指令跳转到指定的地址执行程序

36、,它是Thumb指令集中的唯一有条件执行指令。如果使用了条件执行,那么跳转范围在-252+256字节内。如果没有使用条件执行,那么跳转范围在2K内。分支指令BBcond label其中:label表示程序标号。B指令格式:应用示例:B WAITB ;WAITB标号在当前指令的2K范围内 BEQ LOOP1 ;LOOP1标号在当前指令的-252+256范围内2024/5/22周三可编辑59 BL指令在跳转到指定地址执行程序前,将下一条指令的地址拷贝到R14链接寄存器中。分支指令BLBL label其中:label 表示程序标号。BL指令格式:注意:由于BL指令通常需要大的地址范围,很难用16位指

37、令格式实现,为此,Thumb采用两条这样的指令组合成22位半字偏移(符号扩展为32位),使指令转移范围为4MB。应用示例:反汇编代码:ADDR0,R1BLRstInit 0 x1809 add r1,r1,r00 xf9dcf000 bl RstInit指令机器码汇编指令32位长的机器码2024/5/22周三可编辑60 BX指令是带状态切换的分支指令,跳转地址由Rm指定,同时根据Rm的最低位的值切换处理器状态,当最低两位均为0时,切换到ARM状态。分支指令BXBX Rm其中:Rm 保存有目标地址的寄存器。BX指令格式:应用示例:ADR R0,ArmFun;将ARM程序段地址存入R0 BX R0

38、 ;跳至R0指定的地址,并切换到ARM状态2024/5/22周三可编辑61Thumb指令集1.Thumb指令集与ARM指令集的区别2.存储器访问指令3.数据处理指令4.分支指令5.杂项指令6.伪指令2024/5/22周三可编辑62 SWI指令用于产生软中断,从而实现从用户模式变换到管理模式,CPSR保存到管理模式的SPSR中,同时程序跳转到SWI向量。在系统模式下也可以使用SWI指令,处理器同样能切换到管理模式。(参数传递的方法参看ARM指令SWI的使用)Thumb杂项指令SWISWI immed_8其中:immed_8 8位立即数,值为0255之间的整数。SWI指令格式:应用示例:SWI 1

39、 ;软中断,中断立即数为1 SWI 0 x55 ;软中断,中断立即数为0 x552024/5/22周三可编辑63Thumb指令集1.Thumb指令集与ARM指令集的区别2.存储器访问指令3.数据处理指令4.分支指令5.杂项指令6.伪指令2024/5/22周三可编辑64 ADR伪指令将基于PC相对偏移的地址值读取到寄存器中。Thumb伪指令ADRADR register,expr其中:register 加载的目标寄存器 expr 地址表达式。偏移量必须是正数并小于1KB。expr必须是局部定义的,不能被导入。ADR指令格式:应用示例:ADR R0,TxTab .TxTab DCB“ARM7TDM

40、I”,0地址范围不超过1KB2024/5/22周三可编辑65 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。详细说明参看ARM伪指令部分。Thumb伪指令LDRLDR register,=expr/label-expr其中:register 加载的目标寄存器 expr 32位立即数 label-expr 基于PC的地址表达式或外部表达式。LDR指令格式:应用示例:LDR R0,=0 x12345678;加载32位立即数0 x123456778 LDR R0,=DATA_BUF+60;加载DATA_BUF地址+60 .LTORG;声明文字池地址范围不超过1KB2024/5/22周三可编辑66 NOP伪指令在汇编时将被替换成一条Thumb空操作的指令。比如可能为“MOV R0,R0”指令。NOP伪指令可用于延时操作。Thumb伪指令NOP 应用示例(延时子程序):DelayNOP;空操作NOPNOPSUBR1,R1,#1;循环次数减一;不需要加S标志,就可以影响CPSR标志位BNEDelay;如果循环没有结束,跳转Delay继续MOVPC,LR;子程序返回2024/5/22周三可编辑67

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服