好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第3章Thumb2指令系统.ppt

47页
  • 卖家[上传人]:M****1
  • 文档编号:582955230
  • 上传时间:2024-08-29
  • 文档格式:PPT
  • 文档大小:818KB
  • / 47 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Thumb‐2指令系统(Thumb‐2指令体系架构)精选ppt 主要内容主要内容1.概述概述2.Thumb-2指令指令集集分类分类3.统一统一的的汇编语言汇编语言4.Cortex-M3常用常用的的Thumb-2指令集指令集5.小结小结精选ppt 1.  概述•对于确定的微处理器而言,编写紧凑的代对于确定的微处理器而言,编写紧凑的代码以降低消耗显得至关重要码以降低消耗显得至关重要•通常,存储器的大小是固定的,而产品的功能特性却各异,选择恰当的处理器恰当的处理器并精精心调整代码心调整代码是明智的精选ppt 1.  概述(续)对于ARM体系架构的来说:①微处理器有两种工作状态:ØARM工作状态工作状态ØThumb工作状态工作状态②Thumb指令集是添加到ARM的标准RISC指令集之上的独立指令集;③Thumb指令集包括了基本的加法、减法、循环移位以及跳转等大约36条16位指令;④Thumb指令集作为ARM指令集的压缩方案,简洁、有效,应用广泛并得到很好的支持,通过Thumb指令替换ARM指令,可以将某些代码的规模减小大约20%到30%精选ppt 1.  概述(续)对于ARM体系架构的来说(续):⑤  但是,有限的Thumb指令仅对基本的算术和逻辑操作有用:ØThumb状态状态下,处理器将仅可使用有限数量下,处理器将仅可使用有限数量的寄存器,的寄存器,R8-R12的使用受到限制,的使用受到限制,Ø无法完成诸如处理中断、长跳转、原子存储无法完成诸如处理中断、长跳转、原子存储器器(atomic memory)操作,或协处理器操作等操作,或协处理器操作等等复杂任务,等复杂任务,Ø也无法像也无法像ARM模式那样进行条件执行和移位模式那样进行条件执行和移位或循环移位等操作或循环移位等操作。

      ⑥  Thumb代码和标准ARM代码不能混杂使用,必须显式地显式地在两种工作状态间进行切换,这迫使程序员必须将所有的16位代码与32位代码分开并隔离到独立的模块中精选ppt 1.  概述(续)对于ARM体系架构的来说(续):⑦其次,两种工作状态之间来回切换需要消耗时间,导致代码运行速度降低大约15%,不仅要增加代码,而且还需要几十个前导(preamble)以及后同步指令 (postamble)来组织指针并清空CPU的流水线⑧  虽然Thumb指令能够实现较高密度的代码,缓存使用效率更高,但实现ARM指令代码的功能往往需要较多的Thumb指令代码,相比较而言,ARM指令使用起来更灵活精选ppt 1.  概述(续)•Thumb-2并不是Thumb的升级•它是另起炉灶,继承并集成了传统的Thumb指令集和ARM指令集的各自优点,可以完全代替Thumb和原先的ARM指令集,•是Thumb指令集和ARM指令集的一个超集•Thumb-2指令集体系架构,无需处理器进行工作状态的显示切换,就可运行16位与32位混合代码•与ARM体系架构相比,速度提高大约15%到20%精选ppt 1.  概述(续)•Cortex-M3处理器使用的指令集是Thumb-2指令集的子集,它它的的(指令)(指令)工作状态只工作状态只有有一个,那就是一个,那就是Thumb-2状态状态。

      •Cortex-M3处理器的两种工作状态:①①Thumb-2状态状态②②调试状态调试状态精选ppt 2. Thumb-2指令指令集集分类分类•按照指令的长度分类,Thumb-2指令集可分为两种:((1))16-bit指令集;指令集;((2))32-bit指令集精选ppt 2. 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))比较跳转指令等比较跳转指令等精选ppt 2. Thumb-2指令指令集集分类分类(续)(续)•基于Thumb-2指令体系架构编写的代码在执行过程中,处理器不存在ARM工作状态和Thumb工作状态之间的切换。

      •那么,处理器必须能够自动识别当前指令长度,是16-bit还是32-bit,以正确地执行Thumb-2指令代码,它是如何识别呢?精选ppt 2. Thumb-2指令指令集集分类分类(续)(续)•指令长度的确定指令长度的确定        PC寄存器指向的半字中,Bits<15:11>决定该半字是16-bit指令,还是属于32-bit指令的一部分图3-1说明了Bits<15:11>确定指令长度的功能精选ppt 2. 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指令精选ppt 3. 统一的汇编语言•ARM指令集体系架构下,指令集体系架构下,ARM指令与Thumb指令分属不同的程序模块,由不同的汇编器对其分别进行汇编。

      •Thumb-2指令集体系架构下,指令集体系架构下, 16bit指令与32bit指令可以在同一程序模块出现,并由同一汇编器对其进行汇编精选ppt Toolchain 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’ language ARM 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 instructions 4. Cortex‐M3常用的Thumb‐2指令集(1)数据传送指令             Cortex‐M3 中的数据传送类型包括:①两个寄存器间传送数据两个寄存器间传送数据②寄存器与特殊功能寄存器间传送数据寄存器与特殊功能寄存器间传送数据③把一个立即数加载到寄存器把一个立即数加载到寄存器指令指令功能描述功能描述MOV , #将8 位立即数传送到目标寄存器MOV 将低寄存器值传送给低目标寄存器MOV 将高或低寄存器值传送给高或低目标寄存器MVN 将寄存器值取反后传送给目标寄存器MOV{S}.W , #将12位立即数传送到寄存器中MOV{S}.W {, }将移位后的寄存器值传送到寄存器中MOVT.W , #将16位立即数传送到寄存器的高半字[31:16]中MOVW.W , #将16位立即数传送到寄存器的低半字[15:0]中,并将高半字[31:16]清零MRS 将状态传送到寄存器中MSR _,传送到状态寄存器中精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(1)数据传送指令(续)        MRS/MSR 用用于于特特权权级级别别条条件件下下访访问问特特殊殊功功能能寄寄存器存器。

      指令语法如下:ØMRS  ; 加载特殊功能寄存器的值到加载特殊功能寄存器的值到RnØMSR ,    ; 存储存储Rn 的值到特殊功能寄存器的值到特殊功能寄存器其中,SReg 可以是下表中的一个精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(1)数据传送指令(续)            MRS/MSR 指令中的指令中的Sreg寄存器:寄存器:符号符号功能功能IPSR 当前服务中断号寄存器EPSR 执行状态寄存器(读回来的总是0)它里面含T 位,在CM3 中T 位必须是1APSR 上条指令结果的标志IEPSR IPSR+EPSRIAPSRIPSR+APSREAPSREPSR+APSRPSR xPSR = APSR+EPSR+IPSRMSP 主堆栈指针PSP 进程堆栈指针PRIMASK常规异常屏蔽寄存器BASEPRI常规异常的优先级阈值寄存器BASEPRI_MAX 等同BASEPRI,但是施加了写的限制:新的优先级比较比旧的高(更小的数)FAULTMASKfault 屏蔽寄存器(同时还包含了PRIMASK 的功能,因为faults 的优先级更高)CONTROL 控制寄存器(堆栈选择,特权等级)精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(2)Load/Store指令指令指令功能描述功能描述LDRB Rd, [Rn, #offset] 从地址 Rn+offset 处读取一个字节到RdLDRH Rd, [Rn, #offset] 从地址Rn+offset 处读取一个半字到RdLDR Rd, [Rn, #offset] 从地址Rn+offset 处读取一个字到RdLDRD Rd1, Rd2, [Rn, #offset] 从地址Rn+offset 处读取一个双字(64 位整数)到Rd1(低32 位)和Rd2(高32 位)中。

      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 处精选ppt 4. 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 精选ppt 4. 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]!字/字节/半字/双字的带预索引存储精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)((2))Load/Store指令指令(续(续)•后索引后索引 (Post‐indexing)::STR.W  R0, [R1], #-12   ;后索引•该指令是把 R0 的值存储到地址R1 处。

      在存储完毕后, R1 = R1+(‐12)•注意,[R1]后面是没有后面是没有“!!”的的精选ppt 4. 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字/字节/半字/双字的带后索引存储精选ppt 4. 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位宽度精选ppt 4. 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 的值不变精选ppt 4. 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 位乘法精选ppt 4. 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 ; 更新标志更新标志位位精选ppt 4. 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将在除数为零时被清零精选ppt 4. 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(按位)异或,异或总是按位的精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(6)移位和循环指令指令指令功能描述功能描述LSL Rd, Rn, #imm5    ; Rd = Rn<>imm5LSR Rd, Rn                  ; Rd >>= RnLSR.W Rd, Rm, Rn      ; Rd = Rm>>Rn逻辑右移ASR Rd, Rn, #imm5     ; Rd = Rn·>>imm5ASR Rd, Rn                  ; Rd ·>> = RnASR.W Rd, Rm, Rn      ; Rd = Rm·>> Rn算术右移ROR Rd, Rn                  ; Rd >> = RnROR.W Rd, Rm, Rn      ; Rd = Rm >> Rn循环右移RRX.W Rd, Rn            ; Rd = (Rn>>1)+(C<<31)RRXS.W Rd, Rn          ; tmpBit = Rn & 1                ; Rd = (Rn>>1)+(C<<31)                ; C= tmpBit带进位的右移一格 亦可写作 RRX{S} Rd 。

      此时,Rd也要担当Rn 的角色——译注l如果在移位和循环指令上加上“S”后缀,这些指令会更新进位位Cl如果是16 位Thumb-2指令,则总是更新C 的精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)带进位的循环右移精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(7)符号扩展指令•二进制补码表示法中,最高位是符号位•把把一个一个8 位或位或16 位负数扩展成位负数扩展成32 位位时时::①对于负数,必须把所有高位全填1,其数值不变;②至于正数或无符号数,则只需简单地把高位清0指令指令功能描述功能描述SXTB  Rd, Rm               ; Rd = Rm 的带符号扩展把带符号字节整数扩展到 32 位SXTH  Rd, Rm               ; Rd = Rm 的带符号扩展把带符号半字整数扩展到 32 位精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(8)字节调序指令指令指令功能描述功能描述REV.W Rd, Rn 在字中调整字节序REV16.W Rd, Rn 在高低半字中调整字节序REVSH.W 在低半字中调整字节序,并做带符号扩展精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(8)字节调序指令(续)指令指令功能描述功能描述REV.W Rd, Rn 在字中调整字节序REV16.W Rd, Rn 在高低半字中调整字节序REVSH.W 在低半字中调整字节序,并做带符号扩展REVH:对低半字调序;REVSH:基于REVH,并进行符号扩展精选ppt 4. 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精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(9)位域处理指令例例6::((1))BFC(位域清零)指令(位域清零)指令              LDR R0, =0x1234FFFF              BFC R0, #4, #10执行完后,R0= 0x1234C00F指令指令功能描述功能描述BFC.W Rd, #, #位域清零BFI.W Rd, Rn, #, #将一个寄存器的位域插入另一个寄存器中CLZ.W Rd, Rn 计算前导0 的数目RBIT.W Rd, Rn 按位旋转180 度SBFX.W Rd, Rn, #, # 拷贝位域,并带符号扩展到32 位UBFX.W Rd, Rn, #, # 拷贝位域,并无符号扩展到32 位BFC.W Rd, #lsb, #widthLsb 为位域的末尾Width 指定为段宽度, 在lsb和它的左边(更高有效位)精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(9)位域处理指令(续)例例6:(续):(续)((2))BFI((位域位域插入指令插入指令)              LDR R0, =0x12345678              LDR R1, =0xAABBCCDD               BFI.W R1, R0, #8, #16则执行后,R1= 0xAA5678DD (( 3)) RBIT指指 令令 ,,记R1=0xB4E10C23(二进制数值为 1011,0100,1110,0001,0000,1100,0010,0011),指令             RBIT.W R0, R1执行后,则R0=0xC430872D(二进制数值为1100,0100,0011,0000,1000,0111,0010,1101)。

      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, #, #位域清零BFI.W Rd, Rn, #, #将一个寄存器的位域插入另一个寄存器中CLZ.W Rd, Rn 计算前导0 的数目RBIT.W Rd, Rn 按位旋转180 度SBFX.W  Rd,  Rn,  #, # 拷贝位域,并带符号扩展到32 位UBFX.W  Rd,  Rn,  #, # 拷贝位域,并无符号扩展到32 位精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(10)子程序调用与无条件转移指令①B,BL,BLX,BX②MOV 、LDR 指令实现程序转移•主要指令格式有:B Label                ;转移到Label 处对应的地址BX reg                 ;转移到由寄存器reg 给出的地址BL Label                 ;转移到Label 处对应的地址,并且把转移前的下条指令地址保存到LR BLX reg                 ;转移到由寄存器reg 给出的地址,并且把转移前的下条指令地址保存到LR。

      MOV PC, R0          ;转移地址由R0 给出LDR PC, [R0]         ;转移地址存储在R0 所指向的存储器中POP {…, PC}          ;把返回地址以弹出堆栈的风格送给PC,从而实现转移LDMIA SP!, {…, PC}          ; POP 的另一种等效写法精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(11)程序状态寄存器标志位的更新指令①16 位算术逻辑指令②32 位带S 后缀的算术逻辑指令③比较指令(如,CMP/CMN)和测试指令(如TST/TEQ)④直接写 PSR/APSR (MSR 指令)上述指令可以更改状态寄存器精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(12)隔离(barrier)指令          针对结构比较复杂的存储器系统流水线作业和写缓冲,Cortex-M3引进了隔离指令,以避免系统可能发生紊乱现象(race condition)指令指令功能描述功能描述DMB 数据存储器隔离DMB 指令保证: 仅当所有在它前面的存储器访问都执行完毕后,才提交(commit)在它后面的存储器访问动作。

      DSB 数据同步隔离比DMB 严格: 仅当所有在它前面的存储器访问都执行完毕后,才执行它在后面的指令ISB 指令同步隔离最严格:它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令精选ppt 4. 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 饱和运算例无符号数饱和运算 带符号饱和运算 精选ppt 4. 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 ;围起1 条指令的If‐Then 块IT ;围起2 条指令的If‐Then 块IT ;围起3 条指令的If‐Then 块IT ;围起4 条指令的If‐Then 块•其中的取值可以是“T”或者“E”而 为条件精选ppt 4. Cortex‐M3常用的Thumb‐2指令集(续)(14)If‐Then(IT)指令(续)例例7:: IT 指令优化C 代码的例子如下面伪代码所示:if (R0==R1){R3 = R4 + R5;R3 = R3 / 2;}else{R3 = R6 + R7;R3 = R3 / 2;}可以写作:CMP R0, R1            ; 比较R0 和R1ITTEE  EQ              ; 如果 R0 == R1,Then-Then-Else-ElseADDEQ R3, R4, R5     ; 相等时加法ASREQ R3, R3, #1     ; 相等时算术右移ADDNE R3, R6, R7   ; 不等时加法ASRNE  R3, R3, #1   ; 不等时算术右移精选ppt 5. 小结•Cortex‐M3支持的Thumb‐2指令精选ppt 5. 小结•Cortex‐M3支持的Thumb‐2指令(续)精选ppt 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.