【文档说明】ARM体系结构与指令集培训课件1.ppt,共(151)页,359.500 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92592.html
以下为本文档部分文字说明:
ARM体系结构的特点2.1ARM处理器工作模式2.2寄存器组织2.3流水线2.4ARM存储系统2.5异常2.6ARM处理器的寻址方式2.7ARM处理器的指令集2.8本章将要介绍ARM体系结构、ARM处理器的工作模式及常用指令集等。通过本章的学习,希望读者
能够了解ARM处理器内部的主要工作单元、基本工作原理,掌握常用指令集,并为以后的程序设计打下基础。本章主要内容:●ARM体系结构的特点●ARM处理器的工作模式●寄存器组织●流水线●ARM存储●异常●ARM处理器的寻址方式●ARM处理器的指令集2.1ARM体系结构的
特点ARM内核采用RISC体系结构。RISC技术的主要特点参见1.3节。ARM体系结构的主要特征如下(在本书的后续章节中将对这些特征做详细讲解):(1)大量的寄存器,它们都可以用于多种用途;(2)Load/Store
体系结构;(3)每条指令都条件执行;(4)多寄存器的Load/Store指令;(5)能够在单时钟周期执行的单条指令内完成一项普通的移位操作和一项普通的ALU操作;(6)通过协处理器指令集来扩展ARM指令集,包括在编程模式中增加了新的寄存器和
数据类型。(7)如果把Thumb指令集也当作ARM体系结构的一部分,那么还可以加上:在Thumb体系结构中以高密度16位压缩形式表示指令集。2.2ARM处理器工作模式表2-1ARM处理器的工作模式除用户模式外的其他6种处理器模式称为特权模式(PrivilegedModes)。在特权模式
下,程序可以访问所有的系统资源,也可以任意地进行处理器模式切换。其中以下5种又称为异常模式:(1)快速中断模式(FIQ);(2)外部中断模式(IRQ);(3)特权模式(Supervior);(4)数据访问中止模式(Abort);(5)未定义指令中止模式(Undef
)。2.3寄存器组织ARM处理器有如下37个32位长的寄存器:(1)30个通用寄存器;(2)6个状态寄存器:1个CPSR(CurrentProgramStatusRegister,当前程序状态寄存器),5个SPSR(SavedProgramStatusRegister
,备份程序状态寄存器);(3)1个PC(ProgramCounter,程序计数器)。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。表2-2列出了ARM处理器的寄存器组织概要。表2-2ARM处理器的寄存器组织概
要2.3.1通用寄存器通用寄存器根据其分组与否可分为以下2类。(1)未分组寄存器(theUnbankedRegister),包括R0~R7。(2)分组寄存器(theBankedRegister),包括R8~R14。未分组寄存器包括R0~R7。未分组寄存器没有被系统用于
特殊的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器。1.未分组寄存器对于分组寄存器R13和R14来说,每个寄存器对应6个不同的物理寄存器。其中的一个是用户模式和系统模式公用的,而另外5个分别用于5种异常模式。访问时需要指定它们的模式。名字形式如下:(1)R
13_<mode>(2)R14_<mode>其中,<mode>可以是以下几种模式之一:usr、svc、abt、und、irp及fiq。2.分组寄存器寄存器R14又被称为连接寄存器(LinkRegister,LR),在ARM体系结构中具有下面两种特殊的作用。(1)每一种处理器模式用自己的R14存放当
前子程序的返回地址。(2)当异常中断发生时,该异常模式特定的物理寄存器R14被设置成该异常模式的返回地址,对于有些模式R14的值可能与返回地址有一个常数的偏移量(如数据异常使用SUBPC,LR,#8返回)。R14也可以被用做通用寄存器使用。2.3.2状态寄存器当前程序状态
寄存器(CurrentProgramStatusRegister,CPSR)可以在任何处理器模式下被访问,它包含下列内容:(1)ALU(ArithmeticLogicUnit,算术逻辑单元)状态标志的备份;(2)当前的处理器模式;(3)中断使能标志;(4)设置处理器的状态(只在4T架构)。
图2-1程序状态寄存器格式N(Negative)、Z(Zero)、C(Carry)和V(oVerflow)通称为条件标志位。(1)N(2)Z(3)C(4)V1.标志位在带DSP指令扩展的ARMv5及更高版本中,bit[27]被指定用于指示增强的DAP指令是
否发生了溢出,因此也就被称为Q标志位。同样,在SPSR中bit[27]也被称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。2.Q标志位CPSR的低8位(I、F、T及M[4∶0])统称为控制位。当异常发生时,这
些位的值将发生相应的变化。另外,如果在特权模式下,也可以通过软件编程来修改这些位的值。(1)中断禁止位(2)状态控制位(3)模式控制位3.控制位表2-3状态控制位M[4∶0]含义2.3.3程序计数器程序
计数器R15又被记为PC。程序计数器在下面两种情况下用于特殊的目的。(1)读程序计数器。(2)写程序计数器。2.4流水线2.4.1流水线的概念与原理处理器按照一系列步骤来执行每一条指令,典型的步骤如下:(1)从存储器读取指令(fetch);(2)译码以鉴别它是属于哪一条指令(decode)
;(3)从指令中提取指令的操作数(这些操作数往往存在于寄存器中)(reg);(4)将操作数进行组合以得到结果或存储器地址(ALU);(5)如果需要,则访问存储器以存储数据(mem);(6)将结果写回到寄存器堆(res)。2.4.2流水线的分类到ARM7为止的AR
M处理器使用简单的3级流水线,它包括下列流水线级。(1)取指令(fetch):从寄存器装载一条指令。(2)译码(decode):识别被执行的指令,并为下一个周期准备数据通路的控制信号。在这一级,指令占有译码逻辑,不占用数据通路。(3)执行(excute):处理指令并将结果写回寄存器。
1.3级流水线ARM组织在ARM9TDMI中使用了典型的5级流水线,5级流水线包括下面的流水线级。(1)取指令(fetch):从存储器中取出指令,并将其放入指令流水线。(2)译码(decode):指令被译码,从寄存器堆中读取寄存器操作数。在寄存器
堆中有3个操作数读端口,因此,大多数ARM指令能在1个周期内读取其操作数。2.5级流水线ARM组织(3)执行(execute):将其中1个操作数移位,并在ALU中产生结果。如果指令是Load或Store指令,则在ALU中计算存储器的地址。(4)缓冲/数据(buffer
/data):如果需要则访问数据存储器,否则ALU只是简单地缓冲1个时钟周期。(5)回写(write-back):将指令的结果回写到寄存器堆,包括任何从寄存器读出的数据。在ARM10中,将流水线的级数增加到6级,使系统
的平均处理能力达到了1.3DMIPS/MHz。3.6级流水线ARM组织图2-46级流水线指令的执行过程2.4.3影响流水线性能的因素1.互锁2.跳转指令2.5ARM存储系统将某个分区或是设备挂载了以后才能使用,但是当计算
机重新启动以后,又需要重新挂载,这个时候可以通过修改/etc/fstab文件实现开机自动挂载文件系统。ARM存储系统有非常灵活的体系结构,可以适应不同的嵌入式应用系统的需要。ARM存储器系统可以使用简单的平板式地址映射机制(就像一些简单的
单片机一样,地址空间的分配方式是固定的,系统中各部分都使用物理地址),也可以使用其他技术提供功能更为强大的存储系统。例如:(1)系统可能提供多种类型的存储器件,如Flash、ROM、SRAM等;(2)Cache技术;(3)写缓存技术(writebuffers);(4)虚拟
内存和I/O地址映射技术。大多数的系统通过下面的方法之一可实现对复杂存储系统的管理。(1)使用Cache,缩小处理器和存储系统速度差别,从而提高系统的整体性能。(2)使用内存映射技术实现虚拟空间到物理空间的映射。(3)引入存储保护机制,增强系统的安
全性。(4)引入一些机制保证将I/O操作映射成内存操作后,各种I/O操作能够得到正确的结果。(1)内核级的寄存器。(2)芯片级的紧耦合存储器TCM。(3)芯片级的片上Cache存储器的容量在8~32KB之间,访问时间大约为10ns。(4)板卡级的DRAM。(5)外设级
的后援存储器,通常是硬盘,可能从几百MB到几个GB,访问时间为几十ms。2.5.1协处理器(CP15)ARM处理器支持16个协处理器。CP15,即通常所说的系统控制协处理器(SystemControlCoprocesssor),它负责完成大部
分的存储系统管理。CP15包含16个32位寄存器,其编号为0~15。CP15中的寄存器可能是只读的,也可能是只写的,还有一些是可读可写的。2.5.2存储管理单元(MMU)在创建多任务嵌入式系统时,最好有一个简单的方
式来编写、装载及运行各自独立的任务。目前大多数的嵌入式系统不再使用自己定制的控制系统,而使用操作系统来简化这个过程。较高级的操作系统采用基于硬件的存储管理单元(MMU)来实现上述操作。MMU提供的一个关键服务是
使各个任务作为各自独立的程序在其自己的私有存储空间中运行。在带MMU的操作系统控制下,运行的任务无须知道其他与之无关的任务的存储需求情况,这就简化了各个任务的设计。MMU提供了一些资源以允许使用虚拟存储器(将系统物理存储器重
新编址,可将其看成一个独立于系统物理存储器的存储空间)。MMU作为转换器,将程序和数据的虚拟地址(编译时的连接地址)转换成实际的物理地址,即在物理主存中的地址。这个转换过程允许运行的多个程序使用相同的虚拟地址,而各自存储在物理存储
器的不同位置。这样存储器就有两种类型的地址:虚拟地址和物理地址。2.5.3高速缓冲存储器(Cache)Cache是一个容量小但存取速度非常快的存储器,它保存最近用到的存储器数据副本。Cache经常与写缓存器(writebu
ffer)一起使用。通过引入Cache和写缓存区,存储系统的性能得到了很大的提高,但同时也带来了一些问题。2.6异常ARM体系结构中,存在7种异常处理。当异常发生时,处理器会把PC设置为一个特定的存储器地址。这一地址放在被称为向量表(vectortable)的特定地址范围内。向量表的入口是一
些跳转指令,跳转到专门处理某个异常或中断的子程序。2.6.1异常的种类表2-4ARM的7种异常2.6.2异常的优先级表2-5异常优先级2.6.3构建异常向量表当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面两种情况下:(1)系统上电;
(2)系统复位。1.复位异常图2-6异常处理向量表当ARM处理器执行协处理器指令时,它必须等待一个外部协处理器应答后,才能真正执行这条指令。若协处理器没有响应,则发生未定义指令异常。2.未定义指令异常软中断(SWI)异常发生时,处理器进入特权模式,执
行一些特权模式下的操作系统功能。3.软中断预取指令异常是由系统存储器报告的。当处理器试图去取一条被标记为预取无效的指令时,发生预取指令异常。如果系统中不包含MMU时,指令预取异常中断处理程序只是简单地报告错误并退出。若包含MMU,引起异常的指令
的物理地址被存储到内存中。4.预取指令异常数据访问中止异常是由存储器发出数据中止信号,它由存储器访问指令Load/Store产生。当数据访问指令的目标地址不存在或者该地址不允许当前指令访问时,处理器产生数据访问中止异常。5.数据访问中止异
常当处理器的外部中断请求(IRQ)引脚有效,而且CPSR寄存器的I控制位被清除时,处理器产生外部中断IRQ异常。系统中各外部设备通常通过该异常中断请求处理器服务。6.外部中断请求当处理器的快速中断请求(FIQ)引脚有效且CPSR寄存器的F控制位被清除时,
处理器产生快速中断请求FIQ异常。7.快速中断请求2.6.4异常响应流程当异常发生时,处理器自动切换到ARM状态,所以在异常处理函数中要判断在异常发生前处理器是ARM状态还是Thumb状态。这可以通过检测SPSR的T位来判断。1.判断处理器状态通常情况下,只有在SWI处理函数中
才需要知道异常发生前处理器的状态。所以在Thumb状态下,调用SWI软中断异常必须注意以下两点。(1)发生异常的指令地址为(lr−2),而不是(lr−4)。(2)Thumb状态下的指令是16位的,在判断中断向量信号时使用半字加载指令LDRH。前面介绍向量表时提到,每一个异常发生时总是从异常向量表开
始跳转。最简单的一种情况是向量表里面的每一条指令直接跳向对应的异常处理函数。其中快速中断处理函数FIQ_handler()可以直接从地址0x1C处开始,省下一条跳转指令,如图2-7所示。(1)MOVPC,#imme_value(2)L
DRPC,[PC+offset]2.向量表图2-7异常处理向量表2.6.5从异常处理程序中返回当一个异常处理返回时,一共有3件事情需要处理:通用寄存器的恢复、状态寄存器的恢复及PC指针的恢复。通用寄存器的
恢复采用一般的堆栈操作指令即可,下面重点介绍状态寄存器的恢复及PC指针的恢复。PC和CPSR的恢复可以通过一条指令来实现,下面是3个例子。(1)MOVSPC,LR(2)SUBSPC,LR,#4(3)LDMFDSP!,{PC}^1.恢复被中断程序的处理器状态异常返回时,另一个非常重要的问题就是返
回地址的确定。2.异常的返回地址图2-83级流水线示例(1)软中断异常(2)IRQ或FIQ异常(3)DataAbort数据中止异常表2-6异常和返回地址2.7ARM处理器的寻址方式ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、协处
理器指令和异常中断产生指令。根据使用的指令类型不同,指令的寻址方式分为数据处理指令寻址方式和内存访问指令寻址方式。2.7.1数据处理指令寻址方式数据处理指令的基本语法格式如下:<opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,<shifter
_operand>有11种形式,如表2-7所示。表2-7<shifter_operand>的寻址方式数据处理指令寻址方式可以分为以下几种。(1)立即数寻址方式;(2)寄存器寻址方式;(3)寄存器移位寻址方式。指令中的立即数是由一个8bit
的常数移动4bit偶数位(0,2,4,…,26,28,30)得到的。所以,每一条指令都包含一个8bit的常数X和移位值Y,得到的立即数=X循环右移(2×Y)。1.立即数寻址方式寄存器的值可以被直接用于数据操作指令
,这种寻址方式是各类处理器经常采用的一种方式,也是一种执行效率较高的寻址方式,2.寄存器寻址方式寄存器的值在被送到ALU之前,可以事先经过桶形移位寄存器的处理。预处理和移位发生在同一周期内,所以有效地使用移位寄存器,可以增加代码的执行效率。3.寄存器移位寻址方式2.
7.2内存访问指令寻址方式内存访问指令的寻址方式可以分为以下几种。(1)字及无符号字节的Load/Store指令的寻址方式;(2)杂类Load/Store指令的寻址方式;(3)批量Load/Store指令的寻址方式;(4)协处理器Load/Store指令的寻址方式。字及
无符号字节的Load/Store指令语法格式如下:LDR|STR{<cond>}{B}{T}<Rd>,<addressing_mode>1.字及无符号字节的Load/Store指令的寻址方式表2-8字及无符合字节的L
oad/Store指令的寻址方式使用该类寻址方式的指令的语法格式如下:LDR|STR{<cond>}H|SH|SB|D<Rd>,<addressing_mode>2.杂类Load/Store指令的寻址方式表2-9杂类Load/Store指
令的寻址方式批量Load/Store指令将一片连续内存单元的数据加载到通用寄存器组中或将一组通用寄存器的数据存储到内存单元中。该类指令的语法格式如下:LDM|STM{<cond>}<addressing_mode><Rn>{!},<registers><^>3.批量L
oad/Store指令寻址方式表2-10批量Load/Store指令的寻址方式堆栈操作寻址方式和批量Load/Store指令寻址方式十分类似。但对于堆栈的操作,数据写入内存和从内存中读出要使用不同的寻址模式,因为进栈操作(p
op)和出栈操作(push)要在不同的方向上调整堆栈。4.堆栈操作寻址方式根据不同的寻址方式,将堆栈分为以下4种。(1)Full栈:堆栈指针指向栈顶元素(lastusedlocation)。(2)Empty栈:堆栈指针指向
第一个可用元素(thefirstunusedlocation)。(3)递减栈:堆栈向内存地址减小的方向生长。(4)递增栈:堆栈向内存地址增加的方向生长。根据堆栈的不同种类,将其寻址方式分为以下4种。(1)满递减FD(FullDescending)。(2)空递减
ED(EmptyDescending)。(3)满递增FA(FullAscending)。(4)空递增EA(EmptyAscending)。表2-11堆栈寻址方式和批量Load/Store指令寻址方式对应关系协处理器Load/St
ore指令的语法格式如下:<opcode>{<cond>}{L}<coproc>,<CRd>,<addressing_mode>5.协处理器Load/Store寻址方式2.8ARM处理器的指令集数据操作指令是指对存放在寄存器中的数据进行操作的指
令。主要包括数据传送指令、算术指令、逻辑指令、比较与测试指令及乘法指令。2.8.1数据操作指令表2-12数据处理指令列表MOV指令是最简单的ARM指令,执行的结果就是把一个数N送到目标寄存器Rd,其中N可以是寄存器,也可以是立即数。MOV指令多用于设置初始值或者在寄存器间传送数据。MOV指令将移
位码(shifter_operand)表示的数据传送到目的寄存器Rd,并根据操作的结果更新CPSR中相应的条件标志位。1.MOV指令(1)指令的语法格式MOV{<cond>}{S}<Rd>,<shifter_operand>(2)指令举例(3)指令的使用MVN是反相传送(MoveNegative)
指令。它将操作数的反码传送到目的寄存器。MVN指令多用于向寄存器传送一个负数或生成位掩码。MVN指令将shifter_operand表示的数据的反码传送到目的寄存器Rd。并根据操作的结果更新CPSR中相应的条件标志位。2.MVN指令(1)指令的语法
格式MVN{<cond>}{S}<Rd>,<shifter_operand>(2)指令举例(3)指令的使用AND指令将shifter_operand表示的数值与寄存器Rn的值按位(bitwise)做逻辑与操作,并将结果保存到目标寄存器Rd中,同时根据操作的
结果更新CPSR寄存器。(1)指令的语法格式AND{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)指令举例3.AND指令EOR(ExclusiveOR)指令将寄存器Rn中的值和shifter_operand的值执行按位“异或”操作,并将执行结果存储到目的寄存器Rd
中,同时根据指令的执行结果更新CPSR中相应的条件标志位。(1)指令的语法格式EOR{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)指令举例4.EOR指令SUB(Subtract)指令从寄存器Rn中减去shifter_operan
d表示的数值,并将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。(1)指令的语法格式SUB{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)SUB指令举例5.SUB指令RSB
(ReverseSubtract)指令从寄存器shifter_operand中减去Rn表示的数值,并将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。(1)指令的语法格式RSB{<con
d>}{S}<Rd>,<Rn>,<shifter_operand>(2)RSB指令举例6.RSB指令ADD指令将寄存器shifter_operand的值加上Rn表示的数值,并将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。(1)指令
的语法格式ADD{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)ADD指令举例7.ADD指令ADC指令将寄存器shifter_operand的值加上Rn表示的数值,再加上CPSR中的C条件标志位的值,将结果保存到目标寄存器Rd中,并根
据指令的执行结果设置CPSR中相应的标志位。(1)指令的语法格式ADC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)ADC指令举例8.ADC指令SBC(Subtractwi
thCarry)指令用于执行操作数大于32位时的减法操作。该指令从寄存器Rn中减去shifter_operand表示的数值,再减去寄存器CPSR中C条件标志位的反码[NOT(Carryflag)],并将结果保存到目标
寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。9.SBC指令RSC(ReverseSubtractwithCarry)指令用于从寄存器shifter_operand中减去Rn表示的数值,再减去寄存器CPSR中C条件标志位的反码[NOT(CarryFlag)],并
将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。(1)指令的语法格式RSC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)RSC指令举例10.RSC指
令TST(Test)测试指令用于将一个寄存器的值和一个算术值进行比较。条件标志位根据两个操作数做“逻辑与”后的结果设置。(1)指令的语法格式TST{<cond>}<Rn>,<shifter_operand>(2)TST指令举例11.TST测试指令TEQ(TestE
quivalence)指令用于将一个寄存器的值和一个算术值做比较。条件标志位根据两个操作数做“逻辑或”后的结果设置。以便后面的指令根据相应的条件标志来判断是否执行。(1)指令的语法格式TEQ{<cond>}<Rn>,<shifter_operand>(2)TEQ指令举例12.TEQ指令
CMP(Compare)指令使用寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中相应的条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。(1)指令的语法格式CMP{<cond>}<Rn>,<shi
fter_operand>(2)CMP指令举例13.CMP指令CMN(CompareNegative)指令使用寄存器Rn的值减去operand2的负数值(加上operand2),根据操作的结果更新CPSR中相应的条件标志位,以便后面的
指令根据相应的条件标志来判断是否执行。(1)指令的语法格式CMN{<cond>}<Rn>,<shifter_operand>(2)CMN指令举例14.CMN指令ORR(LogicalOR)为逻辑或操作指令,它将第2个源操作数shifter_oper
and的值与寄存器Rn的值按位做“逻辑或”操作,结果保存到Rd中。(1)指令的语法格式ORR{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)ORR指令举例15.ORR指令BIC
(BitClear)位清零指令,将寄存器Rn的值与第2个源操作数shifter_operand的值的反码按位做“逻辑与”操作,结果保存到Rd中。(1)指令的语法格式BIC{<cond>}{S}<Rd>,<Rn>,<shi
fter_operand>(2)BIC指令举例16.BIC位清零指令ARM乘法指令完成两个数据的乘法。两个32位二进制数相乘的结果是64位的积。在有些ARM的处理器版本中,将乘积的结果保存到两个独立的寄存器中。另外一些版本只将最低有效32位存放到
一个寄存器中。2.8.2乘法指令表2-13各种形式乘法指令的功能MUL(Multiply)32位乘法指令将Rm和Rs中的值相乘,结果的最低32位保存到Rd中。(1)指令的语法格式MUL{<cond>}{S}<Rd>,<Rm>,<Rs>(2)指令举例1.MUL指令MLA(
MultiplyAccumulate)32位乘—累加指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的最低32位保存到Rd中。(1)指令的语法格式MLA{<cond>}{S}<Rd>,<Rm>,
<Rs>,<Rn>(2)指令举例2.MLA乘—累加指令UMULL(UnsignedMultiplyLong)为64位无符号乘法指令。它将Rm和Rs中的值做无符号数相乘,结果的低32位保存到RsLo中,高32位保存到RdHi中
。(1)指令的语法格式UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>(2)指令举例3.UMULL指令UMLAL(UnsignedMultiplyAccumulateLong)为64位无符号长乘—累加指令。指令将Rm和Rs中的值
做无符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RsLo中,高32位保存到RdHi中。(1)指令的语法格式UMALL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,
<Rs>(2)指令举例4.UMLAL指令SMULL(SignedMultiplyLong)为64位有符号长乘法指令。指令将Rm和Rs中的值做有符号数相乘,结果的低32位保存到RsLo中,高32位保存到
RdHi中。(1)指令的语法格式SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>(2)指令举例5.SMULL指令SMLAL(SignedMultiplyAccumulateLong)为64位有符号长乘—累加指令。指令将Rm和Rs中的值做有符号数相乘
,64位乘积与RdHi、RdLo相加,结果的低32位保存到RsLo中,高32位保存到RdHi中。(1)指令的语法格式SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>(2)指令举例6.SMLAL指令Load/Store内存访问指令
在ARM寄存器和存储器之间传送数据。ARM指令中有3种基本的数据传送指令。2.8.3Load/Store指令这些指令在ARM寄存器和存储器之间提供更灵活的单数据项传送方式。数据项可以是字节、16位半字或32位字。1.
单寄存器Load/Store指令(SingleRegister)这些指令的灵活性比单寄存器传送指令差,但可以使大量的数据更有效地传送。它们用于进程的进入和退出、保存和恢复工作寄存器以及复制存储器中的一块数据。2.多寄存器Load/Store内存访问指令这些指令允
许寄存器和存储器中的数值进行交换,在一条指令中有效地完成Load/Store操作。它们在用户级编程中很少用到。它的主要用途是在多处理器系统中实现信号量(Semaphores)的操作,以保证不会同时访问公用的数据结构。3.单寄存器交换指令(SingleRegisterSwap)2.8.3.1单寄存器
的Load/Store指令表2-14单寄存器Load/Store指令LDR指令用于从内存中将一个32位的字读取到目标寄存器。(1)指令的语法格式LDR{<cond>}<Rd>,<addr_mode>(2)指令举例1.LDR指令STR指令用于将一个32位的字数据写入到指令中指定的内存单元
。(1)指令的语法格式STR{<cond>}<Rd>,<addr_mode>(2)指令举例2.STR指令LDRB指令根据addr_mode所确定的地址模式将一个8位字节读取到指令中的目标寄存器Rd。指令的语法格式:LDR{<cond
>}B<Rd>,<addr_mode>3.LDRB指令STRB指令从寄存器中取出指定的8位字节放入寄存器的低8位,并将寄存器的高位补0。指令的语法格式:STR{<cond>}B<Rd>,<addr_mode>4.STR
B指令LDRH指令用于从内存中将一个16位的半字读取到目标寄存器。如果指令的内存地址不是半字节对齐的,指令的执行结果不可预知。指令的语法格式:LDR{<cond>}H<Rd>,<addr_mode>5.LDRH指令STRH指令从寄存器中取出指定的16位
半字放入寄存器的低16位,并将寄存器的高位补0。指令的语法格式:STR{<cond>}H<Rd>,<addr_mode>6.STRH指令2.8.3.2多寄存器的Load/Store内存访问指令表2-15多寄存器的Load/Store内存访问指令LDM指令将数据从连续的内存单元中读取到指令中指
定的寄存器列表中的各寄存器中。当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的字数据将被作为目标地址值,指令执行后程序将从目标地址处开始执行,从而实现了指令的跳转。指令的语法格式:LDM{<cond>}<addressing_mode><Rn>{!},<registers
>1.LDM指令LDM指令将数据从连续的内存单元中读取到指令中指定的寄存器列表中的各寄存器中。指令的语法格式:LDM{<cond>}<addressing_mode><Rn>,<registers_without_pc>
ˆˆSTM指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。主要用于块数据的写入、数据栈操作及进入子程序时保存相关寄存器的操作。指令的语法格式:STM{<cond>}<addressing_mode><Rn>{!},<registers>2.STM指令STM指令将指令中寄存器
列表中的各寄存器数值写入到连续的内存单元中。主要用于块数据的写入、数据栈操作及进入子程序时保存相关寄存器等操作。指令的语法格式:STM{<cond>}<addressing_mode><Rn>,<registers>ˆLDM/
STM批量加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器,STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。指令格式如下:LDM{cond}<模式>Rn{!},regist{ˆ}STM{cond}
<模式>Rn{!},regist{ˆ}2.8.3.3数据传送指令应用表2-16多寄存器的Load/Store内存访问指令映射交换指令是Load/Store指令的一种特例,它把一个寄存器单元的内容与寄存
器内容交换。交换指令是一个原子操作(AtomicOperation),也就是说,在连续的总线操作中读/写一个存储单元,在操作期间阻止其他任何指令对该存储单元的读/写。交换指令如表2-17所示。2.8.4单数据交
换指令表2-17交换指令SWPSWP指令用于将内存中的一个字单元和一个指定寄存器的值相交换。指令的语法格式:SWP{<cond>}<Rd>,<Rm>,[<Rn>]1.SWP字交换指令SWPB指令用于将内存中的一个字节单元和一个指定寄存器的低8位值相交换,指令的语法格式:SWP{<con
d>}B<Rd>,<Rm>,[<Rn>]2.SWPB字节交换指令SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写到该内存单元中,使用SW
P可实现信号量操作。指令的语法格式:SWP{cond}BRd,Rm,[Rn]3.交换指令SWP应用跳转(B)和跳转连接(BL)指令是改变指令执行顺序的标准方式。2.8.5跳转指令表2-18ARMv5架构跳转指令(1)指令的
语法格式B{L}{<cond>}<target_address>(2)程序举例1.跳转指令B及带连接的跳转指令BL带状态切换的跳转指令(BX)使程序跳转到指令中指定的参数Rm指定的地址执行程序,Rm的第0位复制
到CPSR中T位,bit[31∶1]移入PC。若Rm的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码;若Rm的位bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址代码解释为ARM代码。2.BX带状态切换的跳转指
令BX(1)指令的语法格式BX{<cond>}<Rm>(2)指令举例带连接和状态切换的跳转指令(BranchwithLinkExchange,BLX)使用标号,用于使程序跳转到Thumb状态或从Thumb状态返回。(1)语法格式BLX<targe
t_add>(2)指令的使用3.BLX带状态切换的连接跳转指令BLXARM指令集提供了两条指令,可直接控制程序状态寄存器(ProgramStateRegister,PSR)。2.8.6状态操作指令表2-19程序状态寄存器指令MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。在
ARM处理器中,只有MRS指令可以将状态寄存器CPSR或SPSR读出到通用寄存器中。(1)指令的语法格式MRS{cond}Rd,PSR(2)指令举例1.MRS在ARM处理器中,只有MSR指令可以直接设置状态寄存器CPSR或SPSR。(1)指令的语法格式MSR{
cond}PSR_field,#immed_8rMSR{cond}PSR_field,Rm(2)指令举例2.MSR【例2-5】使能IRQ中断。【例2-6】禁止IRQ中断。【例2-7】堆栈指令初始化。3.程序状态寄存器指令的应用ARM体系结构允许通过
增加协处理器来扩展指令集。ARM协处理器指令可分为以下3类。(1)协处理器数据操作。(2)协处理器数据传送指令。(3)协处理器寄存器传送指令。2.8.7协处理器指令表2-20协处理器指令ARM指令集中提供了两条产生异常的指令,通过这两条指令可以用软件的方法实现异常
。2.8.8异常产生指令表2-21ARM异常产生指令软件中断指令(SoftwareInterrupt,SWI)用于产生软中断,从而实现从用户模式变换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量,在其他模式下也可以使用SW
I指令,处理器同样切换到管理模式。1.软件中断指令(1)指令的语法格式SWI{<cond>}<immed_24>(2)指令举例断点中断指令(BreakPoint,BKPT)产生一个预取异常(PrefetchAbort),它常被用来设置软件断点,在调试程序时十分有用。当系统中存在调试硬件时,该
指令被忽略。指令格式如下:BKPT<immediate>2.断点中断指令本章小结本章对ARM处理器的体系结构、寄存器组织、流水线、ARM存储、异常、ARM处理器的寻址方式、ARM处理器的指令集等内容进行了介绍,这些内容是ARM处理器理论的
基本内容,是系统软硬件设计的基础。