
第3章Thumb2指令系统.ppt
47页Thumb‐2指令系统(Thumb‐2指令体系架构)精选ppt主要内容主要内容1.概述概述2.Thumb-2指令指令集集分类分类3.统一统一的的汇编语言汇编语言4.Cortex-M3常用常用的的Thumb-2指令集指令集5.小结小结精选ppt1. 概述•对于确定的微处理器而言,编写紧凑的代对于确定的微处理器而言,编写紧凑的代码以降低消耗显得至关重要码以降低消耗显得至关重要•通常,存储器的大小是固定的,而产品的功能特性却各异,选择恰当的处理器恰当的处理器并精精心调整代码心调整代码是明智的精选ppt1. 概述(续)对于ARM体系架构的来说:①微处理器有两种工作状态:ØARM工作状态工作状态ØThumb工作状态工作状态②Thumb指令集是添加到ARM的标准RISC指令集之上的独立指令集;③Thumb指令集包括了基本的加法、减法、循环移位以及跳转等大约36条16位指令;④Thumb指令集作为ARM指令集的压缩方案,简洁、有效,应用广泛并得到很好的支持,通过Thumb指令替换ARM指令,可以将某些代码的规模减小大约20%到30%精选ppt1. 概述(续)对于ARM体系架构的来说(续):⑤ 但是,有限的Thumb指令仅对基本的算术和逻辑操作有用:ØThumb状态状态下,处理器将仅可使用有限数量下,处理器将仅可使用有限数量的寄存器,的寄存器,R8-R12的使用受到限制,的使用受到限制,Ø无法完成诸如处理中断、长跳转、原子存储无法完成诸如处理中断、长跳转、原子存储器器(atomic memory)操作,或协处理器操作等操作,或协处理器操作等等复杂任务,等复杂任务,Ø也无法像也无法像ARM模式那样进行条件执行和移位模式那样进行条件执行和移位或循环移位等操作或循环移位等操作。
⑥ Thumb代码和标准ARM代码不能混杂使用,必须显式地显式地在两种工作状态间进行切换,这迫使程序员必须将所有的16位代码与32位代码分开并隔离到独立的模块中精选ppt1. 概述(续)对于ARM体系架构的来说(续):⑦其次,两种工作状态之间来回切换需要消耗时间,导致代码运行速度降低大约15%,不仅要增加代码,而且还需要几十个前导(preamble)以及后同步指令 (postamble)来组织指针并清空CPU的流水线⑧ 虽然Thumb指令能够实现较高密度的代码,缓存使用效率更高,但实现ARM指令代码的功能往往需要较多的Thumb指令代码,相比较而言,ARM指令使用起来更灵活精选ppt1. 概述(续)•Thumb-2并不是Thumb的升级•它是另起炉灶,继承并集成了传统的Thumb指令集和ARM指令集的各自优点,可以完全代替Thumb和原先的ARM指令集,•是Thumb指令集和ARM指令集的一个超集•Thumb-2指令集体系架构,无需处理器进行工作状态的显示切换,就可运行16位与32位混合代码•与ARM体系架构相比,速度提高大约15%到20%精选ppt1. 概述(续)•Cortex-M3处理器使用的指令集是Thumb-2指令集的子集,它它的的(指令)(指令)工作状态只工作状态只有有一个,那就是一个,那就是Thumb-2状态状态。
•Cortex-M3处理器的两种工作状态:①①Thumb-2状态状态②②调试状态调试状态精选ppt2. Thumb-2指令指令集集分类分类•按照指令的长度分类,Thumb-2指令集可分为两种:((1))16-bit指令集;指令集;((2))32-bit指令集精选ppt2. Thumb-2指令指令集集分类分类(续)(续)•按功能和寻址方式分类按功能和寻址方式分类((1))数据传送指令数据传送指令((2))Load/Store指令指令((3)批量)批量Load/Store指令指令((4))算术四则运算指令算术四则运算指令((5))逻辑操作指令逻辑操作指令((6))移位和循环指令移位和循环指令((7))符号扩展指令符号扩展指令((8))字节调序指令字节调序指令REV, REVH,REV16,REVSH((9))位域处理指令位域处理指令((10))子程序调用与无条件转移指令子程序调用与无条件转移指令((11))隔离隔离(barrier)指令指令((12))饱和运算指令饱和运算指令((13)) If‐Then指令指令((15))比较跳转指令等比较跳转指令等精选ppt2. Thumb-2指令指令集集分类分类(续)(续)•基于Thumb-2指令体系架构编写的代码在执行过程中,处理器不存在ARM工作状态和Thumb工作状态之间的切换。
•那么,处理器必须能够自动识别当前指令长度,是16-bit还是32-bit,以正确地执行Thumb-2指令代码,它是如何识别呢?精选ppt2. Thumb-2指令指令集集分类分类(续)(续)•指令长度的确定指令长度的确定 PC寄存器指向的半字中,Bits<15:11>决定该半字是16-bit指令,还是属于32-bit指令的一部分图3-1说明了Bits<15:11>确定指令长度的功能精选ppt2. Thumb-2指令指令集集分类分类(续)(续)•不同指令长度的Bits<15:11>编码格式•PC寄存器所指向半字的Bits<15:11>的编码格式决定了CPU所处理指令的长度•Thumb‐2指令集空间被划分为16‐bit 和32‐bit 两个子集其中,x原则上可以为“0”、“1”任意值,但x 的取值不能使得0b111xx=0b11100,以及0bxxxxx=0b111xx或者0bxxxxx=0b11100Halfword1 Bits<15:11>功能功能0b1110016-bit 无条件分支Thumb-2指令, 在所有Thumb-2体系结构中定义0b111xx (xx≠00)32-bit Thumb-2 指令, 在Thumb-2中定义0bxxxxx (xxxxx≠111xx)16-bit Thumb -2指令精选ppt3. 统一的汇编语言•ARM指令集体系架构下,指令集体系架构下,ARM指令与Thumb指令分属不同的程序模块,由不同的汇编器对其分别进行汇编。
•Thumb-2指令集体系架构下,指令集体系架构下, 16bit指令与32bit指令可以在同一程序模块出现,并由同一汇编器对其进行汇编精选pptToolchain flow with ARM7r13 (sp)r14 (lr)spsrr13 (sp)r14 (lr)spsrr13 (sp)r14 (lr)spsrr13 (sp)r14 (lr)spsrr8r9r10r11r12r13 (sp)r14 (lr)spsrr8r9r10r11r12r13 (sp)r14 (lr)r15 (pc)cpsrr0r1r2r3r4r5r6r7User/SystemRegister FileAssemblerARM C/C++ CompilerThumb C/C++CompilerC/C++ FilesASMARM7TDMIC/C++ FilesASMState Change eg. ISR entry/exitUserOptimizedCode which operates on the visible Register fileNB: Most compilers automatically provide the Assembler code stubs shown here, allowing majority of code in High Level ‘C’ languageARM Cortex-M3 Toolchain FlowUser/SystemRegister FileUnified AssemblerThumb(2)C/C++ CompilerC/C++ FilesASM(UAL)UnifiedAssemblerLanguageCode which operates on the visible Register fileUser/SystemRegister FileARM Cortex-M3No State Change:Automated by NVICr13 (psp)r14 (lr)spsrr8r9r10r11r12r13(msp)r14 (lr)r15 (pc)cpsrr0r1r2r3r4r5r6r7(Hand Optimized Code / Previously Written 32-Bit ARM Assembler Files)The combination of a conditional instruction sequence IT (If/Then) with the same visible register file set as ARM7 enabled the creation of a ‘Unified Assembler’ which allows Thumb-2 to mimic 32-bit ARM instructions4. Cortex‐M3常用的Thumb‐2指令集(1)数据传送指令 Cortex‐M3 中的数据传送类型包括:①两个寄存器间传送数据两个寄存器间传送数据②寄存器与特殊功能寄存器间传送数据寄存器与特殊功能寄存器间传送数据③把一个立即数加载到寄存器把一个立即数加载到寄存器指令指令功能描述功能描述MOV
指令语法如下:ØMRS
STRB Rd, [Rn, #offset] 把Rd 中的低字节存储到地址Rn+offset 处STRH Rd, [Rn, #offset] 把Rd 中的低半字存储到地址Rn+offset 处STR Rd, [Rn, #offset] 把Rd 中的低字存储到地址Rn+offset 处LDRD Rd1, Rd2, [Rn, #offset] 把Rd1(低32 位)和Rd2(高32 位)表达的双字存储到地址Rn+offset 处精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(2)Load/Store指令(续)预索引预索引 (Pre‐indexing) ::LDR.W R0, [R1, #20]! ;预索引该指令先先把地址把地址R1+offset 处的值加载到处的值加载到R0,然后,R1 = R1+ 20;;这里的“!!”就是指在传送前更新基址寄存器R1 的值即: 步骤步骤① :: R1 = R1+ 20 ,, 步骤步骤 ② :: R0← R1 精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)((2))Load/Store指令指令(续)(续)预索引预索引 (Pre‐indexing) ::指令指令功能描述功能描述LDR.W Rd, [Rn, #offset]!LDRB.W Rd, [Rn, #offset]!LDRH.W Rd, [Rn, #offset]!字/字节/半字/双字的带预索引加载(不做带符号扩展,没有用到的高位全清0)LDRD.W Rd1, Rd2, [Rn, #offset]!LDRSB.W Rd, [Rn, #offset]!LDRSH.W Rd, [Rn, #offset]!字节/半字的带预索引加载,并且在加载后执行带符号扩展成32 位整数STR.W Rd, [Rn, #offset]!STRB.W Rd, [Rn, #offset]!STRH.W Rd, [Rn, #offset]!STRD.W Rd1, Rd2, [Rn, #offset]!字/字节/半字/双字的带预索引存储精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)((2))Load/Store指令指令(续(续)•后索引后索引 (Post‐indexing)::STR.W R0, [R1], #-12 ;后索引•该指令是把 R0 的值存储到地址R1 处。
在存储完毕后, R1 = R1+(‐12)•注意,[R1]后面是没有后面是没有“!!”的的精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)((2))Load/Store指令指令(续(续)•后索引后索引 (Post‐indexing)::指令指令功能描述功能描述LDR.W Rd, [Rn], #offsetLDRB.W Rd, [Rn], #offsetLDRH.W Rd, [Rn], #offsetLDRD.W Rd1, Rd2, [Rn], #offset字/字节/半字/双字的带后索引加载(不做带符号扩展,没有用到的高位全清0)LDRSB.W Rd, [Rn], #offset]LDRSH.W Rd, [Rn], #offset]字节/半字的带后索引加载,并且在加载后执行带符号扩展成32 位整数STR.W Rd, [Rn], #offsetSTRB.W Rd, [Rn], #offsetSTRH.W Rd, [Rn], #offsetSTRD.W Rd1, Rd2, [Rn], #offset字/字节/半字/双字的带后索引存储精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(3)批量数据Load/Store指令指令指令功能描述功能描述LDMIA Rd!, {寄存器列表} 从 Rd 处读取多个字。
每读一个字后Rd 自增一次,16位宽度STMIA Rd!, {寄存器列表} 存储多个字到Rd 处每存一个字后Rd 自增一次,16位宽度LDMIA.W Rd!, {寄存器列表} 从 Rd 处读取多个字每读一个字后Rd 自增一次,32位宽度LDMDB.W Rd!, {寄存器列表} 从 Rd 处读取多个字每读一个字前Rd 自减一次,32位宽度STMIA.W Rd!, {寄存器列表} 存储多个字到Rd 处每存一个字后Rd 自增一次,32位宽度STMDB.W Rd!, {寄存器列表} 存储多个字到Rd 处每存一个字前Rd 自减一次,32位宽度精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(3)批量数据Load/Store指令(续) Rd 后面的“!!”表示在每次访问前(Before)或访问后(After),要自增(Increment)或自减(Decrement)基址寄存器Rd的值,增/减单位:1个字(4 字节)或半字(2 字节)STMDB SP!, {R0-R3, LR} 等效于等效于 PUSH {R0-R3, LR}LDMIA SP!, {R0-R3, PC} 等效于等效于 POP {R0-R3, PC}例例2:: 记记R8=0x8000,则下面两条指令:,则下面两条指令: STMIA.W R8!, {R0-R3} ; R8 值变为0x8010,每存一次增一次,先存储后自增 STMDB.W R8, {R0-R3} ; R8 值的“一个内部复本”先自减后存储,但是R8 的值不变精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(4)算术四则运算指令指令指令功能描述功能描述ADD Rd, Rn, Rm ; Rd = Rn+RmADD Rd, Rm ; Rd += RmADD Rd, #imm ; Rd += imm常规加法imm 的范围是im8(16 位指令)或im12(32位指令)ADC Rd, Rn, Rm ; Rd = Rn+Rm+CADC Rd, Rm ; Rd += Rm+CADC Rd, #imm ; Rd += imm+C 带进位的加法imm 的范围是im8(16 位指令)或im12(32位指令)ADDW Rd, #imm12 ; Rd += imm12 带12 位立即数的常规加法SUB Rd, Rn ; Rd -= RnSUB Rd, Rn, #imm3 ; Rd = Rn-imm3SUB Rd, #imm8 ; Rd -= imm8SUB Rd, Rn, Rm ; Rd = Rm-Rm常规减法SBC Rd, Rm ; Rd -= Rm+CSBC.W Rd, Rn, #imm12 ; Rd = Rn-imm12-CSBC.W Rd, Rn, Rm ; Rd = Rn-Rm-C带借位的减法RSB.W Rd, Rn, #imm12 ; Rd = imm12-RnRSB.W Rd, Rn, Rm ; Rd = Rm-Rn反向减法MUL Rd, Rm ; Rd *= RmMUL.W Rd, Rn, Rm ; Rd = Rn*Rm常规乘法MLA Rd, Rm, Rn, Ra ; Rd = Ra+Rm*RnMLS Rd, Rm, Rn, Ra ; Rd = Ra-Rm*Rn乘加与乘减(译者添加)UDIV Rd, Rn, Rm ; Rd = Rn/Rm (无符号除法)SDIV Rd, Rn, Rm ; Rd = Rn/Rm (带符号除法)硬件支持的除法,余数被丢弃SMULL RL, RH, Rm, Rn ;[RH:RL]= Rm*RnSMLAL RL, RH, Rm, Rn ;[RH:RL]+= Rm*Rn带符号的64 位乘法UMULL RL, RH, Rm, Rn ;[RH:RL]= Rm*RnSMLAL RL, RH, Rm, Rn ;[RH:RL]+= Rm*Rn无符号的64 位乘法精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)((4))算术四则运算指令算术四则运算指令(续)(续)例例3 3::以加法为例说明16bit、32bit的算术四则运算指令:ADD R0, R1 ; R0 += R1ADD R0, #0x12 ; R0 += 12ADD.W R0, R1, R2 ; R0 = R1+R2Ø虽然助记符都是ADD,但是二进制机器码是不同的。
Ø当使用16 位加法时,会自动更新APSR 中的标志位Ø然而,在使用了“.W”显式显式指定了32 位指令后,就可以通过“S”后缀后缀控制对APSR 的更新:ADD.W R0, R1, R2 ; 不更新标志位不更新标志位ADDS.W R0, R1, R2 ; 更新标志更新标志位位精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)((4))算术四则运算指令算术四则运算指令(续)(续)UDIV Rd, Rn, Rm ; Rd = Rn/Rm (无符号除法)SDIV Rd, Rn, Rm ; Rd = Rn/Rm (带符号除法)l为了为了捕捉被零除的非法操作捕捉被零除的非法操作,可以在NVIC 的配置控制寄存器中置位DIVBZERO位如果出现了被零除的情况,将会引发一个用法fault异常l如果没有任何措施,Rd将在除数为零时被清零精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(5)逻辑操作指令指令指令功能描述功能描述AND Rd, Rn ; Rd &= RnAND.W Rd, Rn, #imm12 ; Rd = Rn & imm12AND.W Rd, Rm, Rn ; Rd = Rm & Rn按位与ORR 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 位清零ORN.W Rd, Rn, #imm12 ; Rd = Rn | ~imm12ORN.W Rd, Rm, Rn ; Rd = Rm | ~Rn 按位或反码EOR Rd, Rn ; Rd ^= RnEOR.W Rd, Rn, #imm12 ; Rd = Rn ^ imm12EOR.W Rd, Rm, Rn ; Rd = Rm ^ Rn(按位)异或,异或总是按位的精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(6)移位和循环指令指令指令功能描述功能描述LSL Rd, Rn, #imm5 ; Rd = Rn<
此时,Rd也要担当Rn 的角色——译注l如果在移位和循环指令上加上“S”后缀,这些指令会更新进位位Cl如果是16 位Thumb-2指令,则总是更新C 的精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)带进位的循环右移精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(7)符号扩展指令•二进制补码表示法中,最高位是符号位•把把一个一个8 位或位或16 位负数扩展成位负数扩展成32 位位时时::①对于负数,必须把所有高位全填1,其数值不变;②至于正数或无符号数,则只需简单地把高位清0指令指令功能描述功能描述SXTB Rd, Rm ; Rd = Rm 的带符号扩展把带符号字节整数扩展到 32 位SXTH Rd, Rm ; Rd = Rm 的带符号扩展把带符号半字整数扩展到 32 位精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(8)字节调序指令指令指令功能描述功能描述REV.W Rd, Rn 在字中调整字节序REV16.W Rd, Rn 在高低半字中调整字节序REVSH.W 在低半字中调整字节序,并做带符号扩展精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(8)字节调序指令(续)指令指令功能描述功能描述REV.W Rd, Rn 在字中调整字节序REV16.W Rd, Rn 在高低半字中调整字节序REVSH.W 在低半字中调整字节序,并做带符号扩展REVH:对低半字调序;REVSH:基于REVH,并进行符号扩展精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(8)字节调序指令(续)例例4::记R0=0x12345678,在执行下列指定后:REV R1, R0REVH R2, R0REV16 R3, R0则R1=0x78563412,R2=0x12347856,R3=0x34127856。
REVSH 在REVH 的基础上,还把转换后的半字做带符号扩展 例例5::记R0=0x33448899, 则 REVSH R1, R0执行后,R1=0xFFFF9988精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(9)位域处理指令例例6::((1))BFC(位域清零)指令(位域清零)指令 LDR R0, =0x1234FFFF BFC R0, #4, #10执行完后,R0= 0x1234C00F指令指令功能描述功能描述BFC.W Rd, #
4))UBFX/SBFX LDR R0, =0x5678ABCD UBFX.W R1, R0, #12,#16 ;R0=0x0000678A类似地,SBFX 也抽取任意的位域,但是以带符号的方式进行扩展 LDR R0, =0x5678ABCD SBFX.W R1, R0, #8,#4 ;R0=0xFFFFFFFB指令指令功能描述功能描述BFC.W Rd, #
MOV PC, R0 ;转移地址由R0 给出LDR PC, [R0] ;转移地址存储在R0 所指向的存储器中POP {…, PC} ;把返回地址以弹出堆栈的风格送给PC,从而实现转移LDMIA SP!, {…, PC} ; POP 的另一种等效写法精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(11)程序状态寄存器标志位的更新指令①16 位算术逻辑指令②32 位带S 后缀的算术逻辑指令③比较指令(如,CMP/CMN)和测试指令(如TST/TEQ)④直接写 PSR/APSR (MSR 指令)上述指令可以更改状态寄存器精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(12)隔离(barrier)指令 针对结构比较复杂的存储器系统流水线作业和写缓冲,Cortex-M3引进了隔离指令,以避免系统可能发生紊乱现象(race condition)指令指令功能描述功能描述DMB 数据存储器隔离DMB 指令保证: 仅当所有在它前面的存储器访问都执行完毕后,才提交(commit)在它后面的存储器访问动作。
DSB 数据同步隔离比DMB 严格: 仅当所有在它前面的存储器访问都执行完毕后,才执行它在后面的指令ISB 指令同步隔离最严格:它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(13)饱和运算指令•Cortex-M3 中的饱和运算指令分为两种:一种是带符号饱带符号饱和运算和运算;另一种是无符号饱和运算无符号饱和运算•饱和运算多用于信号处理当信号被放大后,有可能使它的幅值超出允许输出的范围如果简单地清除MSB,则常常会严重破坏信号的波形,而饱和运算则只是使信号产生削顶失真•饱饱和和运运算算的的结结果果可可以以用用于于更更新新应应用用程程序序状状态态寄寄存存器器APSR中中Q 标志Q 标志在写入后可以通过写标志在写入后可以通过写APSR清清0•Rn 存存储储“放放大大后后的的信信号号((32 位位带带符符号号整整数数))” ;;Rd 存存储储饱饱和和运运算算的的结结果果;;#imm5 用用于于指指定定饱饱和和边边界界——该由多少位的带符号整数来表达允许的范围,取值范围是1-32指令名指令名功能描述功能描述SSAT.W Rd, #imm5, Rn, {,shift} 以带符号数的边界进行饱和运算(交流)USAT.W Rd, #imm5, Rn, {,shift} 以无符号数的边界进行饱和运算(带纹波的直流)精选ppt饱和运算例无符号数饱和运算 带符号饱和运算 精选ppt4. Cortex‐M3常用的Thumb‐2指令集(续)(14)If‐Then(IT)指令•If‐Then(IT)指令围起一个块,里面最多有4 条指令,它里面的指令可以条件执行。
•IT 已经带了一个“T”,因此还可以最多再带3 个“T”或者“E”并且对T 和E 的顺序没有要求•其中T 对应条件成立时执行的语句,E 对应条件不成立时执行的语句•在If‐Then块中的指令必须加上条件后缀,且T 对应的指令必须使用和IT 指令中相同的条件,E 对应的指令必须使用和IT 指令中相反的条件•IT 的使用形式总结如下:IT
