




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、ARM指令集概述2、ARM指令的寻址方式3、ARM指令简介4、Thumb指令简介RISC简介ARM状态和Thumb状态ARM9指令类型和指令的条件域RISC是计算机中央处理器的一种设计模式全称Reduced Instruction Set Computer,中文称为精简指令集计算机RISC选取使用最为频繁的简单指令及部分复杂指令,而且指令等长,通常指令为16位或32位从v4版本开始,ARM引入了Thumb指令集Thumb指令为16位,能完成的功能是32位ARM指令的子集ARM处理器支持两种运行状态 ARM状态 Thumb状态 ARM指令必须在ARM状态下执行 Thumb指令也必须处于Thu
2、mb状态下执行必须使用ARM指令的情况 ARM处理器启动的第一句指令必须是ARM指令 访问程序状态寄存器CPSR或协处理器时必须是ARM指令 ARM在处理异常中断时会自动切换到ARM状态,执行中断处理程序入口处的程序。返回时,会再次自动切换到ARM状态ARM指令v4版本中的函数调用,如果不需要进行状态切换,只需要用到BL指令就可以实现了如果需要进行状态切换,情况较复杂,如图3-1所示不同状态间的函数调用ARM v5版本后,引入了一条新的指令BLX,结合了BL和BX指令各自的功能特点,使得上图的所示过程通过一条指令就能实现ARM指令集属于加载/存储型指令 指令的操作数都储存在寄存器中,处理结果直
3、接放回到目的寄存器中ARM9指令集可以分为6类 跳转指令 数据处理指令 存储器访问指令 协处理器指令 杂项指令 饱和算术指令跳转指令数据处理指令存储器访问指令协处理器指令杂项指令饱和算术指令ARM指令一般由操作码、目的寄存器、操作数几部分组成,并可以配合条件码,S后缀等可选项目,以完成更复杂操作,它的格式一般为: 指令中内的项目是必需的,比如opcode, Rd, Rn等,内的项目是可选的S , , opcode操作码,即指令助记符,如BL,ADDcond条件码,描述指令执行的条件,在下文会有详细介绍S可选后缀,若在指令后加上“S”,在指令完毕后会自动更新CPSR中条件码标志位的值RdARM指
4、令中的目标操作数总是一个寄存器,通常用Rd表示Rn存放第1操作数的寄存器opcode2第2操作数,它的使用非常灵活,不仅可以是寄存器,还能使用立即数,而且能够使用经过位移运算的寄存器和立即数,这在下文也会介绍。表3-1 ARM指令格式ARM指令集几乎每条指令(除了某些v5T指令)都可以是条件执行的。指令的最高4位31:28称为条件码:AMR指令条件码助记符描述CPSR条件码标志位的值0000EQ相等,运行结果为0Z置位0001NE不相等,运行结果不为0Z清零0010CS/HS无符号数大于等于C置位0011CC/LO无符号数小于C清零0100MI负数N置位0101PL非负数N清零0110VS上溢
5、出V置位0111VC没有上溢出V清零1000HI无符号数大于C置位且Z清零1001LS无符号数小于等于C清零且Z置位1010GE带符号数大于等于N=V1011LT带符号数小于N!=V1100GT带符号数大于Z清零且N=V1101LE带符号数小于等于Z置位且N!=V1110AL无条件执行 1111系统保留 形式非常灵活,共有11种形式:语法含义#立即数寻址寄存器寻址, LSL #立即数逻辑左移, LSL 寄存器逻辑左移, LSR #立即数逻辑右移, LSR 寄存器逻辑右移, ASR #立即数算术右移, ASR 寄存器算术右移, ROR #立即数循环右移, ROR 寄存器循环右移, RRX寄存器扩
6、展循环右移ARM指令集有5种形式的位移操作 LSL逻辑左移 LSR逻辑右移 ASR算术右移ROR循环右移 RRX带扩展的循环右移逻辑左移(Logical Shift Left):操作时在移位操作时,用0补足低位;而逻辑右移(Logical Shift Right)移动的方向相反,并用0补足高位。算术右移(Arithmetic Shift Right):在移位操作时,根据符号位来补足高位,若原数符号位是1,即当原数为负数时,移位空出的高位都用1补足,反之则用0补足。循环右移(ROtate Right):可以将数字看做首位相接的“环形”,当最低位被移出后,它会绕到数组的最高位去,继续参与移位操作。
7、带扩展的循环右移(Rotate Right one bit with eXtended):较前面的几种移位方法复杂一些,它需要用到CPSR中的C位。当最低位被向右移出后,最高位有C位的值补足,然后被移出的最低位被放到C位中。立即数#并不是任意数都是合法的,在立即数寻址中,分配给立即数的空间是12位,8位用于保存一个常数,4位用于保存循环右移基数,而循环右移每次需要移动偶数位,即右移的位数是基数*2。假设常数为A,循环右移位数为N,则最后得到的立即数=A循环右移(N*2位)。0 x3FC立即数合法,A=0b11111111,N=0d150 x1FE不合法立即寻址寄存器寻址寄存器偏移寻址寄存器间接
8、寻址基址变址寻址多寄存器寻址堆栈寻址相对寻址立即寻址 立即寻址也可被称为立即数寻址,读取指令后可以立即得到操作数,而不需要去物理内存得到相应内容。这个给出的操作数叫立即数,它一般以“#”为前缀,“#0 x”、“#0d”,“#0b”开头的计数用来表示十六进制,十进制和二进制。ADD R1, R1, #0 x1 ; R1- R1+ 1寄存器寻址 寄存器寻址也是一种不需要访问存储器内容的寻址方式,指令中直接指明操作数所在的寄存器,执行时处理器直接访问寄存器获取操作数ADD R1, R1, R2 ; R1- R1+ R2 MOV R1, R0; R1- R0寄存器偏移寻址 寄存器偏移寻址是ARM指令特
9、有的一种寻址方式,第2操作数可以在与第1操作数结合之前,进行各种形式的移位操作ADD R1, R1, R2 , ROR #0 x2; R2循环右移两位后与R1相加,结果放入R1 MOV R1, R0, LSL R2; R0逻辑左移R2位后放入R1中寄存器间接寻址 寄存器间接寻址的指令中虽然也是指定寄存器,但并不是直接拿寄存器中的值来进行运算操作,此时寄存器中储存的是地址,处理器需要根据这个地址从存储器中获取操作数。所以寄存器间接寻址是需要进行存储器访问的,所以执行效率比寄存器寻址要慢。STR R1, R2; 将R1的值存入以R2内容为地址的存储器中 SWP R1, R1, R2; 交换以R2为
10、地址的存储器内容和R1内容基址变址寻址 基址变址寻址与寄存器间接寻址相似,但此时从寄存器取出的内容需要加上指令所给定的偏移量,这样才构成操作数的有效地址。变址寻址方式通常用于访问基地址附近的地址单元,常用于查表,数组操作,功能部件寄存器访问等op Rd, Rn, R1 op Rd, Rn, FlexOffsetop Rd, Rn, FlexOffset!op Rd, Rn, FlexOffset多寄存器寻址 多寄存器寻址方式可以在同一条指令中完成多个寄存器数据的传送,最多可以传送16个通用寄存器LDMIA R0, R1, R2, R3, R4, R5 ; R1- R0, R2- R0+4, ,
11、 R5-R0+16STMIA R0, R2-R5, R7; R0-R2, R0+4-R3, , R0+12-R5, R0+16-R7堆栈寻址 堆栈是一个后进先出的数据结构,堆栈寻址方式会有一个指针,始终指向存储单元的栈顶,这个指针需要用一个专门的寄存器来存放,这个寄存器一般是R13。有四种栈堆形式: 堆栈指针总是指向最后压入堆栈的数据,称为满堆栈(Full Stack) 堆栈指针指向下一个空位置时,称为空堆栈(Empty Stack) 从低地址向高地址生长的堆栈叫递增堆栈(Ascending Stack) 从高地址向低地址生长的堆栈叫递减堆栈(Descending Stack)STMFD SP
12、!, R1-R7, LR ; 将R1-R7,LR存放到堆栈中,这条指令一般用来保护现场相对寻址 相对寻址可以看作是寄存器变址寻址方式的一个特例,因为此时包含基地址的寄存器特指程序计数器PC,通过PC值与指令中的偏移量结合,生成有效的操作数地址。一般这种寻址方式用于指令跳转BL Label; 转跳到Label标签处.Label: ARM转跳指令主要用于: 向后跳转实现循环; 通过条件判断实现现在跳转; 子程序调用;切换处理器工作状态。ARM实现程序跳转有两种方法 将当前的程序寄存器PC值改写为跳转的目的地址,此时可以实现4G地址范围内的长跳转。 使用专门的跳转指令实现,包括B、BL、BX和BLX
13、指令等MOV PC, #immediate; PC- immediateLDR PC, PC, #offset; PC- PC+offsetBcond, LabelARM的通用数据处理指令大致可以分为4类 数据传送指令 算术逻辑运算指令 比较指令 前导零计数指令数据传送数据传送指令指令 MOV(MOVE)MOV(MOVE)和和MVN(MOVE NOTMVN(MOVE NOT) )格式格式为为 MOV指令将Operand2的值复制到Rd寄存器中,而MVN指令会先将Operand2按位取反后再复制到Rd寄存器中。举例举例MOVcondS Rd, Operand2MVNcondS Rd, Opera
14、nd2MOVS R0, R0, ASR R2MVNNE R1 #0 x22算术逻辑运算指令 ADD和ADC,SUB和SBC,RSB和RSC 这三组指令分别是加法指令,减法指令,逆向减法指令及其各自的带进位操作指令格式格式为为举例举例opcondS Rd, Rn, Operand2ADDS R6, R0, R3ADCS R7, R1, R4ADC R8, R2, R5算术逻辑运算指令 ANDAND,ORRORR,EOREOR,BICBIC 这四条指令分别是逻辑与指令,逻辑或指令,逻辑异或指令和位清除指令格式格式为为举例举例opcondS Rd, Rn, Operand2EOR R0, R1, #
15、0 xFF00ORR R1, R2, R4, LSR #2BICNES R5, R6, R1, RRX比较指令 TSTTST和和TEQTEQ 位测试指令和相等测试指令格式格式为为举例举例TSTcond Rn, Operand2TEQcond Rn, Operand2TST R1, #0 x0FTEQNE R9, #0 x4000比较指令 CMP和CMN 比较指令和反值比较指令格式格式为为举例举例CMPcond Rn, Operand2CMNcond Rn, Operand2CMPLT R4, R2CMN R13, R5, LSL #4前导零计数指令 CLZCLZ 前导零计数指令,它是从v5版本
16、开始引入的格式格式为为该指令从Rm寄存器值的高位开始计数(32位的数据即从31开始),直到遇到第一个非零位为止,统计总共前导零的个数,并将统计值存入Rd中。CLZcond Rd, RmMUL和MLA MUL和MLA指令是32的乘法指令和乘加指令格式格式为为举例举例MULcondS Rd, Rm, RsMLAcondS Rd, Rm, Rs, RnMULLT R7, R7, R8MLA R3, R2, R4, R6UMULL,UMLAL,SMULL和SMLAL 上述指令的U表示无符号,S表示带符号,L表示结果为长整型。所以上述指令分别叫做无符号长整型乘法指令,无符号长整型乘加指令,带符号长整型乘
17、法指令和带符号长整型乘加指令格式格式为为举例举例OpcondS RdLo, RdHi, Rm, RsUMULLS R1, R2, R3, R4UMLALNE R1, R2, R3, R1SMULL R5, R4, R3, R2SMULLLES R5, R3,R2, R1SMULxy和SMLAxy SMULxy指令和SMLAxy指令是16位的带符号乘法指令格式格式为为举例举例SMULcond Rd, Rm, RsSMLAcond Rd, Rm, Rs, RnSMULTT R1, R2, R3SMLABTEQ R2, R3, R4, R4SMULWySMULWy和和SMLAWySMLAWy 分别是
18、32*16位的带符号乘法指令和乘加指令格式格式为为举例举例SMULWcond Rd, Rm, RsSMLAWcond Rd, Rm, Rs, RnSMULWTVS R1, R2, R1SMLAWT R2, R2, R4, R4LDR和STR LDR和STR指令是单一数据加载和存储指令,LDR指令从内存读取数据装入寄存器中,STR指令将寄存器中的数据存入内存。格式格式为为举例举例opcondBT Rd, RnopcondB Rd, Rn, FlexOffset!opcondB Rd, labelopcondBT Rd, Rn, FlexOffsetLDR R0, R1STRT R2, R0, R
19、3, LSL #0 x2!LDRB R4, R8, #0 x4LDM和STM 批量加载指令LDM将一片连续内存单元的数据加载到一组通用寄存器中,而批量存储指令STM将一组通用寄存器中的值存储到一片连续内存单元之中格式格式为为举例举例opcondmode Rn!, reglistLDMFA R5, R1, R3, R5, R7STMFD R13!, R0-R4, LR;将R0-R4及LR压入栈堆LDMFD R13!, R0-R4, PC;恢复R0-R4及PC,一般用于程序返回SWP(Swap) 交换指令SWP用于寄存器和存储器之间内容的交换,它将指定内存单元的数据存入目标寄存器,然后将源寄存器的
20、内容储存到该内存单元中格式格式为为举例举例SWPcondB Rd, Rm, RnSWPB R2, R3, R4;SWP R1, R1, R5; 将R1与R5指定的内存进行内容交换PLD 预读取PLD指令是ARMv5E版本引入的,它指示存储器系统在接下去的几条指令中很可能会有Load指令,存储系统以此做好相应的准备,从而加速内存访问过程格式格式为为举例举例PLD Rn, FlexOffsetPLD R2, #Label*5; Label*5在汇编时计算,范围应该在-4095到+4095PLD R3, R2, LSR #0 x2CDP和CDP2 CDP是协处理器数据处理指令(Coprocessor
21、 Data oPeration),用来执行特定的数据操作;CDP2是从ARMv5版本引进的格式格式为为举例举例CDPcond coproc, opcode1, CRd, CRn, CRm, opcode2CDP2 coproc, opcode1, CRd, CRn, CRm, opcode2CDP P3, 2, C12, C10, C3, 4; 完成协处理器P3的初始化CDP2 P6, 1, C3, C4, C5LDC和LDC2,STC和STC2 LDC指令将存储器内容复制到协处理器寄存器中,而STC指令则是将协处理器寄存器数据拷贝到存储器中。格式格式为为举例举例opcondL coproc,
22、 CRd, RnopcondL coproc, CRd, Rn, #-offset!opcondL coproc, CRd, Rn, #-offsetLDC P5, C2, R4, #0 x8!STC P6, C2, R3,#-0 x7MCR, MCR2MCR, MCR2和和MCRRMCRR MCR指令将ARM寄存器中的数据传输到协处理器寄存器中。MCR指令将ARM寄存器中的数据传输到协处理器寄存器中格式格式为为举例举例MCRcond coproc, opcode1, Rd, CRn, CRm, opcode2MCR2 coproc, opcode1, Rd, CRn, CRm, opcode
23、2MCRRcond coproc, opcode1, Rd, Rn, CRmMCR P7, 3, R1, C3, C2, 1; 将ARM寄存器R1的数据存入协处理器P7的寄存器C2,C3中MRC,MRC2和MRRC MRC指令的数据传输方向与MCR指令相反,它将协处理器寄存器中的数据传送到ARM处理器寄存器中。MRC2指令是从ARMv5版本引入的,而MRRC指令从ARMv5E版本引入格式为格式为举例举例MRCcond coproc, opcode1, Rd, CRn, CRm, opcode2MRC2 coproc, opcode1, Rd, CRn, CRm, opcode2MRRCcond
24、 coproc, opcode1, Rd, Rn, CRmMRC P4, 3, R1, C5, C6, 1; 将协处理器P4的寄存器数据传送到ARM处理器寄存器中SWI 软件中断指令SWI用来实现在用户模式下的程序调用管理模式下的代码,这条指令造成处理器模式的切换,CPSR会被存入管理模式下的SPSR,随后指令会跳转到中断向量。格式格式为为举例举例SWIcond immed_24SWI 0 x22222MRS和MSR 状态寄存器读取指令MRS(Move to ARM Register from Status register)和写状态寄存器指令MSR(Move to a Status regi
25、ster from ARM Register),用于在程序状态寄存器和ARM通用寄存器之间传输数据格式格式为为举例举例MRScond Rd, psrMSRcond _, #immed_8rMSRcond _, RmMSR R5, SPSRMSR CPSR_f, R7;更新状态寄存器的标志位BKPT ARMv5版本引入的断点指令,使用断点指令使ARM处理器进入Debug模式格式格式为为举例举例BKPT immed_16BKPT 0 xFF32BKPT 640QADD,QSUB,QDADD和QDSUB 饱和算术指令(saturating arithmetic instructions)在发生溢出时
26、,Q位会被置位,若结果小于231,返回的结果为231,若结果大于231 -1,则返回的结果为231 -1。因此如果在计算结束后目标寄存器保存了饱和数(231或231 -1)且Q置位,则说明程序发生了溢出。格式格式为为举例举例opcond Rd, Rm, RnQADD R3, R3, R2QDSUB R4, R3, R8ADR 小范围的地址读取伪指令,主要用来读取基于PC相对偏移的地址或基于寄存器相对偏移的地址。格式格式为为举例举例ADRcond register, exprSUB R2, PC, 0 xC; 相对PC偏移12个字节ADRLADRL 中等范围地址取指伪指令,它的取值范围比ADR要
27、大,通常会用两条指令来替代格式格式为为举例举例ADRcondL register, exprstart MOV R4, #0 x22ADR R2, start + 60000LDR 这里讲的是LDR伪指令,不是内存访问指令LDR。LDR伪指令是大范围地址读取伪指令,用于加载32位的立即数或是一个地址值格式格式为为举例举例LDRcond register, =expr | label-exprLDR R1, =0 xFF0LDR R2, =0 xFFFLDR R3, =placeThumb指令将32位ARM指令的一个子集进行编码,成为一个16位的指令集。相对于ARM指令集,Thumb指令拥有更高
28、的代码密度,这对于嵌入式设备来说至关重要。Thumb指令继承了ARM指令许多特点,它也是采用Load/Store结构,有数据处理、数据传送机流控制指令等。除了B指令外,Thumb指令都是无条件执行的,许多Thumb指令数据处理指令都是采用2地址格式,即目的寄存器和源寄存器相同,而大多数ARM数据处理指令采用3地址格式B B指令是Thumb指令中唯一可以条件执行的指令。格式格式为为举例举例Bcond labelBEQ labelB loopBL 带链接的长跳转格式格式为为举例举例BL labelBL section1BX BX指令在跳转的同时,会选择性的切换指令集格式举例BX RmBX R3BL
29、X BLX是带链接的跳转,并选择性的切换指令集。指令格式如下:格式举例BLX RmBLX labelBLX R4BLX armsubAND,ORR,EOR和BIC 这四条指令是按位逻辑运算指令,分别是按位与,按位或,按位异或和按位清零操作格式举例op Rd, RmORR R2, R3ASR,LSL, LSR和ROR 这四条指令是移位指令,分这四条指令是按位逻辑运算指令,分别是按位与,按位或,按位异或和按位清零操作格式举例op Rd, Rsop Rd, Rm, #exprASR R3, R5LSR R0, R3, #5LSL R1, R4, #0CMP和CMN 比较指令和反值比较指令格式举例CM
30、P Rn, #exprCMP Rn, RmCMN Rn, RmCMP R7, #255CMP R7, R12CMN R2, R3MOV,MVN和NEG格式:举例MOV Rd, #exprMOV Rd, RmMVN Rd, RmNEG Rd, RmMOV R3, #0MOV R0, R12;此时不更新标志位MVN R7, R1NEG R3, R3TST 位测试指令格式举例TST Rn, RmTST R3, R4低寄存器低寄存器 的的ADD和和SUB 低寄存器是指指令中使用的寄存器范围是R0-R7格式举例op Rd, Rn, Rmop Rd, Rn, #expr3op Rd, #expr8ADD R2, R3, R4SUB R1, R2, #33ADD R5, #244高寄存器或低寄存器的ADD 格式举例op Rd, RmADD R11, R3ADD R2,R3;此时和ADD R2, R2, R3等价ADD R3, R12sp的ADD和SUB 这两条指令将堆栈指针sp作为操作数,用来增加或减少sp格式举例ADD sp, #exprSUB sp, #exprADD sp #256SUB sp #vc+8pc或sp相关的ADD 这条指令将sp或pc的值加上或减去一个常量,并将结果存入低寄存器中格式举例ADD Rd, Rp, #e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 异面直线及其夹角性质课件
- 幼儿园三生教育教案
- 幼儿园如何开展值日生活动
- 中医诊断学-辨证-概说、八纲课件
- 房屋顶账协议书和合同
- 神明合同协议书
- 水田合同协议书范本
- 酒瓶合同协议书
- 外借合同协议书
- 厂房合同协议书乙方
- DB31T-人形机器人 分类分级应用指南
- 黑龙江省既有建筑改造工程消防设计指南(2024年版)
- 多尺度图像分析
- 中医文化主题班会
- 4.4.7.3 跟踪出站调车作业课件讲解
- 河南省开封市铁路中学2023-2024学年八年级下学期6月期末历史试题
- 第三单元 文明与家园 大单元教学设计-2023-2024学年部编版道德与法治九年级上册
- 泰康集团线上测评真题
- 超氧化物歧化酶课件
- 第四章-国防动员
- 设备管理培训课件-设备管理的战略规划
评论
0/150
提交评论