ARM指令系统
- 格式:pdf
- 大小:425.57 KB
- 文档页数:39
第三章 ARM指令系统与ARM汇编程序设计内容:ARM 指令集概述,ARM 微处理器指令的分类,ARM 微处理器指令的条件域,ARM 微处理器指令的寻址方式及ARM指令集,ARM汇编程序设计。
§3.1 ARM 指令编码概述ARM指令集包含有:跳转指令、数据处理指令、程序状态寄存器传输指令、加载Load/存储Store指令、协处理器和异常中断指令,共6类。
采用RISC体系结构。
§3.1.1ARM指令的一般编码格式ARM指令长度为固定的32位,采用RISC体系结构。
一条典型的ARM指令编码格式如下:其中:cond: 指令执行的条件编码,多数指令可有条件执行[27:25]:指令类型及寻址方式编码,共有8种编码opcode:指令操作符编码S:决定指令的操作是否影响CPSR的值Rn: 包含第1个操作数的寄存器编码Rd:目标寄存器编码Shifter_operand:表示第2个操作数§3.1.2 典型的ARM 指令语法格式如下:<opcode> {<cond>}{S} <Rd>,<Rn>,<shifter_operand>其中:<opcode>:是指令助记符,如ADD 表示算术加法操作指令{<cond>}:表示指令执行的条件助记符,如EQ表示相等,它是可选项。
{S}:它决定指令的操作是否影响CPSR的值,是可选的后缀。
<Rd>:表示目标寄存器<Rn>:存放第1个操作数的寄存器<shifter_operand>:表示第2个操作数,有两种形式(即立即数型和寄存器型操作数)例如 MOV R2,#0x4 ;立即数0x4送到寄存器R2中ADD R0, R1, R2, ASR #2 ;“R2, ASR #2”表示第2个操作数LDR R0,[R1] ;读取[R1]地址上的存储器单元内容到R0§3.1.3 ARM指令的条件码域当处理器工作在ARM状态时,几乎所有的指令均可根据CPSR中条件码状态和指令的条件域决定是否执行该指令。
当条件满足时执行该指令,条件不满足时该指令被当作一条NOP指令,这时处理器进行判断中断请求等操作,然后转向下一条指令。
在ARM v5之前的版本中,所有的指令都是条件执行的,从ARMv5版本开始引入了一些必须的无条件执行。
ARM的指令编码中,每一条ARM指令码都有4位的条件码位,位于指令的最高4位[31:28]。
条件码共有16种,每种条件码可用助记符表示,这个助记符可以添加在指令码助记符的后面与指令同时使用。
例如,跳转指令B可以加上后缀EQ变为B EQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。
各个条件码的含义和助记符见下表所示。
能够根据条件执行的指令可以在其助记符的扩展域加上条件助记符,从而在特定条件下执行。
条件助记符是可选项。
例如:CMP R0,R1 ;比较R0和R1大小SUBGT R0,R0,R1 ;if (R0>R1) R0=R0-R1,否则 do nothingSUBLT R1,R1,R0 ;if (R0<R1) R1=R1-R0,否则 do nothing§3.2 ARM指令的寻址方式处理器指令寻址方式是指处理器根据指令中的地址信息寻找操作数物理地址的方式,ARM 处理器指令系统支持如下7种常见的寻址方式:立即寻址,寄存器寻址,寄存器间接寻址,基址变址寻址,多寄存器寻址,相对寻址,堆栈寻址。
1、立即寻址立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。
这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。
例如以下指令:ADD R0,R0,#1 ;R0←R0+1ADD R0,R0,#0x3f ;R0←R0+0x3f在以上两条指令中,第2个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”, 对于以二进制表示的立即数,还要求在“#”后加上“%”。
注:对ARM指令中的立即数,每个32位的立即数都是通过一个8位的常数循环右移偶数位而间接得到的。
立即数构造可表示为<immediate>=immed_8循环右移(2×rotate_imm) <immediate>表示立即数;immed_8表示指令有效编码中,表征立即数的8位常数;rotate_imm表示指令有效编码中,表征8位常数循环右移偶数位的系数(4位);2×rotate_imm表示指令有效编码中,表征8位常数循环右移位数的数值。
例如:32位立即数0xF200是由(CF2)经过处理器内部的换算机制得来的,是合法的。
(CF2是指令有效编码中的表征立即数的12位代码,F2指令有效编码中的表征立即数的8位常数,C 是指令有效编码中的表征8位常数循环右移偶数位的系数)。
同样立即数0x110000(可由0x811产生),0x12800(0xB4A产生)也是合法的。
不能通过上述方法构造的数址不能用作ARM指令的立即数。
例如:0x1010,0xFF1000,0x00102数是不合法的,因为它们不能通过上述算法得到。
2、寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。
例如以下指令:ADD R0,R1,R2 ;R0←R1+R2该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。
3、寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。
例如以下指令:LDR R0,[R1] ;R0←[R1]STR R0,[R1] ;[R1]←R0●第一条指令将以R1的值为地址的存储器中的数据加载到R0中。
●第二条指令将R0的值存入到以R1的数值为地址的存储器中。
注意:由于ARM指令集中对于存储器的访问只能通过Load/Store指令实现,因此,只有加载/存储指令才有寄存器间接寻址方式。
4、基址变址寻址基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
变址寻址方式常用于访问某基地址附近的地址单元。
采用变址寻址方式的指令常见有以下几种形式,如下所示:LDR R0,[R1,#4] ;R0←[R1+4] 称为前变址LDR R0,[R1,#4]!;R0←[R1+4]、R1←R1+4LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4称为后变址LDR R0,[R1,R2] ;R0←[R1+R2]●在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数加载寄存器R0中。
●在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数加载寄存器R0中,“!”使得R1的内容自增4个字节。
●在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数加载寄存器R0中,然后,R1的内容自增4个字节。
●在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数加载寄存器R0中。
5、多寄存器寻址采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。
这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。
例如以下指令:LDMIA R0,{R1,R2,R3,R4} ;R1←[R0],存储器内容加载到寄存器;R2←[R0+4];R3←[R0+8];R4←[R0+12], R0内容不变该指令的后缀IA表示在每次执行完加载(LOAD)/存储(STORE)操作后,R0内容按字地址长度增加(称为事后递增),因此,该指令可将连续4个字存储单元的值加载到R1~R4。
6、相对寻址与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为带符号地址偏移量(24bit地址偏移量),将带符号偏移量左移2位后与PC的值相加之后得到操作数的有效地址。
由于ARM指令编码规定分支指令的地址偏移量为24bit,如图xxx 所示,因此ARM指令的相对寻址范围为±32MB(即可跳转范围±32MB)。
图xxx ARM分支指令编码格式以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:Start_BranchBL NEXT ;LR←PC,跳转到子程序NEXT处执行;NEXT为相对地址,其相对Start_Branch距离应小于32MB。
……NEXT……MOV PC,LR ;从子程序返回,跳转到BL指令的下一指令处7、堆栈寻址堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器(SP)指示当前堆栈的操作位置,堆栈指针总是指向栈顶。
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack)操作,而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)操作。
根据堆栈的生成方式,堆栈又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack)。
压栈操作时,当堆栈由低地址向高地址生成时,称为递增堆栈。
压栈操作时,当堆栈由高地址向低地址生成时,称为递减堆栈。
这样,ARM处理器就有四种类型的堆栈寻址方式:●满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成。
●满递减堆栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成。
●空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
●空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
例如,STMFD R13!,{R2-R9, PC} ;将寄存器(R2~R9,PC)的内容压入递减堆栈LDMFD R13!,{R2-R9,LR} ;将递减堆栈的内容弹出到寄存器(R2~R9,LR)说明:“!”使得SP的内容按照堆栈工作方式FD自动以字地址变化。
实际上,堆栈寻址方式本质上就是批量(多寄存器)寻址方式的一种,前者只是针对普通寄存器寻址的,后者针对数据堆栈寻址的。
§3.3 ARM 微处理器指令系统内容:ARM 指令系统,THUMB 指令系统,ATPCS 介绍,ARM和THUMB混合调用。
ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,并且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。