您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > ARM体系结构与编程(第2版)_ppt
第2章ARM指令分类及其寻址方式在本章中,将介绍ARM指令分类以及各类指令对应的寻址方式。22.1ARM指令集概要介绍在本节中,将介绍ARM指令相关的一些基本概念,包括指令的分类、指令的一般编码格式以及ARM指令中的条件码。32.1.1ARM指令的分类ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理器指令和异常中断产生指令6类。42.1.2ARM指令的一般编码格式ARM指令字长为固定的32位。一条典型的ARM指令编码格式如下:312827252421201916151211870其中的符号及参数说明如下。opcode:指令操作符编码。cond:指令执行的条件编码。S:决定指令的操作是否影响CPSR的值。Rd:目标寄存器编码。Rn:包含第1个操作数的寄存器编码。shifter_operand:表示第2个操作数。5cond001opcodeSRnRdshifter_operand2.1.3ARM指令的条件码域条件码共有16个,各条件码的含义和助记符如表2.1所示。可条件执行的指令可以在其助记符的扩展域加上条件码助记符,从而在特定的条件下执行。参见教材P2362.2ARM指令的寻址方式ARM指令的寻址方式有以下几种,分别进行讨论:数据处理指令的操作数的寻址方式。字及无符号字节的Load/Store指令的寻址方式。杂类Load/Store指令的寻址方式。批量Load/Store指令的寻址方式。协处理器Load/Store指令的寻址方式。72.2.1数据处理指令的操作数的寻址方式通常数据处理指令的格式如下所示:opcode{cond}{S}Rd,Rn,shifter_operand其中的符号及参数说明如下。opcode:是指令助记符,如ADD表示算术加操作指令。{cond}:表示指令执行的条件。{S}:决定指令的操作是否影响CPSR的值。Rd:表示目标寄存器。Rn:表示包含第1个操作数的寄存器。shifter_operand:表示第2个操作数。82.2.1数据处理指令的操作数的寻址方式shifter_operand通常有下面3种格式。(1)立即数方式。(2)寄存器方式。(3)寄存器移位方式。数据处理指令操作数的具体寻址方式有下面11种。#immediateRmRm,LSL#shift_immRm,LSLRsRm,LSR#shift_immRm,LSRRsRm,ASR#shift_immRm,ASRRsRm,ROR#shift_immRm,RORRsRm,RRX92.2.2字及无符号字节的Load/Store指令的寻址方式各种类型的Load/Store指令的寻址方式由两部分组成。一部分为一个的基址寄存器;另一部分为一个地址偏移量。基址寄存器可以为任一个通用寄存器;地址偏移量可以有以下3种格式:立即数。寄存器。寄存器及一个移位常数。同样,寻址方式的地址计算方法有如下3种:偏移量方法。事先更新方法。事后更新方法。102.2.2字及无符号字节的Load/Store指令的寻址方式LDR指令的语法格式如下所示:LDR{cond}{B}{T}Rd,address_mode其中,address_mode表示第2个操作数的内存地址,共有如下9种格式:[Rn,#+/–offset_12][Rn,+/–Rm][Rn,+/–Rm,shift#shift_imm][Rn,#+/–offset_12]![Rn,+/–Rm]![Rn,+/–Rm,shift#shift_imm]![Rn],#+/–offset_12[Rn],+/–Rm[Rn],+/–Rm,shift#shift_imm112.2.3杂类Load/Store指令的寻址方式这里所说的杂类Load/Store指令,包括操作数为半字(无符号数或带符号数)数据的Load/Store指令;操作数为带符号的字节数据的Load指令;双字的Load/Store指令。这类指令的语法格式为:LDR|STR{cond}H|SH|SB|DRd,addressing_mode其中,addressing_mode是指令中内存单元的寻址方式,具体有以下6种格式:[Rn,#+/–offset_8][Rn,+/–Rm][Rn,#+/–offset_8]![Rn,+/–Rm]![Rn],#+/–offset_8[Rn],+/–Rm122.2.4批量Load/Store指令的寻址方式一条批量Load/Store指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。其语法格式如下:DM|STM{cond}addressing_modeRn{!},registers{^}其中,指令中寄存器和内存单元的对应关系满足这样的规则,即编号低的寄存器对应于内存中的低地址单元,编号高的寄存器对应于内存中的高地址单元,Rn中存放地址块的最低地址值。132.2.4批量Load/Store指令的寻址方式addressing_mode表示地址的变化方式,有以下4种方式。IA(IncrementAfter):事后递增方式。IB(IncrementBefore):事先递增方式。DA(DecrementAfter):事后递减方式。DB(DecrementBefore):事先递减方式。批量Load/Store指令的编码格式如下:142.2.4批量Load/Store指令的寻址方式1.事后递增方式IA2.事先递增方式IB3.事后递减方式DA4.事先递减方式DB5.对应于栈操作的寻址方式152.2.5协处理器Load/Store指令的寻址方式一条协处理器Load/Store指令可以在ARM处理器和协处理器之间传输批量数据。其语法格式如下:opcode{cond}{L}coproc,CRd,addressing_mode其中,addressing_mode表示地址的变化方式,有以下4种格式:[Rn,#+/–offset_8*4][Rn,#+/–offset_8*4]![Rn],#+/–offset_8*4[Rn],option协处理器Load/Store指令的编码格式如下所示。162.2.5协处理器Load/Store指令的寻址方式1.偏移量[Rn,#+/–offset_8*4]2.事先更新[Rn,#+/–offset_8*4]!3.事先更新[Rn],#+/–offset_8*44.非索引[Rn],option17第3章ARM指令集介绍在本章中,将详细介绍各ARM指令,并给出一些典型的ARM功能代码段。193.1ARM指令集ARM指令集可以分为6类,即跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理器指令和异常中断产生指令。为了更清楚地描述这些指令,将一些大类的指令进一步分为几个小类分别讲述。203.1.1跳转指令在ARM中,有两种方式可以实现程序的跳转:一种是跳转指令;另一种是直接向PC寄存器(R15)中写入目标地址值。在ARM版本5以前的体系中,传送到PC寄存器中的目标地址值的低两位bits[1:0]被忽略,跳转指令只能在ARM指令集中执行,即程序不能从ARM状态切换到Thumb状态。非T系列版本5的ARM体系不含Thumb指令,当程序试图切换到Thumb状态时,将产生未定义指令异常中断。ARM的跳转指令可以从当前指令向前或向后32MB的地址空间跳转。这类跳转指令有以下4种。B:跳转指令。BL:带返回的跳转指令。BLX:带返回和状态切换的跳转指令。BX:带状态切换的跳转指令。213.1.1跳转指令1.B(跳转指令)及BL(带返回的跳转指令)2.BLX(1)3.BLX(2)4.BX指令223.1.2数据处理指令数据处理指令又可大致分为3类:数据传送指令,如MOV;算术逻辑运算指令,如ADD、SUB和AND等;比较指令,如TST。数据处理指令包括以下指令。MOV:数据传送指令。MVN:数据求反传送指令。CMP:比较指令。CMN:基于相反数的比较指令。TST:位测试指令。TEQ:相等测试指令。ADD:加法指令。SUB:减法指令。233.1.2数据处理指令RSB:逆向减法指令。ADC:带位加法指令。SBC:带位减法指令。RSC:带位逆向减法指令。AND:逻辑与操作指令。BIC:位清除指令。EOR:逻辑异或操作指令。ORR:逻辑或操作指令。243.1.3乘法指令ARM有两类乘法指令:一类为32位的乘法指令,即乘法操作的结果为32位;另一类为64位的乘法指令,即乘法操作的结果为64位。两类指令共有以下6条。MUL:32位乘法指令。MLA:32位带加数的乘法指令。SMULL:64位有符号数乘法指令。SMLAL:64位带加数的有符号数乘法指令。UMULL:64位无符号数乘法指令。UMLAL:64位带加数的无符号数乘法指令。253.1.4杂类的算术指令在ARMv5及以上的版本中,包含一条特别的指令CLZ,用于计算操作数最高端0的个数。这条指令主要用于以下两种场合:计算操作数规范化(使其最高位为1)时需要左移的位数。确定一个优先级掩码中的最高优先级(最高位的优先级)。CLZ前导0个数计数指令CLZ指令用于计算寄存器中操作数最高端0的个数。如果操作数的bit[31]为1,则指令返回0;如果操作数为0,则指令返回32。指令的编码格式263.1.5状态寄存器访问指令ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。关于状态寄存器,这里仅强调以下几点。(1)状态寄存器中,有些位是当前没有使用的,但在ARM将来的版本中有可能使用这些位,因此用户程序不要使用这些位。(2)程序不能通过直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令完成程序状态的切换。(3)通常修改状态寄存器是通过“读取-修改-写回”的操作序列来实现的。(4)状态寄存器访问指令包括以下两条。MRS:状态寄存器到通用寄存器的传送指令。MSR:通用寄存器到状态寄存器的传送指令。273.1.6Load/Store内存访问指令Load指令用于从内存中读取数据放入寄存器中;Store指令用于将寄存器中的数据保存到内存。ARM有两大类的Load/Store指令:一类用于操作32位的字类型数据以及8位无符号的字节类型数据;另一类用于操作16位半字类型的数据以及8位的有符号字节类型的数据。Load/Store内存访问指令的一个操作数放在寄存器中,另一个操作数的寻址方式参见2.2节。283.1.6Load/Store内存访问指令用于操作32位的字类型数据以及8位无符号的字节类型数据的Load/Store指令有以下指令。LDR:字数据读取指令。LDRB:字节数据读取指令。LDRBT:用户模式的字节数据读取指令。LDRH:半字数据读取指令。LDRSB:有符号的字节数据读取指令。LDRSH:有符号的半字数据读取指令。LDRT:用户模式的字数据读取指令。STR:字数据写入指令。STRB:字节数据写入指令。STRBT:用户模式字节数据写入指令。STRH:半字数据写入指令。STRT:用户模式字数据写入指令。293.1.7批量Load/Store内存访问指令批量Load内存访问指令可以一次从连续的内存单元中读取数据,传送到指令中的内存列表中的各个寄存器中。批量Store内存访问指令可以将指令中寄存器列表中的各个寄存器值写入到内存中,内存的地址由指令中的寻址模式确定。批量Load/Store内存访问指令的语法格式如下:LDM|STM{cond}addressing_modeRn{!},regis
本文标题:ARM体系结构与编程(第2版)_ppt
链接地址:https://www.777doc.com/doc-3604516 .html