Thumb指令.doc

上传人:scccc 文档编号:12532935 上传时间:2021-12-04 格式:DOC 页数:110 大小:1.22MB
返回 下载 相关 举报
Thumb指令.doc_第1页
第1页 / 共110页
Thumb指令.doc_第2页
第2页 / 共110页
Thumb指令.doc_第3页
第3页 / 共110页
Thumb指令.doc_第4页
第4页 / 共110页
Thumb指令.doc_第5页
第5页 / 共110页
点击查看更多>>
资源描述

《Thumb指令.doc》由会员分享,可在线阅读,更多相关《Thumb指令.doc(110页珍藏版)》请在三一文库上搜索。

1、第5章Thumb指令5 Thumb指令 Thumb指令Thumb指令集可以看作是ARM指令压缩形式的 子集,它是为减小代码量而提出的,具有16住的代 码密度。Thumb指令体糸不完整,只支持通用功能。 必要肘仿需要使用ARM指令,如进入异常肘。说明:Thumb指令的格式与使用方式与ARM指令集类似,而且 使用并不是很频繁,建议这部分内容选修。简单的Thumb程序;功能:使用EX指令切换处理器状态AREAExample8rCODE,READONLYENTRYCODE32ARM_CODEADRRO THUMB_CODE+1BXRO;跳转并切换处理器状态(CODE16A Thumb程序段之前I要用C

2、ODE16步朗。丄THUMB CODEMOVRO,#10;R0 = 10MOVRlz#20;R1 = 20ADDR0f R1;RO = R0+R1BENDThumb指令小节B录1. Thumb指令集与ARM指令集的区另U2. 存储器访问指令3. 数据处理指令4. 分支指令5. 杂项指令6. Thumb指令功能码段分析1. Thumb指令集与ARM指令集的区另U2. 存储器访问指令3. 数据处理指令4. 分支指令5. 杂项扌旨令Thumb指令功能码段分析5.1 Thumb指令集与ARM指令集的区别 Thumb指令集与ARM指令集的区别Thu mb指令集较ARM指令集有如下限制:只有B指令可以条件

3、执行,其它指令都不能条件埶行;分支指令的跳转范囲有更多限制;数据处理指令的操作结果必须放入其中一个;单寄存器访问指令,只能操作R0R7;LDM和5TM指令可以对R0R7的任何子集进行操作;Thumb寄存器在ARM寄存器上的映射在Thumb中, 高寄存器不 是标准寄存 器。汇编语 言程序员对 它们的访问 受到限制。可以使用MOV、CMP和ADD指令对 高寄存器操 作。Thumb状态R0 一R1R2 °R3 °R4R5R6 一R7堆栈指针(SP)连接寄存器(LR)程序计数器(PC)当前程序状态寄存器(CPSR )被保存程序状态寄存器(SPSR )R0R1R2R3R4R5R6R7

4、R8R9R10R11R12堆栈指针(R13)连接寄存器(R14)程序计数器(R15)当前程序状态寄存器(CPSR )被保存程序状态寄存器(SPSR )ARM状态低寄存器Thumb指令小节B录1. Thumb指令集与ARM指令集的区另I2. 存储器访问指令3. 数据处理指令4. 分支指令5. 杂项指令Thumb指令功能码段分析5-2存储器访问指令 Thumb存储器访问指令单寄存器访问指令助记符说明操作影响标志LDR/STR Rd,addressing加载/存储字数据Rd Rn, #immed_5 X4,Rd、Rn为ROR7无LDRH/STRHRd,addressi ng加载/存储无符号半 字数据

5、RdRn, Siinmed_5 X2,Rd、Rn为ROR7无LDRB/STRBRd,addressi ng加载/存储无符号字 节数据Rd Rn, #immed_5 X1, Rd、Rn为ROR7无LDRSH Rd,addressing加载有符号半字数据Rd Rn, Rin, Rd、Rn、Rm为ROR7无LDRSB Rd,addressing加载有符号字节数据Rd Rn, Rin, Rd、Rn>Rm为ROR7无5.2存储器访问指令 Thumb存储器访问指令 LDR和STR 加我/存储指令可以分为以下三类:根据指令的寻址方式不同, 立即数偏移寻址; 寄存器偏移寻址;PC或SP相对偏移寻址;单寄

6、存器访问指令立即数偏移寻址y人这种寻址方式对存储器访问时,存储器的地址以 一个寄'存器的内家为基址,在偏移一个立即数后指朗o 指令格式如下:LDR Rd, Rn,ttininied_5X4;加载内存屮的字数据到寄存器Rd屮STRRd, Rn, ftinmied_5 X4LDRHRd, Rn?ttininied_5X2STRHRd, Rn, ttimmed_5X2LDRBRd, Rn, #immed_5 X 1STRBRd, Rn, #immed_5 X 1将Rd屮的字数据存储到指定地址的内存屮加载内存屮的半字数据到寄存器Rd的低16位屮 存储Rd屮的低16位半字数据到指定的内存单元 加

7、载内存中的字节数据到寄存器Rd屮存储Rd屮的低8位字节数据到指定的内存单元其屮:Rd表示加载或存储的寄存器。必须为R0R7。Rn表示基址寄存器。必须为R0R7。imnied_5XN表示立即数偏移量,其取值范围为(031) XN。单寄存器访冋指令立即数偏移指令编码653206RnRdRd :源或目扌示寺存彖Rn:基址寄存器 lmmed_5: 5住无符号立即数偏移单寄存器访问指令立即数偏移寻址应用示例:LDRRO,R1,#0x4STRR3Z R4LDRHR5R0z #0x02STRHRl, R0z #0x08LDRBR3, R6Z #20STRBRl,RO,#31注意:进行字数据访问时,必须保证传

8、送地址为32住对 齐(字对齐丿。进行半字数据访问时,必须保证传送地 址为16佞对齐(半字对齐丿。单寄存器访问指令寄存器偏移寻址这种寻址方式是以一个寄存器的内彖为基址,以另 _个寄存器的内蓉为偏移量,两者相加作为存儲器的地址。指令格式如下:LDRRd,'Rn, Rni;加载一个字数据STRRd, Rn, Rin;存储一个字数据LDRHRd, Rn, Rni;加载一个无符号半字数据STRHRd, Rn, Rni;存储一个无符号半字数据LDRBRd, Rn, Rm;加载一个无符号字节数据STRBRd,"Rn, Rni;存储一个无符号字节数据LDRSHRd, Rn, Rm;加载一个有

9、符号半字数据LDRSBRd, Rn, Rm;存储一个有符号半字数据其中:Rd表示加载或存储的寄存器。必须为R0R7。Rn表示基址寄存器。必须为R0R7。Rm表示内含数偏移量的寄存器,必须为R0R7。单寄存器访冋指令一寄存器偏移指令编码应用示例:LDRSTRLDRHSTRHLDRBSTRBLDRSHLDRSB单寄存器访问指令寄存器偏移寻址R3Z Rlz R0Rlz RO,R2R6, RO,RlRO, R4 R5R2Z R5, RlRlz R3, R2R7Z R6,R3R5, R7 z R2 注意:进行字数据访问时,必须保证传送地址为32佞对 齐(字对齐丿。进行半字数据访问时,必须保证传送地 址为

10、16佞对齐(半字对齐丿。单寄存器访问指令相对偏移寻址这种寻址方式是以PC或SP寄存器的內彖为基址,以个立即数为偏移量,两者相加作为存储器的地址。指 令格式如下:LDRRd, PC,#immed_8X4LDRRd, labelLDRRd, SP,#immed_8X4STR其中:Rd, SP,#immed_8X4Rd表示加载或存储的寄存器。必须为ROR7。inuned_8X4表示偏移量,取值范围是(0255) X4。label表示程序相对偏移表达式丄abel必须在当前指令Z后的1KB范围内。单寄存器访问指令相对偏移寻址单寄存器访问指令相对偏移指令编码L:用于区别加我CL 为1丿或存储(L为0丿im

11、med8:偏移量Rd:目标或嫄寄存器PC相对偏移LDR指令编码151211108700 1 001Rdimmed 8SP相对偏移LDR/STR指令编码151211108701001LFimmed 8单寄存器访问指令相对偏移寻址应用示例:LDRROZ PC,#0x08滋取PC+OxO8地址上的字数据,;保存到RO中LDRR7,LOCALDAT;读取LOCALDAT地址上的;字数据,保存到R7中LDRR3,SP,#1020;读取SP+1O2O地址上的字数据,;保存到R3中STRR2f SP;存储R2寄存器的数据到SP;指向的存储单元(偏移量为0)注意:以PC作为基地址的相对偏移寻址指令只有LDR,

12、而没有STR指o5-2存储器访问指令 Thumb存储器访问指令PUSH和POP寄存器入栈及出栈指令卖现低寄存器和可选的LR寄存器入栈及低寄存 器和可选的PC壬存器出栈操作。堆栈地址由SP#存 器设置,堆栈是满菱减堆栈。寄存器入栈及岀栈指令指令榕式寄存器入栈及岀栈指令应用示例:PUSH R0-R7,LRPOPR0-R7,PC;将低寄存器ROR7全部入栈,;LR也入栈;将堆栈中的数据弹出到;低寄存器R0R7及PC中指令榕式PUSHreglist , LRPOPreglist _, PC其中:reglist入栈/出栈低寄存器列表,即R0R7。LR入栈时的可选寄存器。PC出栈时的可选寄存器。5-2存储

13、器访问指令 Thumb存储器访问指令 LDM1A和STMIA多寄存器加载/存储指令可以卖现在一组寄存器和一块连续的内存单元 之间传输数据。LDMIA为加我多个寄'存器;STMIA 为存储多个寄存器。使用它们允许一条指令传送8 个低寄存器R0R7的任何子集。注蔻:Thumb多寄存器加我/存储指令中,只使用后增形式C1AJ多寄存器加载/存储指令指令格式LDMIARn!, reglistSTMIARn!, reglist其中:Rn加载/存储的起始地址寄存器。Rn必须为R0R7。reglist加载/存储的寄存器列表。寄存器必须为R0R7。指令编码151211108101 10 0LF?nreg

14、isterlistL用于区别加我(L为1丿 还是存储(L为0丿多寄存器加载/存储指令LDMIA/STMIA的主要用于数据复制、参数传送等。进行数据传送肘, 每次传送后地址加4。若Rn在寺存薜列表中:对于LDMIA指令,Rn的最终值是加我的值,而不是增加后的地址;对于STMIA指令,若Rn是寄存器列表中的最低数字的寄存器,则Rn 存储的值为Rn在初值,其它情况不可预知。应用示例:LDMIA RO! , R2-R7 ;加我R0指向的地址上的多字数据,;保存到R2R7中,R0的值更新。STMIA Rl! , R2-R7 ;将只2R7的数据存储到R1指旬的;地址上,R1值更新Thumb指令小节B录1.

15、 Thumb指令集与ARM指令集的区另U2. 存储器访问指令3. 数据处理指令4. 分支指令5. 杂项扌旨令Thumb指令功能码段分析5.3数据处理指令 Thumb数据处理指令Thumb教据处理指令涵盖了编译器需要的大多 数操作。大部分的Thumb数据戏理指令采用2地址 格式,不能在单指令中同时完成一个操作数的移佞 及一个ALU操作。所以数据处理操作比ARM状态的 更少,并且访问寄存器R8R15受到限制。教据处 理指令分为两类:数据传送指令算术送辑运算指令5.3数据处理指令 Thumb数据处理指令数据传送指令助记符操作影响标志MOV Rd, ttexprRdexpt, Rd为ROR7影响N、Z

16、MOV Rd, RinRd-Rin, Rd、Rm均可为ROR15Rd和Rm均为ROR7时, 影响N、Z,清零C、VMVN Rd, RinRd-(Rm) , Rd、Rm均为ROR7影响N、ZNEG Rd, RmRd-(-Rm) , Rd、Rm均为ROR7影响N、Z、C、V数据传送指令MOVMOV指令将8住立即数或寺存器传送到目捺寄存器中。 其指令格式如下:数据传送指令MOV注憲:"MOV Rd, #expr5'指令会更新N和Z扌示志,对才示志C和V无影响。“MOV Rd/Rm"指令,若Rd或Rm是嘉寄存器(R8R15J ,则栋志不 受影响,若Rd或Rnn都是低寄存器(

17、ROR7J ,则更新栋志N和乙 且请除 标志C和V。应用示例:MOVR1,#0x10MOVRO,R8PCZLRMOV;R1=OxlO;RO=R8;PC=LR,孑程序区回数据传送指令MVNMVN指令将寄存器Rnn按住取反后传送到哥栋寄存器Rd 中。指令的执行会更新N和Z扌示志,对才示志C和V无影响。其指 令格式如下:MVNRd, RmRd , Rin其屮:Rd目标寄存器。MOV Rd, Sexpr时,Rd必须在ROR7Z间。Rni源寄存器。为R0R15。其屮:Rd目标寄存器。MOV Rd, Sexpr时,Rd必须在R0R7Z间。Rni源寄存器。为ROR15。指令编码数据传送指令MVNMVN指令将

18、寄存器Rnn按住取反后传送到哥栋寄存器Rd 中。指令的执行会更新N和Z扌示志,对才示志C和V无影响。其指 令格式如下:MVN Rd, Rin其屮:Rd目标寄存器。MOV Rd, Sexpr时,Rd必须在R0R7Z间。Rni源寄存器。为R0R15。MVNRl, R2;将12取反,结果存于R1应用示例:数据传送指令NEGNEG指令将寄存器Rm乘以后传送到目标寄存器Rd中。 指令会更新N、Z、C和V标志。其指令格式如下:数据传送指令NEGNEG指令将寄存器Rm乘以后传送到目标寄存器Rd中。 指令会更新N、Z、C和V标志。其指令格式如下:NEG Rd, Rin其屮:Rd目标寄存器,必须在R0R7Z间。

19、Rni源寄存器。为R0R15。应用示例:NEGRl, R0;R1 = R05.3数据处理指令 Thumb数据处理指令算术逻辑运算指令算术逆辑指令包括以下几类:算术指令逆辑运算指令移佞指令比较指令算术运算指令ADDADD指令将两个数据相加,结果保存到Rd寄存器中。低寄存器的ADD指令格式:ADD Rd, Rn, RinADD Rd,Rn,Hexpr3ADD Rd, Uexpr8其中:Rd目标寄存器,必须在ROR7之间。Rn第1个操作数寄存器,必须在R0R7之间。Rm第2个操作数寄存器,必须在R0R7之间。ex per 3位立即数,即07。expr8 8位立即数,即0255。应用示例:ADDRl,

20、 Rl, RO; R1 = RO+R1ADDRlz Rl, #7;R1 = R1+7ADDRl, #200; R1 = R1+200算术运算指令ADDADD指令将两个数据相加,结果保存到Rd寄存器中。高或低寄存器的ADD指令榕式:ADD Rd, Rin其中:Rd目标寄存器,也是第一个操作数寄存器。Rni第2个操作数寄存器。ADDRl,R10;R1 = R1+R10算术运算指令ADDADD指令将两个数据相加,结果保存到Rd寄存器中。SP操作的ADD指令格式:ADD SP,Sexpr其中:SP目标寄存器,也是第一个操作数寄存器。expr立即数,在-508+508Z间的4的整数倍的数。ADDSP,#

21、-500;SP=SP-5OO应用示例:算术运算指令SUBSUBRl, Rl, ROSUBR1,R1, #7SUBRl,#200应用示例:SUB指令将两个数据相减结果保存到Rd寄存器中。低寺存器的SUB指令格式:SUBRd, Rn, FSUBRd, Rn, ttexpr3SUBRd, Uexpr8其中:Rd目标寄存器,必须在ROR7之间。Rn第1个操作数寄存器,必须在R0R7之间。Rni第2个操作数寄存器,必须在R0R7之间。expr33位立即数,即07。expr88位立即数,即0255。;R1 = R1R0;R1 = R17;R1 = R1200算术运算指令SUBSUB指令将两个数据相痢,结果

22、保存到Rd寄存器中。SP操作的SUB指令格式:SUB SP, Sexpr其中:SP目标寄存器,也是第一个操作数寄存器。expr立即数,在-508+508Z间的4的整数倍的数。SUBSPZ #380;SP=SP-38O应用示例:算术运算指令ADCADC指令将Rm的值扌目加,再加上CPSR中的C 条件标志住,结果保存到Rd寄存器。ADC指令格式:ADC Rd, Rm其屮:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rni第2个操作数寄存器,必须在R0R7Z间。应用示例(64住加法):;(Rk RO) = (R1. RO)+(R3. R2)ADD RO,R2ADCRl, R3算术运算

23、指令SBCSBC指令用寄存器Rd减去Rm,再烦去CPSR中 的C条件标志伐的非,结果保存到Rd寄存器。SBC指令格式:SBC Rd, Rm其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rm第2个操作数寄存器,必须在R0R7之间。应用示例(64住减法):SUBRO,R2SECR1,R3;(R1、RO) = (RRO)-(R3. R2)注意:C标志的产生 当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0。 当进行减法运算(包括CMP指令),并且最高位产生借位时C=0,否则C=d。算术运算指令MULMUL乘法指令用寄存器Rd乘以Rm,结果保存 到Rd寄存器

24、。MUL指令格式:MUL Rd, Rm其屮:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rni第2个操作数寄存器,必须在R0R7之间。应用示例:MULRO, R1;RO=ROXR1逻辑运算指令ANDAND指令将寄存器Rd的值与寄存器Rm的值按 住作浚辑“与”操作,结果保存到Rd寄存器中。AND指令格式:ADD Rd, Rin其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rni第2个操作数寄存器,必须在R0R7Z间。逻辑运算指令ORRORR指令将寄存器Rd的值与寄存器Rn的值按住作浚辑“或”操作,结果保存到Rd寄存器中。ORR指令格式:ORR Rd, Rin其

25、屮:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rni第2个操作数寄存器,必须在R0R7Z间。应用示例:MOV Rlz #0x0FR0z R1ORR;RO=RO | R1,置住RO低4住逻辑运算指令EOREOR指令将寄存器Rd的值与寄存器Rn的值按伐作逻辑“异或”操作,结果保存到Rd寄存器中。EOR指令格式:EOR Rd, Rin其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rni第2个操作数寄存器,必须在R0R7Z间。逻辑运算指令BICBIC指令将寄'存器Rd的值与寄存器Rm的值的反 码作逻辑“与”操作,结果保存到Rd寄存器中。BIC指令格式:BI

26、C Rd, Rin其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rni第2个操作数寄存器,必须在R0R7Z间。应用示例:MOV Rlz #0x02R0z R1BIC;请零RO的第2#,其它住不变移位指令ASRASR指令将数据算术右移,将符号伐拷贝到左 側空出的伐,移伐结果保存到Rd寄存器中。ASR移住操作:ASR指令格式:ASRRd, RsASRRd, Rm, #expr其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rs寄存器控制移位屮包含移位位数的寄存器,必须在R0R7Z间Rni立即数移位的源寄存器,必须在R0R7之间expr立即数移位位数,值为132

27、移位指令ASRASR指令将数据算术右移,将符号伐拷贝到左 側空出的伐,移伐结果保存到Rd寄存器中。ASR指令格式:ASRRd, RsASRRd, Rm, #expr其中:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rs寄存器控制移位屮包含移位位数的寄存器,必须在R0R7Z间Rni立即数移位的源寄存器,必须在R0R7之间expr立即数移位位数,值为132应用示例:ASRRlz R2ASRR3Z R1,#2移位指令LSLLSL指令将数据送辑左移,空伐请零,移伐结果 保存到Rd寄存器中。LSL指令格式:移位指令LSLLSL指令将数据送辑左移,空伐请零,移伐结果 保存到Rd寄存器中。L

28、SL指令格式:LSL Rd, RsLSL Rd, Rin, ttexpr其屮:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rs寄存器控制移位屮包含移位位数的寄存器,必须在R0R7Z间Rni 立即数移位的源寄存器,必须在R0R7Z间expr立即数移位位数,值为131应用示例:LSLR6/R7LSLRlz R6,#2移位指令LSRLSR指令将数据送辑右移,空佞请零,移佞结 果保存到Rd寄存器中。LSR指令格式:LSR Rd, RsLSR Rd, Rin, ttexpr其屮:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rs寄存器控制移位屮包含移位位数的寄存器,必须在R

29、0R7Z间Rni立即数移位的源寄存器,必须在R0R7Z间expr立即数移位位数,值为132LSR移住操作:移位指令LSRLSR指令将数据送辑右移,空佞请零,移佞结 果保存到Rd寄存器中。LSR指令格式:LSR Rd, RsLSR Rd, Rin, ttexpr其屮:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rs寄存器控制移位屮包含移位位数的寄存器,必须在R0R7Z间Rni立即数移位的源寄存器,必须在R0R7Z间expr立即数移位位数,值为132应用示例:LSRR3/R0LSRR5Z R2Z #2移位指令RORROR指令将数据循环右移,寄存器右側移出的 住放入左側空出的住上,移

30、住结果保存到Rd击存器 中。ROR指令格式:ROR Rd, Rs其屮:Rd目标寄存器,也是第一个操作数寄存器,必须在R0R7Z间。Rs寄存器控制移位中包含移位位数的寄存器,必须在R0R7Z间ROR移住操作:应用示例:RORR3Z R0比较指令CMPCMP指令使用寄存器Rn的值减J去第二个操作数 的值,根据操作的结果更新CPSR中的N、Z、C和V 标志住OCMP指令格式:CMP Rn , RinCMP Rn,ftepr应用示例:CMPR1,#10CMPRlz R2其屮:Rn第一个操作数寄存器,必须在RORTZlHjo Rni第二个操作数寄存器,必须在R0R7Z间。 expr立即数,值为0255;

31、R1与10比较,设置相关捺志住;R1与R2比较,设置相关标志住比较指令CMNCMN指令使用寄存器Rn的值加上寄存器Rm的 值'根据操作的结果更新CPSR中的N、Z、C和V标 志彳丘OCMN指令格式:CMN Rn , Rin其屮:Rn第一个操作数寄存器,必须在R0R7Z间。Rni第二个操作数寄存器,必须在R0R7Z间。应用示例:CMNRO, R2;R0与-R2比较,设置相关标志住比较指令TSTTST指令将寄存器Rn的值与寄存器Rm的值按住 作浚辑“与”操作'根据操作的结果更新CPSR中的 N、Z、C和V标志住。TST指令格式:TST Rn , Rin其屮:Rn第一个操作数寄存器,

32、必须在R0R7Z|hJoRni第二个操作数寄存器,必须在R0R7Z间。应用示例:MOV R0,#0x01TSTRl, RO;判断R1的最低住是否为01. Thumb指令集与ARM指令集的区另U2. 存储器访冋指令3. 数据处理指令4. 分支指令5. 杂项扌旨令Thumb指令功能码段分析5.4分支指令 Thumb分支指令助记符说明操作条件码位置B label分支指令PC*-labelBcondBL label带链接的分支指令LR-PC-4, PC-label无BX Rm带状态切换的分支指令PC-label,切换处理器 状态无分支指令BB指令跳转到指定的地址执行程序,它是Thumb指 令集中的淮一

33、有条件执行指令。如果使用了条件执行, 那么跳转范囲在-252+256字节内。如果没有使用条 件埶行,那么跳转范囲在±2K内。B指令格式:Bcond label其屮:label表示程序标号。应用示例:BWATTE;X/AITB才示号在多前指令的土2K苑囲内BEQL00P1;LOOPH示号衣多前指令的252+256范囲内指令条件码表操作码条件助记符标志含义0000EQZ=1相等0001NEz=o不相等0010CS/HSC=1无符号数大于或等于0011CC/LOc=o无符号数小于0100MlN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=

34、1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于1011LTN!=V有符号数小于1100GTZ=0,N=V有符号数大于1101LEZ=1,N!=V有符号数小于或等于1110AL任何无条件执行(指令默认条件)1111NV任何从不执行(不要使用)分支指令BLBL指令在跳转到指玄地址埶行程序前,将下一条指 令的地址拷贝到R14链接寄存器中。BL指令格式:BL label其中:label表示程序标号。注意:由于BL指令通常需要丸的地址苑,很难用16住指令格式卖现,为此,Thumb采用两条这样的指令组合成22住半字偏移(符 号犷畏为32住),使指令转

35、移范囲为±4MBo指令编码:151413 12111001111Himmed_ 11汇编编挙甕根据label生成2条机器指令;H用来确定immed_11为跳转地址的高11伐. 还是低11伐;(22侄地址为半字偏移最低住补1个0丿使霜令转移恋囲为±4MB。分支指令BXBX指令是带状态切换的分支指令,跳转地址由Rm 指定,同时根据Rm的最低佞的值切换处理器状态,当 最低两住均为0时,切换到ARM状态。BX指令格式:BX Rm其中:Rni 保存有目标地址的寄存器。应用示例:ADRRO z ArmFun;将ARM程序段地址存入ROBXRO;跳至RO指定的地址,并切换到ARM状态Th

36、umb指令小节B录1. Thumb指令集与ARM指令集的区另U2. 存储器访冋指令3. 数据处理指令4. 分支指令5. 杂项指令Thumb指令功能码段分析 Thumb杂项指令SWIswi指令用于产生软中断,从而卖现从用户模式吏 换到管理模式,CPSR保存到管理楼式的SPSR中,同时 程序跳转到SWI向量。在糸统模式下也可以使用SWI指 令,处理器同样能切换到管理模式。(参数传逼的方法 参看ARM指令SWI的使用丿SWI指令格式:SWI inuned_8其中:iimned 88位立即数,值为0255Z间的整数。;软中断,中断立即数为0;软中断,中断立即数为0x55应用示例:SWI1SWI0x55

37、Thumb指令小节目录1. Thumb指令集与ARM指令集的区别2存储器访问指令3. 数据处理指令4. 分支指令5. 杂项指令6Thiinib指令功能码段分析5.6 Thumb指令功能码段分析Thumb与ARM卖现功能比较 与 2n (1,2,4,8,.)相乘 Thumb : LSL Ra, Rb, LSL #n ARM : MOV Ra, Rb, LSL #n 与 2n +1(3,5,9,17,.)相乘 Thumb : LSL Rt, Rb, #nADD Ra, Rt, Rb ARM : ADDRa,Rb,Rb,LSL#n卖现除法的功能段 7条ARM指令占用的存储空间丸小为:7X4 = 28

38、字节MOVMOVMOVk R0,#0x0F; (4 字节)Rl,#0x06; (4 字节)R2,#0x0;(4字节)LSUBSRO,RO,R1;(4字节)ADDGER2R2,#1;(4字节)BGELoop;(4字节)ADDR3,RO,R1;(4字节)用Thumb代码来实现相同的功能 8条Thumb指令占用的存储空问大小为:8x2 = 16字节MOVMOVMOVLoop:ADDSUBBGESUBADDR0,#0x0FRl,#0x06R2,#0x0R2,#lRO,R1LoopR2,#l;(2字节);(2字节);(2字节);(2字节);(2字节);(2字节);(2字节);(2字节)R3RO,R1Thumb与ARM性能比较 Thumb代码所需的存储空间约为ARM代码的60%70% Thumb代码使用的指令数比ARM代码多约30%40%若使用32住的存储器,ARM代码比Thumb代码快约40%若使用16住的存储器,Thumb代码此ARM代码快约40%50%与ARM代码相此较,使用Thumb代码,存储器的功耗会吟低约 30%

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1