嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统3_第1页
嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统3_第2页
嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统3_第3页
嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统3_第4页
嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统3_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统设计西安邮电大学计算机学院王忠民第三章CortexM3指令系统学习目的掌握CortexM3指令操作数的寻址方式掌握数据传送类指令、算数运算类指令、逻辑运算与移位类指令、转移控制类指令、其他基本指令等五大类指令的基本功能及使用学习内容汇编语言基础寻址方式数据传送类指令数据处理类指令控制转移类指令其他指令汇编语言基础寻址方式汇编语言指令系统(1)汇编语言指令系统(2)第三章CortexM3指令系统---学习内容汇编语言指令系统(1)算术运算指令

逻辑运算与位操作指令

内部数据传送指令

第三章CortexM3指令系统---学习内容汇编语言指令系统(2)存储器数据传输指令(Load/Store)

比较与测试指令

控制转移指令

第三章CortexM3指令系统---算数运算指令—加法指令ADD16/32SimpleADDitionADD{S}<c>{<Rd>,}<Rn>,#<const>Rd←Rn+constADD{S}<c>{<Rd>,}<Rn>,<Rm>{,<shift>}Rd←Rn+shift(Rm)注意:第2操作数中的{,<shift>}是可选的,也就是说,第2操作数可以是寄存器,也可以是寄存器移位。下同。ADD{S}<c>{<Rd>,}SP,#<const>Rd←SP+constADD{S}<c>{<Rd>,}SP,<Rm>{,<shift>}Rd←SP+shift(Rm)ADC16/32ADditionwithCarryADD{S}<c>{<Rd>,}<Rn>,#<const>Rd←Rn+const+CADD{S}<c>{<Rd>,}<Rn>,<Rm>{,<shift>}Rd←Rn+shift(Rm)+CADD R0,R1,#0x80 ;寄存器R1的内容与立即数0x80相加结果送R0 ;被默认汇编为32位指令。指令中出现立即数,一定要用32位编码ADD R0,R1,R2 ;寄存器R1的内容与寄存器R2内容相加结果送R0 ;被默认汇编为32位指令ADD R0,R1,R2,LSL#2 ;寄存器R1的内容与寄存器R2内容逻辑左移2位后相加结果送R0 ;被默认汇编为32位指令

ADDS.n R0,R1 ;寄存器R0与R1相加结果送R0。第1操作数与目的操作数相同。 ;被人为指定汇编为16位指令,不指定默认也是16位ADDS.w R0,R1 ;寄存器R0与R1相加结果送R0。第1操作数与目的操作数相同。 ;被人为指定汇编为32位指令,不指定默认是16位ADDSEQ.w R0,R1 ;功能与上条相同。 ;被人为指定汇编为32位指令,不指定默认也是32位。运算类指令的指令格式的变化---以ADD指令为例3-9-add_li3.3第三章CortexM3指令系统---算数运算指令—减法指令SUB16/32SimpleSUBtractionSUB{S}<c>{<Rd>},<Rn>,#<const>Rd←Rn–constSUB{S}<c>{<Rd>},<Rn>,<Rm>{,<shift>}Rd←Rn-shift(Rm)(1)SUB减法指令SBC16/32SuBtractionwithCarrySBC{S}<c>{<Rd>,}<Rn>,#<const>Rd←Rm–const+flagC-------(-C非)SBC{S}<c>{<Rd>,}<Rn>,<Rm>{,<shift>}Rd←Rm-shift(Rm)+flagC-----(-C非)(2)SBC带进位加法指令RSB16/32ReverseSuBtractionRSB{S}<c>{<Rd>,}<Rn>,#<const>Rd←-Rn+constRSB{S}<c>{<Rd>,}<Rn>,<Rm>{,<shift>}Rd←-Rn+shift(Rm)(3)RSB逆向减法指令3-9-sbc_li3.3与X86不一样。A-B变为A+(-B),C不会有进位。因此,这里应为减C的非第三章CortexM3指令系统---算数运算指令—乘法指令(1)MUL32位乘法指令(2)MLA32位乘加指令MUL16/32MULtiplication–32-bitresultsMUL{S}<c>{<Rd>,}<Rn>,<Rm>Rd←Rn*RmMLA32MultipLicationandAdditionMLA<c><Rd>,<Rn>,<Rm>,<Ra>Rd←(Rn*Rm)+Ra(3)MLS32位乘减指令MLS32MultipLicationandSubtractionMLS<c><Rd>,<Rn>,<Rm>,<Ra>Rd←Ra-(Rn*Rm)第三章CortexM3指令系统---算数运算指令—乘法指令(4)UMULL64位无符号乘法指令(5)UMLAL64位无符号乘加指令(6)SMULL64位有符号乘法指令UMULL32UnsignedMULtipLication–64-bitresultsUMULL<c><Rdlsb>,<Rdmsb>,<Rn>,<Rm>[Rdmsb:Rdlsb]←Rn*RmUMLAL32UnsignedMuLtipLicationand64-bitAdditionUMLAL<c><Rdlsb>,<Rdmsb>,<Rn>,<Rm>[Rdmsb:Rdlsb]←Rn*Rm+[Rdmsb:Rdlsb

(7)SMLAL64位有符号乘加指令SMULL32SignedMULtiplication–64-bitresultsSMULL<c><Rdlsb>,<Rdmsb>,<Rn>,<Rm>[Rdmsb:Rdlsb]←Rn*RmSMLAL32SignedMuLtiplicationand64-bitAdditionSMLAL<c><Rdlsb>,<Rmsb>,<Rn>,<Rm>[Rdmsb:Rdlsb]←Rn*Rm+[Rdmsb:Rdlsb]第三章CortexM3指令系统---算数运算指令—除法指令(1)UDIV无符号数除法(2)SDIV有符号数除法UDIV32UnsignedDIVisionUDIV<c>{<Rd>,}<Rn>,<Rm>Rd←Rn÷RmSDIV32SignedDIVisionSDIV<c>{<Rd>,}<Rn>,<Rm>Rd←Rn÷Rn汇编语言指令系统(1)算术运算指令

逻辑运算与位操作指令

内部数据传送指令

第三章CortexM3指令系统---学习内容第三章CortexM3指令系统---逻辑运算指令(1)AND逻辑与指令AND16/32LogicalORAND{S}<c>{<Rd>,}<Rn>,#<const>Rd←RnANDconstAND{S}<c>{<Rd>,}<Rn>,<Rm>{,<shift>}Rd←RnANDshift(Rm)LDR R0,=0xFFFFFFFFLDR R1,=0xBFFFFFFFAND R0,R1 ;R0的值为0xBFFFFFFFMYPROJECTS2023/0505_and第三章CortexM3指令系统---逻辑运算指令(2)ORR逻辑或指令LDRR0,=0x0LDRR1,=0x40000000ORRR0,R1 ;R0的值为0x40000000ORR16/32LogicalORORR{S}<c>{<Rd>,}<Rn>,#<const>Rd←RmORconstORR{S}<c>{<Rd>,}<Rn>,<Rm>{,<shift>}Rd←RmORshift(Rm)MYPROJECTS2023/0505_orr第三章CortexM3指令系统---逻辑运算指令(3)EOR逻辑异或指令LDRR0,=0xFFFF0000LDRR1,=0xFF0000FFEORR0,R1 ;R0的值为0x00FF00FFEOR16/32ExclusiveEOREOR{S}<c>{<Rd>,}<Rn>,#<const>Rd←RnXORconstEOR{S}<c>{<Rd>,}<Rn>,<Rm>{,<shift>}Rd←RnXORshift(Rm)MYPROJECTS2023/0505_eor第三章CortexM3指令系统---逻辑运算指令(4)NEG求补指令NEG指令用零减去第2操作数Rm,可用于计算用补码表示的负数的绝对值。例如,下面两条指令计算-1的绝对值。LDR R0,=0xFFFFFFFF ;-1的补码送R0NEG R1,R0 ;R1的值为0x00000001NEG16/32NEGativeNEG<c><Rd>,<Rm>Rd←0-Rm举例:在变量x中定义10个有符号数,求其绝对值并放到变量y中。第三章CortexM3指令系统---移位指令(1)LSL逻辑左移指令指令中第2操作数“#<imm5>”的取值范围为0~31,“Rm”没有取值范围限制,但大于31实际上就没有意义了。LSL16/32LogicalShiftLeftLSL{S}<c><Rd>,<Rm>,#<imm5>Rd←Rm<<imm5LSL{S}<c><Rd>,<Rn>,<Rm>Rd←Rn<<Rm第三章CortexM3指令系统---移位指令(2)LSR逻辑右移指令LSR16/32LogicalShiftRightLSR{S}<c><Rd>,<Rm>,#<imm5>Rd←Rm>>imm5LSR{S}<c><Rd>,<Rn>,<Rm>Rd←Rn>>Rm(3)ASR算数右移指令ASR16/32ArithmeticShiftRightASR{S}<c><Rd>,<Rm>,#<imm5>Rd←Rm>>imm5ASR{S}<c><Rd>,<Rn>,<Rm>Rd←Rn>>Rm第三章CortexM3指令系统---移位指令(4)ROR循环右移指令(5)RRX带进位的循环右移ROR16/32RightROtationROR{S}<c><Rd>,<Rm>,#<imm5>Rd←rotation(Rm,imm5bits)ROR{S}<c><Rd>,<Rn>,<Rm>Rd←rotation(Rn,Rmbits)RRX16/32EXtendedRightRotationROR{S}<c><Rd>,<Rn>,<Rm>Rd←rotation([Rn,C],Rmbits第三章CortexM3指令系统---位段操作指令(1)BFC位段清零指令位段操作指令实现对多个位的清0、置1、传送等操作。BFC32BitFieldClearingBFC<c><Rd>,#<lsb>,#<Nb>Rd[lsb+Nb-1:lsb]←0lsb=0...31,Nb=1...32,该指令不影响标志位。BFC位段清零指令实现位段的清零操作。例如,若要将R0寄存器的高24位清零,其他位不变,就可通过以下两条指令来实现。LDR R0,=0xFFFFFFFF ;将立即数0xFFFFFFFF送寄存器R0BFC R0,#8,#24 ;将R0寄存器的b4~b7清零,R0值为0xFFFFFF0F第三章CortexM3指令系统---位段操作指令(2)BFI位段拷贝指令BFI位段拷贝指令实现Rn的0到Nb位拷贝到Rd的lsb位到lsb+Nb位。例如,若要将R0寄存器的低8位拷贝到R1寄存器的高8位,其他位不变,可通过以下指令来实现。LDR R0,=0xFFFFFFFF ;将立即数0xFFFFFFFF送寄存器R0LDR R1,=0x00001111BFI R1,R0,#24,#8 ;将R0的b0~b7位拷贝到R1的b24~b31位,R1的值为FF001111BFI32BitFieldCopyingBFI<c><Rd>,<Rn>,#<lsb>,#<Nb>Rd[lsb+Nb-1:lsb]←Rn[Nb:0]lsb=0...31,Nb=1...32.第三章CortexM3指令系统---位段操作指令(3)BIC取反与指令BIC取反与指令实现第2操作数取反后与第1操作数相“与”,结果送目的操作数Rd。例如,下面两条指令实现将R0低8位清零。LDR R0,=0xFFFFFFFF ;将立即数0xFFFFFFFF送寄存器R0BIC R0,#0XFF ;R0的值为0xFFFFFF00BIC16/32ClearingBItsbyANDmaskBIC{S}<c>{<Rd>,}<Rn>,~#<const>Rd←RnANDNOT(const)BIC{S}<c>{<Rd>,}<Rn>,~<Rm>{,<shift>}Rd←RnANDNOT(shift(Rm))第三章CortexM3指令系统---位段操作指令(4)ORN取反或指令ORN取反或指令实现第2操作数取反后与第1操作数相“或”,结果送目的操作数Rd。例如,下面两条指令实现将R0各位全部置1。LDR R0,=0x0 ;将立即数0x0送寄存器R0ORN R0,#0X00 ;R0的值为0xFFFFFFFFORN16/32ComplementedlogicalORORN{S}<c>{<Rd>,}<Rn>,~#<const>Rd←RmORNOT(const)ORN{S}<c>{<Rd>,}<Rn>,~<Rm>{,<shift>}Rd←RmORNOT(shift(Rm))第三章CortexM3指令系统---位段操作指令(5)RBIT位置换指令RBIT位置换指令实现把Rm的b0位送Rd的b31位,Rm的b1位送Rd的b30位,以此类推,直到把Rm的b31位送Rd的b0位。例如,下面两条指令将立即数0x0000000D的32位按位置换为0xB0000000。LDR R0,=0xD RBIT R1,R0 ;R0的低4位1101送到R1的高4位为1011,R1值为0xB0000000RBIT32BITtranspositionRBIT<c><Rd>,<Rm>Rd[31-k]←Rm[k]withk=0...31第三章CortexM3指令系统---位段操作指令(6)REV字节交换指令REV字节交换指令实现字中4个字节的交换,第1字节[7:0]与第4字节[31:24]互换,第2字节[15:8]与第3字节[23:16]互换。例如,下面两条指令将立即数0x44332211的四个字节交换,得到0x11223344。LDR R0,=0x44332211 REV R1,R0 ;R1的值为0x11223344REV16/32REVersalofMSBsandLSBsREV<c><Rd>,<Rm>Rd[31:24]←Rm[7:0];Rd[23:16]←Rm[15:8]Rd[15:8]←Rm[23:16];Rd[7:0]←Rm[31:24]第三章CortexM3指令系统---位段操作指令(7)REV16半字交换指令REV16半字交换指令实现低低半字[15:0]中两个字节的互换,高半字[31:16]中两个字节的互换。例如,下面两条指令将立即数0x44332211高低半字互换,得到0x33441122。LDR R0,=0x44332211 REV16 R1,R0 ;R1的值为0x33441122REV1616/32REVersalofMSBsandLSBsbyahalf-wordREV16<c><Rd>,<Rm>Rd[31:24]←Rm[23:16];

Rd[23:16]←Rm[31:24]Rd[15:8]←Rm[7:0];

Rd[7:0]←Rm[15:8]第三章CortexM3指令系统---位段操作指令(8)REVSH低半字字节交换指令REVSH指令将低半字的两个字节交换位置,并按交换后的最高位(d15)进行符号位的扩展。例如,下面两条指令执行后,由于交换后的d15位为1,符号扩展后高16位全为1,因此寄存器R1的值为0xFFFF8105。 MOV R0,#0x0581 REVSH R1,R0 ;R1的值为FFFF8105REVSH16/32SignedREVersalbyHalf-wordREVSH<c><Rd>,<Rm>Rd[31:8]←Signedpromotion(Rm[7:0]);Rd[7:0]←Rm[15:8]汇编语言指令系统(1)算数运算指令

逻辑运算与位操作指令

内部数据传送指令

第三章CortexM3指令系统---学习内容第三章CortexM3指令系统---内部数据传输指令(1)MOV指令MOV指令将CPU内部把一个寄存器的内容送另一个寄存器、或把一个立即数送寄存器,是使用频率很高的一个数据传送指令。需要再次强调的是,由于指令编码固定字长的限制,并不是所有的立即数都能用MOV指令实现正确的编码,对于不能实现正确编码的情况,可以使用LDR指令通过文字池的途径来解决。数据传送是计算机系统实现运算操作的基础。计算机中数据的传送分为CPU内部的数据传送,如寄存器送寄存器或立即数送寄存器等,以及CPU内部寄存器与外部存储单元之间的数据传送。本节介绍内部数据传送指令。CPU与外部进行数据交换的装入(LOAD)与存储(STORE)指令将在下一节介绍。MOV16/32InternalregistertransferMOV{S}<c><Rd>,#<const>Rd←constMOV{S}<c><Rd>,<Rm>{,<shift>}Rd←shift(Rm)第三章CortexM3指令系统---内部数据传输指令(2)MVN数据非传送指令MVN指令将操作数“#<const>”、“<Rm>”、或“<Rm>,<shift>”取反后送目的操作数“Rd”。MVN16/32Logicalcomplementto1MVN{S}<c><Rd>,#<const>Rd←NOT(const)MVN{S}<c><Rd>,<Rm>{,<shift>}Rd←NOT(shift(Rm))(3)MOVT指令MOVT16/32Allocationofthe16MSBbitsofaregisterMOVT<c><Rd>,#<imm16>Rd[16:31]←imm16MOVT指令将一个16位的立即数送目的寄存器“Rd”的高16位。MYPROJECTS2023/419_mov_mnv第三章CortexM3指令系统---内部数据传输指令(4)ADR指令ADR指令将标号(非变量)的地址送目的寄存器Rd。需要说明的是,操作数“<label>”为立即数寻址方式,标号距离当前指令不能超过1024个字节,大于1024在指令中将无法编码,而且标号地址必须是4的整数倍,所以使用起来限制比较多,可以尽量不用。与通过文字池实现指令标号传送的LDR指令不同(详见3.2.1节),ADR指令不需要像LDR那样访问位于存储单元的文字池,操作数直接在指令中获取,因此属于内部数据传送指令。ADR16/32LoadingofCODEADdRessADR<c><Rd>,<label>Rd←Labeladdress举例说明:ADR后面的标号被作为立即数放到指令中,直接从指令中得到送寄存器LDR后面的标号地址放到文字池里头,通过文字池得到后送寄存器第三章CortexM3指令系统---内部数据传输指令上面代码实现将变量X1中的5个元素值相加,结果存放在变量X2中。指令LDRR0,=X1和LDRR0,=deadloop都需要访问文字池,得到变量X1的地址和标号deadloop所在的地址送寄存器R0;指令ADRR1,deadloop与LDRR0,=deadloop功能都是把标号deadloop的地址送R0,但它们实现的途径是不同的。需要说明的是,获取标号deadloop的两条指令LDR R0,=deadloop和ADR R0,deadloop在程序中是没有起到任何作用的,只是为了举例说明问题。 EXPORTmycode AREA ADDCODE,CODE,READONLYmycode LDR R0,=X1 LDR R0,=deadloop ADR R0,deadlooploop1

LDR R3,[R0],#4 ADD R2,R2,R3 SUBS R1,R1,#1 BNE loop1 LDR R0,=X2 STR R2,[R0] deadloop B deadlo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论