《嵌入式控制系统课件-第3章-2ARM7指令系统.ppt》由会员分享,可在线阅读,更多相关《嵌入式控制系统课件-第3章-2ARM7指令系统.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ARM指令目录1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.杂项指令8.伪指令13.1 指令集介绍nARM指令集乘法指令 ARM7TDMI具有三种乘法指令,分别为:3232位乘法指令;32 32位乘加指令;32 32位结果为64位的乘/乘加指令。2ARM指令乘法指令乘法指令编码64位有符号乘加指令SMLAL11164位有符号乘法指令SMULL11064位无符号乘加指令UMLAL10164位无符号乘法指令UMULL10032位乘加指令MLA00132位乘法指令MUL000说明指令助记符操作码opcode操作码功能表3助记符说明操作条件码位置MUL Rd
2、,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符号乘加指令(Rd
3、Lo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令4助记符说明操作条件码位置MUL MUL Rd,Rm,RsRd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,
4、Rm,Rs64位有符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 32位乘法指令MUL指令将Rm和Rs中的值相乘,结果的低32位保存到Rd中。Rd,Rm,Rs不能为R15。只影响CPSR中的N位和Z位。指令格式如下:MULcondS Rd,Rm,Rs 应用示例:MUL R1,R2,R3 ;R1=R2R3 MULS R0,R3,R7 ;R0=R3R7,影响CPSR中的N位和Z位 5助记符说明操作条件码位置MUL Rd,Rm,
5、Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA MLA Rd,Rm,Rs,RnRd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64
6、位有符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 32位乘加指令MLA指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的低32位保存到Rd中。Rd,Rm,Rs,Rn不能为R15。只影响CPSR中的N位和Z位。指令格式如下:MLAcondS Rd,Rm,Rs,Rn 应用示例:MLA R1,R2,R3,R0;R1=R2R3+R06助记符说明操作条件码位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondS
7、UMULL UMULL RdLo,RdHi,Rm,RsRdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 64位无符号乘法指令UMULL指
8、令将Rm和Rs中的值作无符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。RdLo/Hi,Rm,Rs不能为R15。RdLo/Hi,Rm必须是不同的寄存器。只影响CPSR中的N位和Z位。指令格式如下:UMULLcondS RdLo,RdHi,Rm,Rs 应用示例:UMULL R0,R1,R5,R8;(R1、R0)=R5R8 7助记符说明操作条件码位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符
9、号乘法指令(RdLo,RdHi)Rm*Rs UMULLcondSUMLAL UMLAL RdLo,RdHi,Rm,RsRdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 64位无符号乘加指令UMLAL指令将Rm和Rs中的值作无符号数相乘,64位乘积与Rd
10、Hi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。RdLo/Hi,Rm,Rs不能为R15。RdLo/Hi,Rm必须是不同的寄存器。只影响CPSR中的N位和Z位。指令格式如下:UMLALcondS RdLo,RdHi,Rm,Rs 应用示例:UMLAL R0,R1,R5,R8;(R1、R0)=R5R8+(R1、R0)8助记符说明操作条件码位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号
11、乘法指令(RdLo,RdHi)Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL SMULL RdLo,RdHi,Rm,RsRdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 64位有符号乘法指令SMULL指令将Rm和Rs中的值作有符号数相乘,结果的低32位保存
12、到RdLo中,而高32位保存到RdHi中。RdLo/Hi,Rm,Rs不能为R15。RdLo/Hi,Rm必须是不同的寄存器。只影响CPSR中的N位和Z位。指令格式如下:SMULLcondS RdLo,RdHi,Rm,Rs 应用示例:SMULLR2,R3,R7,R6;(R3、R2)=R7R6 9助记符说明操作条件码位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*Rs UMULLc
13、ondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL SMLAL RdLo,RdHi,Rm,RsRdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 64位有符号乘加指令SMLAL指令将Rm和Rs中的值作有符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高
14、32位保存到RdHi中。RdLo/Hi,Rm,Rs不能为R15。RdLo/Hi,Rm必须是不同的寄存器。只影响CPSR中的N位和Z位。指令格式如下:SMLALcondS RdLo,RdHi,Rm,Rs 应用示例:SMLALR2,R3,R7,R6;(R3、R2)=R7R6+(R3、R2)10ARM指令目录1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.杂项指令8.伪指令113.1 指令集介绍nARM指令集分支指令 在ARM中有两种方式可以实现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向PC寄存器赋值实现跳转。分支指令有以下三种:分支指令B;带
15、链接的分支指令BL;带状态切换的分支指令BX。12助记符说明操作条件码位置B label分支指令PClabelBcondBL label带链接的分支指令LRPC,PClabelBLcondBX Rm带状态切换的分支指令PCRm,切换处理器状态BXcondARM指令分支指令13助记符说明操作条件码位置B labelB label分支指令PClabelBcondBL label带链接的分支指令LRPC,PClabelBLcondBX Rm带状态切换的分支指令PCRm,切换处理器状态BXcondARM指令分支指令 分支指令B指令,该指令跳转范围限制在当前指令的32M字节地址内(ARM指令为字对齐,最
16、低2位地址固定为0)。指令格式如下:Bcond Label 应用示例:B WAITA;跳转到WAITA标号处 B0 x1234;跳转到绝对地址0 x1234处 14BL LabelxxxxxxLabelxxxMOV PC,LRAddr1Addr2xxxxxxLRPC助记符说明操作条件码位置B label分支指令PClabelBcondBL labelBL label带链接的分支指令LRPC,PClabelBLcondBX Rm带状态切换的分支指令PCRm,切换处理器状态BXcondARM指令分支指令 带链接的分支指令BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR
17、)连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的32M字节地址内。指令格式如下:BLcond LabelAddr1LabelAddr2Addr21.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC)2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行 应用示例(调用子程序):BL Label15助记符说明操作条件码位置B label分支指令PClabelBcondBL label带链接的分支指令LRPC,PClabelBLcondBX BX RmRm带状态切换
18、的分支指令PCRm,切换处理器状态BXcondARM指令分支指令 带状态切换的分支指令BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的32M字节地址内。指令格式如下:BXcond Rm跳转地址Rm0跳转后CPSR标志T位处理器状态00ARM11Thumb16助记符说明操作条件码位置B label分支指令PClabelBcondBL label带链接的分支指令LRPC-4,PClabelBLcondBX BX RmRm带状态切换的分支指令PCRm,切换处理器状态BXcondARM指令分支指令 Rm的位0不用作地址的一部分。若Rm的位0为1,则指令将CP
19、SR中的标志T置位,且将目标地址的代码解释为Thumb代码。应用示例:ADRL R0,ThumbFun+1 ;将Thumb程序的入口地址加1存入R0 BX R0 ;跳转到R0指定的地址,;并根据R0的最低位来切换处理器状态17ARM指令目录1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.杂项指令8.伪指令183.1 指令集介绍nARM指令集杂项指令 ARM指令集中有三条指令作为杂项指令,在实际应用中这三条指令非常重要。它们如下所示:助记符说明操作条件码位置SWI immed_24软中断指令产生软中断,处理器进入管理模式SWIcondMRS Rd,psr
20、读状态寄存器指令Rdpsr,psr为CPSR或SPSRMRScondMSR psr_fields,Rd/#immed_8r写状态寄存器指令psr_fieldsRd/#immed_8r,psr为CPSR或SPSRMSRcond19ARM杂项指令软中断指令 SWI指令用于产生SWI异常,使得CPU模式变换到管理模式,并且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。不影响条件码标志。该指令主要用于用户程序调用操作系统的系统服务,操作系统在SWI异常处理程序中进行相应的系统服务。20ARM杂项指令软中断指令 根据SWI指令传递的参数SWI异常处理程序可以做出相应的处理。,指令中
21、的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。MOV R0,#34;设置子功能号为34 SWI 12;调用12号软中断 21ARM杂项指令状态寄存器读指令 在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。该指令不影响条件码。22ARM杂项指令状态寄存器读指令 在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。MRScond Rd,ps
22、rMRS指令格式 应用示例:MRS R1,CPSR;将CPSR状态寄存器读取,保存到R1中 MRS R2,SPSR;将SPSR状态寄存器读取,保存到R2中23ARM杂项指令状态寄存器写指令 在ARM处理器中,只有MSR指令与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。MSRcond psr_fields,#immed_8rMSR指令格式1MSRcond psr_fields,RmMSR指令格式2指令执行的条件码CPSR或SPSR指定传送的区域,可以为以下字母(必须小写)的一个或者组合:c 控制域屏蔽字节(psr7
23、.0)x 扩展域屏蔽字节(psr15.8)s 状态域屏蔽字节(psr23.16)f 标志域屏蔽字节(psr31.24)保存要传送到状态寄存器指定域数据的源寄存器要传送到状态寄存器指定域的立即数24(1)(2)(3)(4)ARM杂项指令状态寄存器写指令 在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。应用示例1:;子程序:使能IRQ中断ENABLE_IRQ MRS R0,CPSR BIC R0,R0,#0 x80 MSR CPSR_c,R0
24、 MOV PC,LR 应用示例2:;子程序:禁能IRQ中断DISABLE_IRQ MRS R0,CPSR ORR R0,R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 1.将CPSR寄存器内容读出到R0;2.修改对应于CPSR中的I控制位;3.将修改后的值写回 CPSR寄存器的对应控制域;4.返回上一层函数;25ARM指令目录1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.杂项指令8.伪指令263.1 指令集介绍nARM伪指令 ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令一样使用,但在编
25、译时这些指令将被等效的一条或多条ARM指令所代替。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。27ARM伪指令小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能。ADRcond register,exprADR伪指令格式指令执行的条件码加载的目标寄存器地址表达式 地址表达式expr的取指范围:当地址值是字对齐时,其取指范围为-255255;当地址值是字节对齐时,其取指范围为
26、-10201020;28ARM伪指令小范围的地址读取 .ADRL R0,Delay .Delay MOV R0,r14 .应用示例(源程序):.0 x20 ADD r0,pc,#0 x3c .0 x64 MOV r0,r14 .编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADR伪指令被汇编成一条指令29ARM伪指令小范围的地址读取 应用示例2(查表):ADR R0,DISP_TAB;加载转换表地址 LDRB R1,R0,R2;使用R2作为参数,进行查表 DISP_TAB DCB 0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF83
27、0ARM伪指令中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。ADRLcond register,exprADRL伪指令格式指令执行的条件码加载的目标寄存器地址表达式 地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-64K64K;当地址值是字对齐时,其取指范围为-256K256K;31ARM伪指令中等范围的地址读取 .ADRL R0,Delay .Delay MOV R0
28、,r14 .应用示例(源程序):.0 x20 ADD r0,pc,#400 x24 ADD r0,r0,#FF00 .0 xFF68 MOV r0,r14 .编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADRL伪指令被汇编成两条指令32ARM伪指令大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则使用一条程序相对偏移的LDR指令读出常量。LDRcond register,=expr|label_ex
29、prLDR伪指令格式指令执行的条件码加载的目标寄存器基于PC的地址表达式或外部表达式注意:1.指令位置的偏移量必须小于4KB;2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。33ARM伪指令大范围的地址读取应用示例(加载地址):编译后的反汇编代码:.LDR R1,=InitStack .InitStack MOV R0,LR .0 x60 LDR R1,0 xb4 .0 x64 MOV R0,LR .0 xb4 DCD 0 x64使用伪指令将程序标号InitStack的地址存入R1LDR伪指令被汇编成一条LDR指令,并 定 义 了 一 个 常 量,该 常 量 为InitStack
30、标号的地址34ARM伪指令空操作伪指令 NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOV R0,R0”指令等。NOP可用于延时操作。NOPNOP伪指令格式应用示例(延时子程序):mov R1,#0 x1234Delay NOP;空操作 NOP NOP SUBS R1,R1,#1;循环次数减一 BNE Delay;如果循环没有结束,跳转Delay继续 MOV PC,LR;子程序返回35编程编程 1.用ARM汇编指令实现的C赋值语句:x=(a+b)-c,在进行运算之前,代码必须先把a、b、c的值装入到寄存器,运算结束后,还要把x的值存回存储器中。2用ARM汇编指令实现的C语句:z=(a2)|(b&15)。3在ARM汇编指令中实现下面条件转移语句:if(ab)x=5;y=c+d;else x=c-d;36