ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:46.49KB ,
资源ID:6369250      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6369250.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Thumb指令集.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Thumb指令集.docx

1、Thumb指令集Thumb指令集Thumb指令集概述为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。Thumb指令集是ARM指令集的一个子集,是针对代码密度问题而提出的,它具有16位的代码宽度。与等价的32位代码相比较,Thumb指令集在保留32位代码优势的同时,大大的节省了系统的存储空间。Thumb不是一个完整的体系结构,不能指望处理器只执行Thumb指令集而不支持ARM指令集。 当处理器在执行ARM程序段时,称ARM处理器处于ARM工作状态,当处理器在执行Thumb程序段时,称ARM处理器处于Thumb工作

2、状态。Thumb指令集并没有改变ARM体系底层的编程模型,只是在该模型上增加了一些限制条件,只要遵循一定的调用规则,Thumb子程序和ARM子程序就可以互相调用。与ARM指令集相比较,Thumb指令集中的数据处理指令的操作数仍然是32位,指令地址也为32位,但Thumb指令集为实现16位的指令长度,舍弃了ARM指令集的一些特性,如大多数的Thumb指令是无条件执行的,而几乎所有的ARM指令都是有条件执行的,大多数的Thumb数据处理指令采用2地址格式。由于Thumb指令的长度为16位,即只用ARM指令一半的位数来实现同样的功能,所以,要实现特定的程序功能,所需的Thumb指令的条数较ARM指令

3、多。在一般的情况下,Thumb指令与ARM指令的时间效率和空间效率关系为: Thumb代码所需的存储空间约为ARM代码的6070。 Thumb代码使用的指令数比ARM代码多约3040。 若使用32位的存储器,ARM代码比Thumb代码快约40。 若使用16位的存储器,Thumb代码比ARM代码快约4050。 与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30。显然,ARM指令集和Thumb指令集各有其优点,若对系统的性能有较高要求,应使用32位的存储系统和ARM指令集,若对系统的成本及功耗有较高要求,则应使用16位的存储系统和Thumb指令集。当然,若两者结合使用,充分发挥其各自

4、的优点,会取得更好的效果。Thumb指令集与ARM指令集在以下几个方面有区别: 跳转指令。条件跳转在范围上有更多的限制,转向子程序只具有无条件转移。 数据处理指令。对通用寄存器进行操作,操作结果需放入其中一个操作数寄存器,而不是第三个寄存器。 单寄存器加载和存储指令。Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0R7。 批量寄存器加载和存储指令。LDM和STM指令可以将任何范围为R0R7的寄存器子集加载或存储,PUSH和POP指令使用堆栈指针R13作为基址实现满递减堆栈,除R0R7外,PUSH指令还可以存储链接寄存器R14,并且POP指令可以加载程序指令PC。 Thumb指令集没有

5、包含进行异常处理时需要的一些指令,因此,在异常中断时还是需要使用ARM指令。这种限制决定了Thumb指令不能单独使用需要与ARM指令配合使用。Thumb 寄存器和ARM寄存器之间的关系 Thumb寄存器在ARM寄存器上的映射如图所示。图 Thumb寄存器在ARM寄存器上的映射1. Thumb 状态寄存器集是ARM 状态寄存器集的子集程序员可直接访问8 个通用寄存器R0R7、PC、堆栈指针SP、链接寄存器LR和CPSR。每个特权模式都有分组的SP、LR和SPSR。2. Thumb状态寄存器与ARM 状态寄存器的关系Thumb状态寄存器与ARM状态寄存器有如下关系: Thumb状态R0R7与ARM

6、状态R0R7相同。 Thumb状态CPSR和SPSR与ARM状态CPSR和SPSR 相同。 Thumb状态SP映射到ARM状态R13。 Thumb状态LR映射到ARM状态R14。 Thumb状态PC映射到ARM状态PC(R15)。3. 在Thumb状态中访问高寄存器在Thumb状态中高寄存器(寄存器R0R7为低寄存器,寄存器R8R15为高寄存器)不是标准寄存器集的一部分,汇编语言程序员对它们的访问受到限制,但可以将它们用于快速暂存。可以使用MOV指令的特殊变量将一个值从低寄存器R0R7转移到高寄存器R8R15,或者从高寄存器到低寄存器。CMP指令可用于比较高寄存器和低寄存器的值。ADD 指令可

7、用于将高寄存器的值与低寄存器的值相加。3.4.3 Thumb指令分类介绍Thumb指令集分为:分支指令、数据传送指令、单寄存器加载和存储指令以及多寄存器加载和存储指令。Thumb指令集没有协处理器指令、信号量(semaphore)指令以及访问CPSR或SPSR的指令。1. 存储器访问指令(1)LDR和STR立即数偏移加载寄存器和存储寄存器。存储器的地址以一个寄存器的立即数偏移(immediate offset)指明。指令格式:op Rd, Rn,#immed_54opH Rd, Rn,#immed_52opB Rd, Rn,#immed_51其中: op:为LDR或STR。 H:指明无符号半字

8、传送的参数。 B:指明无符号字节传送的参数。 Rd:加载和存储寄存器。Rd 必须在R0R7范围内。 Rn:基址寄存器。Rn 必须在R0R7范围内。 immed_5N:偏移量。它是一个表达式,其取值(在汇编时)是N的倍数,在(031)*N范围内,N4、2、1。 STR:用于存储一个字、半字或字节到存储器中。 LDR:用于从存储器加载一个字、半字或字节。 Rn:Rn中的基址加上偏移形成操作数的地址。立即数偏移的半字和字节加载是无符号的。数据加载到Rd的最低有效字或字节,Rd 的其余位补0。字传送的地址必须可被4整除,半字传送的地址必须可被2整除。指令示例:LDR R3,R5,#0STRB R0,R

9、3,#31STRH R7,R3,#16LDRB R2,R4,#1abel-PC(2)LDR和STR寄存器偏移加载寄存器和存储寄存器。用一个寄存器的基于寄存器偏移指明存储器地址。指令格式:op Rd,Rn,Rm其中,op 是下列情况之一: LDR:加载寄存器,4字节字。 STR:存储寄存器,4字节字。 LDRH:加载寄存器,2字节无符号半字。 LDRSH:加载寄存器,2字节带符号半字。 STRH:存储寄存器,2字节半字。 LDRB:加载寄存器,无符号字节。 LDRSB:加载寄存器,带符号字节。 STRB:存储寄存器,字节。 Rm:内含偏移量的寄存器,Rm必须在R0R7范围内。带符号和无符号存储指

10、令没有区别。STR指令将Rd中的一个字、半字或字节存储到存储器。LDR指令从存储器中将一个字、半字或字节加载到Rd。Rn中的基址加上偏移量形成存储器的地址。寄存器偏移的半字和字节加载可以是带符号或无符号的。数据加载到Rd的最低有效字或字节。对于无符号加载,Rd的其余位补0;或对于带符号加载,Rd的其余位复制符号位。字传送地址必须可被4整除,半字传送地址必须可被2整除。指令示例:LDR R2,Rl,R5LDRSH R0,R0,R6STRB Rl,R7,R0(3)LDR和STRPC或SP相对偏移加载寄存器和存储寄存器。用PC或SP中值的立即数偏移指明存储器中的地址。没有PC相对偏移的STR指令。指

11、令格式:LDR Rd,PC,#immed_84LDR Rd,labelLDR Rd,SP,#immed_84STR Rd, SP,#immed_84其中: immed_84:偏移量。它是一个表达式,取值(在汇编时)为4的整数倍,范围在01020之间。 label:程序相对偏移表达式。label必须在当前指令之后且1KB范围内。 STR:将一个字存储到存储器。 LDR:从存储器中加载一个字。PC或SP的基址加上偏移量形成存储器地址。PC的位1被忽略,这确保了地址是字对准的。字或半字传送的地址必须是4的整数倍。指令示例:LDR R2,PC,#1016LDR R5,localdataLDR R0,S

12、P,#920STR Rl,SP,#20(4)PUSH和POP低寄存器和可选的LR进栈以及低寄存器和可选的PC出栈。指令格式:PUSH reglistPOP reglistPUSH reglist,LRPOP reglist,PC其中: reglist:低寄存器的全部或其子集。括号是指令格式的一部分,它们不代表指令列表可选。列表中至少有1个寄存器。Thumb堆栈是满递减堆栈,堆栈向下增长,且SP指向堆栈的最后入口。寄存器以数字顺序存储在堆栈中。最低数字的寄存器存储在最低地址处。POP reglist,PC这条指令引起处理器转移到从堆栈弹出给PC的地址,这通常是从子程序返回,其中LR在子程序开头压

13、进堆栈。这些指令不影响条件码标志。指令示例:PUSH R0,R3,R5PUSH R1,R4-R7PUSH R0,LRPOP R2,R5POP R0-R7,PC(5)LDMIA和STMIA加载和存储多个寄存器。指令格式:op Rn!,reglist其中,op为LDMIA或STMIA。reglist为低寄存器或低寄存器范围的、用逗号隔开的列表。括号是指令格式的一部分,它们不代表指令列表可选,列表中至少应有1个寄存器。寄存器以数字顺序加载或存储,最低数字的寄存器在Rn的初始地址中。Rn的值以reglist中寄存器个数的4 倍增加。若Rn在寄存器列表中,则: 对于LDMIA指令,Rn的最终值是加载的值

14、,不是增加后的地址。 对于STMIA指令,Rn存储的值有两种情况:若Rn是寄存器列表中最低数字的寄存器,则Rn存储的值为Rn的初值;其他情况则不可预知,当然,reglist中最好不包括Rn。指令示例:LDMIA R3!,R0,R4LDMIA R5!,R0R7STMIA R0!,R6,R7STMIA R3!,R3,R5,R72. 数据处理指令(1)ADD和SUB低寄存器加法和减法。对于低寄存器操作,这2条指令各有如下3种形式: 两个寄存器的内容相加或相减,结果放到第3个寄存器中。 寄存器中的值加上或减去一个小整数,结果放到另一个不同的寄存器中。 寄存器中的值加上或减去一个大整数,结果放回同一个寄

15、存器中。指令格式:op Rd,Rn,Rmop Rd,Rn,#expr3op Rd,#expr8其中: op为ADD或SUB。 Rd:目的寄存器。它也用做“op Rd,#expr8”的第1个操作数。 Rn:第一操作数寄存器。 Rm:第二操作数寄存器。 expr3:表达式,为取值在-7+7范围内的整数(3位立即数)。 expr8:表达式,为取值在-255+255范围内的整数(8位立即数)。“op Rd,Rn,Rm”执行Rn+Rm或Rn-Rm操作,结果放在Rd中。“op Rd,Rn,#expr3”执行Rn+expr3或Rn-expr3操作,结果放在Rd中。“op Rd,#expr8”执行Rd+exp

16、r8或Rdexpr8操作,结果放在Rd中。expr3或expr8为负值的ADD指令汇编成相对应的带正数常量的SUB指令。expr3或expr8为负值的SUB指令汇编成相对应的带正数常量的ADD指令。Rd、Rn和Rm必须是低寄存器(R0R7)。这些指令更新标志N、Z、C和V。指令示例:ADD R3,Rl,R5SUB R0,R4,#5ADD R7,#201(2)ADD高或低寄存器将寄存器中值相加,结果送回到第一操作数寄存器。指令格式:ADD Rd,Rm其中: Rd:目的寄存器,也是第一操作数寄存器。 Rm:第二操作数寄存器。这条指令将Rd和Rm中的值相加,结果放在Rd中。当Rd和Rm都是低寄存器时

17、,指令“ADD Rd,Rm”汇编成指令“ADD Rd,Rd,Rm”。若Rd和Rm是低寄存器,则更新条件码标志N、Z、C 和V;其他情况下这些标志不受影响。指令示例:ADD R12,R4(3)ADD和SUBSPSP加上或减去立即数常量。指令格式:ADD SP,#exprSUB SP,#expr其中:expr为表达式,取值(在汇编时)为在-508+508范围内的4的整倍数。该指令把expr的值加到SP 的值上或用SP的值减去expr的值,结果放到SP中。expr为负值的ADD指令汇编成相对应的带正数常量的SUB指令。expr为负值的SUB指令汇编成相对应的带正数常量的ADD指令。这条指令不影响条件

18、码标志。指令示例:ADD SP,#32SUB SP,#96(4)ADDPC或SP相对偏移SP或PC值加一立即数常量,结果放入低寄存器。指令格式:ADD Rd,Rp,#expr其中: Rd:目的寄存器。Rd必须在R0R7范围内。 Rp:SP 或PC。 expr:表达式,取值(汇编时)为在01020范围内的4的整倍数。这条指令把expr加到Rp的值中,结果放入Rd。若Rp是PC,则使用值是(当前指令地址+4)AND &FFFFFFC,即忽略地址的低2位。这条指令不影响条件码标志。指令示例:ADD R6,SP,#64ADD R2,PC,#980(5)ADC、SBC和MUL带进位的加法、带进位的减法和

19、乘法。指令格式:op Rd,Rm其中: op为ADC、SBC或MUL。 Rd:目的寄存器,也是第一操作数寄存器。 Rm:第二操作数寄存器,Rd、Rm必须是低寄存器。ADC 将带进位标志的Rd和Rm的值相加,结果放在Rd中,用这条指令可组合成多字加法。SBC考虑进位标志,从Rd值中减去Rm的值,结果放入Rd中,用这条指令可组合成多字减法。MUL进行Rd和Rm值的乘法,结果放入Rd 中。Rd和Rm必须是低寄存器(R0R7)。ADC和SBC更新标志N、Z、C和V。MUL更新标志N和Z。在ARMv4及以前版本中,MUL会使标志C和V不可靠。在ARMv5及以后版本中,MUL不影响标志C和V。指令示例:A

20、DC R2,R4 SBC R0,R1MUL R7,R6(6)按位逻辑操作AND、ORR、EOR和BIC指令格式:op Rd,Rm其中: op为AND、ORR、EOR或BIC。 Rd:目的寄存器,它也包含第一操作数,Rd必须在R0R7范围内。 Rm:第二操作数寄存器,Rm 必须在R0R7范围内。这些指令用于对Rd和Rm中的值进行按位逻辑操作,结果放在Rd 中,操作如下: AND:进行逻辑“与”操作。 ORR:进行逻辑“或”操作。 EOR:进行逻辑“异或”操作。 BIC:进行“Rd AND NOT Rm”操作。这些指令根据结果更新标志N和Z。程序示例:AND R1,R2ORRR0,R1EORR5,

21、R6BICR7,R6(7)移位和循环移位操作ASR、LSL、LSR和RORThumb指令集中,移位和循环移位操作作为独立的指令使用,这些指令可使用寄存器中的值或立即数移位量。指令格式:op Rd,Rsop Rd,Rm,#expr其中: op是下列其中之一: ASR:算术右移,将寄存器中的内容看做补码形式的带符号整数。将符号位复制到空出位。 LSL:逻辑左移,空出位填零。 LSR:逻辑右移,空出位填零。 ROR:循环右移,将寄存器右端移出的位循环移回到左端。ROR仅能与寄存器控制的移位一起使用。 Rd:目的寄存器,它也是寄存器控制移位的源寄存器。Rd必须在R0R7范围内。 Rs:包含移位量的寄存

22、器,Rs必须在R0R7范围内。 Rm:立即数移位的源寄存器,Rm必须在R0R7范围内。 expr:立即数移位量,它是一个取值(在汇编时)为整数的表达式。整数的范围为:若op是LSL,则为031;其他情况则为132。对于除ROR以外的所有指令: 若移位量为32,则Rd清零,最后移出的位保留在标志C中。 若移位量大于32,则Rd和标志C均被清零。这些指令根据结果更新标志N和Z,且不影响标志V。对于标志C,若移位量是零,则不受影响。其他情况下,它包含源寄存器的最后移出位。指令示例:ASR R3,R5LSR R0,R2,#16;将R2的内容逻辑右移16次后,结果放入R0中LSR R5,R5,av(8)

23、比较指令CMP 和CMN指令格式:CMP Rn,#exprCMP Rn,RmCMN Rn,Rm其中: Rn:第一操作数寄存器。 expr:表达式,其值(在汇编时)为在0255 范围内的整数。 Rm:第二操作数寄存器。CMP指令从Rn的值中减去expr或Rm的值,CMN指令将Rm和Rn的值相加,这些指令根据结果更新标志N、Z、C和V,但不往寄存器中存放结果。对于“CMP Rn,#expr”和CMN指令,Rn和Rm必须在R0R7范围内。对于“CMP Rn,Rm”指令,Rn和Rm可以是R0R15中的任何寄存器。指令示例:CMP R2,#255CMP R7,R12CMN Rl,R5(9)传送、传送非和

24、取负(MOV、MVN和NEG)指令格式:MOV Rd,#exprMOV Rd,RmMVN Rd,RmNEG Rd,Rm其中: Rd:目的寄存器。 expr:表达式,其取值为在0255范围内的整数。 Rm:源寄存器。MOV指令将#expr或Rm的值放入Rd。MVN指令从Rm中取值,然后对该值进行按位逻辑“非”操作,结果放入Rd。NEG指令取Rm的值再乘以-1,结果放入Rd。对于“MOV Rd,#expr”、MVN和NEG指令,Rd和Rm必须在R0R7范围内。对于“MOV Rd,Rm”指令,Rd和Rm可以是寄存器R0R15中的任意一个。“MOV Rd,#expr”和MVN 指令更新标志N和Z,对标

25、志C或V无影响。NEG指令更新标志N、Z、C 和V。“MOV Rd,Rm”指令中,若Rd或Rm是高寄存器(R8R18),则标志不受影响;若Rd 和Rm 都是低寄存器(R0R7),则更新标志N和Z,且清除标志C和V。指令示例:MOV R3,#0MOV R0,R12MVN R7,R1NEG R2,R2(10)测试位TST指令格式:TST Rn,Rm其中: Rn:第一操作数寄存器。 Rm:第二操作数寄存器。TST对Rm和Rn中的值进行按位“与”操作。但不把结果放入寄存器。该指令根据结果更新标志N和Z,标志C和V不受影响。Rn和Rm必须在R0R7范围内。指令示例:TST R2,R43. 分支指令(1)

26、分支B指令这是Thumb指令集中唯一的有条件指令。指令格式:Bcond label其中,label是程序相对偏移表达式,通常是在同一代码块内的标号。若使用cond,则label必须在当前指令的256+256字节范围内。若指令是无条件的,则label必须在2KB范围内。若cond满足或不使用cond,则B指令引起处理器转移到label。label必须在指定限制内。ARM链接器不能增加代码来产生更长的转移。指令示例:B dloopBEG sectB(2)带链接的长分支BL指令指令格式:BL label其中,1abel为程序相对转移表达式。BL指令将下一条指令的地址复制到R14(链接寄存器),并引起

27、处理器转移到1abel。BL指令不能转移到当前指令4MB以外的地址。必要时,ARM链接器插入代码以允许更长的转移。指令示例:BL extract(3)分支,并可选地切换指令集BX指令格式:BX Rm其中,Rm装有分支目的地址的ARM寄存器。Rm的位0不用于地址部分。若Rm 的位0清零,则位1也必须清零,指令清除CPSR中的标志T,目的地址的代码被解释为ARM代码,BX指令引起处理器转移到Rm存储的地址。若Rm的位0置位,则指令集切换到Thumb状态。指令示例:BX R5(4)带链接分支,并可选地交换指令集BLX指令格式:BLX RmBLX label其中,Rm 装有分支目的地址的ARM寄存器。

28、Rm的位0不用于地址部分。若Rm 的位0清零,则位1必须也清零,指令清除CPSR中的标志T,目的地址的代码被解释为ARM代码。Label为程序相对偏移表达式,“BLX label”始终引起处理器切换到ARM状态。BLX指令可用于: 复制下一条指令的地址到R14。 引起处理器转移到label或Rm存储的地址。 如果Rm的位0清零,或使用“BLX label”形式,则指令集切换到ARM状态。指令不能转移到当前指令4Mb范围以外的地址。必要时,ARM链接器插入代码以允许更长的转移。指令示例:BLX R6BLX armsub4. 中断和断点指令(1)软件中断SWI指令指令格式:SWI immed_8其

29、中,immed_8为数字表达式,其取值为0255范围内的整数。SWI指令引起SWI异常。这意味着处理器状态切换到ARM态;处理器模式切换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量地址。处理器忽略immed_8,但immed_8出现在指令操作码的位7:0中,而异常处理程序用它来确定正在请求何种服务,这条指令不影响条件码标志。指令示例:SWI 12(2)断点BKPT指令指令格式:BKPT immed_8其中,immed_8为数字表达式,取值为0255范围内的整数。BKPT指令引起处理器进入调试模式。调试工具利用这一点来调查到达特定地址的指令时的系统状态。尽管immed_8出现在指令操作码的位7:0中,处理器忽略immed_8。调试器用它来保存有关断点的附加信息。指令示例:BKPT 67

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1