回顾第六章ARM基本指令集与寻址介绍6.1指令集的特征与功能6.2ARM寻址方式6.3ARM指令集编码格式6.4Thumb指令集6.1指令集的特征与功能1指令概念机器指令(machineinstruction)指令集(InstructionSet)2.机器指令要素每一个机器指令必须包含CPU执行所需的全部信息取指令指令地址计算指令译码操作数地址计算数据操作操作数地址计算取操作数存操作数指令完成取下一条多操作数多结果CPU访问存储器或I/OCPU内部操作2.机器指令要素操作码(opcode)源操作数引用结果操作数引用下一指令引用做何操作?对谁做此操作?如何寻找被操作数据的寄存器或存储器位置?完成后到哪里去取下一个操作?3.机器指令的表示方法—指令格式指令格式有多种表示形式:定长,变长,混合长度对于32位RISC处理器,一般采用定长格式的32位二进制码。4.机器指令的表示方法采用符号表示法来描述机器指令e.g.ADD,SUB,Load,Store。由编译器完成符号→二进制的转换5.指令类型指令集必须充分,应允许用户表达任何处理任务,可以表示任何高级语言的指令形式。E.g.一行简单程序:X=X+Y设:X的内存位置513;Y的内存位置514;1.将内存513位置的值放入寄存器reg_x;Load2.将内存514的值放到另一寄存器reg_y;Load3.将reg_y加到reg_x,将结果放入reg_x;ADD4.将结果值存入内存513位置;Store典型分类指令举例数据传送Load,Store,Push,Pop算术Add,Sub,Mul,Div逻辑AND,OR,NOT,ShiftI/ORead,Write系统控制SWI(软中断),BKPT控制传递Jump,Return,NOP,6.指令类型的基本分类7.指令集设计的关键环节指令集设计是计算机设计最有影响的方面基本设计出发点操作指令表数据类型指令格式寄存器寻址方式应提供多少和怎样的操作?对几种数据类型完成操作?8位字节?32位字?64位双字?指令位长度,地址数目,各字段大小CPU寄存器数目以及其用途指定操作数产生的方式8.操作数类型地址无符号整数32位数值整数或定点数浮点数十进制数BCD(BinaryCodedDecimal)字符ASCII码逻辑数据9.操作类型典型分类CPU动作指令举例数据传送传送数据到另一个位置Load,Store,Push,Pop算术ALU内完成功能设置条件代码和标志Add,Sub,Mul,Div逻辑同算术指令AND,OR,NOT,ShiftI/O向I/O模块发出命令Read,Write系统控制特权指令,保留给操作系统使用SWI(软中断),BKPT控制传递修改PC,以完成程序调用/返回,管理参数传送Jump,Return,NOP,10.汇编语言-举例用机器语言编程语句N=I+J+K6.2ARM寻址方式6.2.1寻址方式1.寻址方式的考虑为什么要采用多种寻址方式?基本寻址方式:立即寻址直接寻址间接寻址寄存器寻址寄存器间接寻址偏移寻址堆栈寻址2.RISC体系采用的指令集结构ISA有两种ISA:Register-memoryRegister-RegisterRISC采用Register-Regiter(Load-Store)6.2.2ARM处理器的寻址方式1.立即寻址操作数直接通过指令给出,数据包含在32位指令编码中。32位有效立即数通过循环右移偶数位而间接得到举例ADDR0,R0,#1ANDR8,R7,#0xFFMOVR1,#0x000128002.寄存器寻址利用寄存器中的数值作为操作数,指令中的地址码给出的是寄存器名第二操作数位寄存器型时,可以选择对第二操作数进行移位举例ADDR0,R1,R2ADDR3,R2,R1,LSR#2ADDR3,R2,R1,LSRR4LSL,LSR,ASL,ASR,ROR,RRX3.寄存器间接寻址ARM的数据传送指令都是基于寄存器间接寻址,通过Load/Store完成对数据的操作。举例LDRR0,[R1]STRR0,[R1]R0←mem32[R1]R0→mem32[R1]4.基址加偏址寻址(变址寻址)将基址寄存器的内容与指令中给出的偏移量相加,形成存储器的有效地址,用于访问基址附近的存储器单元。偏移量不超过4KB(指令编码中Offset为12位)前变址,后变址,自动变址三种模式寄存器间接寻址实际是偏移量为0的基址加偏址寻址举例LDRR0,[R1,#4]LDRR0,[R1,#4]!LDRR0,[R1],#4LDRR0,[R1,R2]LDRR0,[R1,R2,LSL,#2]LDRBR0,[R1]LDRHR1,[R0,#20]前变址:R0←Mem32[R1+4];自动变址:R0←Mem32[R1+4];R1←R1+4后变址:R0←Mem32[R1];R1←R1+4;字节传送:R0←Mem8[R1]半字传送:R1←Mem16[R0+20]5.堆栈寻址Stack是用于保存数据的一块连续内存,按照FIFO或FILO顺序存取指向堆栈的地址寄存器成为堆栈指针(SP)对堆栈的访问通过堆栈指针R13指向堆栈区域来实现举例STMFDSP!{R1-R7,LR}LDMFDSP!{R1-R7,LR}6.块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式,可以把内存中的数据块加载到多个寄存器中去。LDM/STM根据其后缀名,其寻址方式有所不同LDM/STM的后缀选择举例STMIAR9!,(R0,R1,R5)STMIBR9!,(R0,R1,R5)STMDAR9!,(R0,R1,R5)STMDBR9!,(R0,R1,R5)7.相对寻址可以认为是基址为PC的变址寻址,偏移量给出了目的地址于现行指令之间的相对位置。举例BLSUBR。。。。。。SUBRMOVPC,R14子程序入口地址返回转移到SUBR小结6.3ARM指令集编码与格式1.ARM指令分类分类指令指令列举数据处理ADD、ADC、SUB、RSB、SBC;MOV、MVN;AND、ORR、EOR、BIC;CMP、CMN;TST、TEQ;MUL、MLA、UMULL、UMLAL、SMULL、SMLAL数据传送LDR、STR(单寄存器存取);LDM、STM(多寄存器存取);SWP(信号量)状态寄存器访问MRS、MSR分支指令B、BL;BX、BLX;异常产生SWI(软中断产生);BKPT(断点指令);协处理器CDP;LDC、STC;MCR、MRC;2.ARM指令编码ARM指令编码格式ARM条件编码格式3.基本指令格式opcode{cond}{S}Rd,Rn{,operand2}指令助记符可选条件码;指令执行条件可选后缀,可根据指令结果更新CPSR条件码Rd:目标寄存器;Rn:第一操作数寄存器第2操作数3.基本指令格式举例LDRR0,[R1]BEQDATAEVENADDSR2,R1,#1SUBNESR2,R1,#0x20读取R1地址上的内容,执行条件AL(总是)条件执行分支指令,执行条件EQ,即相等则跳转加法指令:R2←R1+1;影响CPSR的标志位条件执行减法:R2←R1-0x20;执行条件NE,影响CPSR的标志位NZCV……IFTM4M3M2M1M04.数据处理指令数据处理1.算术运算指令ADD、SUB、ADC、SBC、RSB、RSC;2.逻辑运算指令AND、ORR、EOR、BIC;3.比较指令CMP、CMN;4.测试指令TST、TEQ;5.乘法指令MUL、MLA、UMULL、UMLAL、SMULL、SMLAL6.数据传送指令MOV、MVN;4.1乘法指令完成2个寄存器的数据相乘。按照结果位宽可分成两类:64位结果;仅保留最低有效32位。2种类型都有“乘-累加”变形,即将成绩连续相加成总和,且适用于无符号和有符号数乘法指令举例MUL、乘(32位结果)Rd←(Rm*Rs)[31:0]MLA、乘-累加(32位结果)Rd←(Rm*Rs+Rn)[31:0]UMULL、无符号数长乘RdHi:RdLo←Rn*RsUMLAL、无符号数长乘-累加RdHi:RdLo+=Rn*RsSMULL、符号数长乘RdHi:RdLo←Rn*RsSMLAL符号数长乘-累加RdHi:RdLo+=Rn*Rs4.2Load/Store指令ARM处理器是Load/Store型的。将数据从存储器中调入寄存器中进行处理;处理完成后经过寄存器将结果存回到存储器中I/O功能是通过存储器映射的可循之外围寄存器和终端输入的组合来实现。在存储器映射系统中,外设中的寄存器被映射为存储器的地址,对这些寄存器的操作方法与对存储器的操作相同处理器对外设的操作也是适用Load/Store指令通过类似存储器操作来完成。4.2.1单寄存器存取指令LDR/STR传送的数据可以是8位字节、16位半字或32位字可以适用7种寻址方式;可以适用自动变址寻址方式(硬件支持)指令格式前变址:LDR|STR{cond}{B}Rd,[Rn,offset]{!}后变址LDR|STR{cond}{B}{T}Rd,[Rn],offset相对PC变址LDR|STR{cond}{B}Rd,LABELB表示传送无符号字节还是字。缺省B=0为传送字T标志位只能在非用户模式即特权模式下使用。作用是选择用户角度的存储器变换系统LDR/STR举例4.2.2多寄存器存取指令LDM/STM可用一条指令将16个可见寄存器的任意子集存储到内存或者相反。寻址模式受到限制LDM/STM的两种用途可允许OS加载或存储用户模式寄存器来保护和恢复用户处理状态(保存作业现场);可作为异常处理返回的一部分,完成从SPSR中恢复CPSR。多寄存器存取指令形式指令举例4.3状态寄存器与GPRs之间的传送MSR/MRSPSW到GPRs的传送指令MRS;GPRs到PSW的传送指令MSR;修改PSW一般是通过“读-修改-写”3个步骤来完成。不能通过该指令直接修改CPSR中的T位直接将程序状态切换到Thumb状态,而是必须通过BX指令完成状态切换。4.4异常中断产生指令SWI指令用于产生SWI异常中断,可以实现在用户模式下对OS中特权模式的程序调用。SWI代表“软件中断”,用户可通过其调用系统例程,又被称为监控调用。它将处理器至于SVC监控模式,从0x08开始执行指令。指令格式与举例BKPT用于产生软件断点,供调试程序使用。用于软件调试,使处理器停止执行正常指令而进入相应的调试程序。6.4Thumb指令1.Thumb指令编码格式2.Thumb指令集特点16位指令编码压缩指令,在ARM的Pipeline中先动态解压,再作为标准32位ARM指令执行CPSR[5]位T决定指令流类型:T=1则Thumb;Thumb指令集没有协处理器、信号量、乘加、64位乘、状态寄存器等指令;指令均为无条件执行,只有B指令除外;采用2地址格式的数据处理指令;NZCV……IFTM4M3M2M1M0Thumb指令使用:Thumb指令功能受限,除非有严格的指令空间的要求,一般很少使用。小结10.汇编语言-举例用机器语言编程语句N=I+J+K假设:I,J,K变量初始化为2,3,4;N,I,J,K4个变量的存储位置从0x201处开始;程序从位置0x101处开始,由4条指令组成:将位置201的内容装入AC;将位置202的内容加到AC;将位置203的内容加到AC;将AC的内容存入位置204;8.汇编语言-举例地址内容10100100010000000011020001001000000010103000100100000001110400110010000001002010000000000000010202000000000000001120300000