协处理器及其他指令之:协处理器指令
9.1 协处理器指令
ARM体系结构允许通过增加协处理器来扩展指令集。最常用的协处理器是用于控制片上功能的系统协处理器。例如控制Cache和存储管理单元的CP15寄存器。此外,还有用于浮点运算的浮点ARM协处理器,各生产商还可以根据需要开发自己的专用协处理器。
ARM协处理器具有自己专用的寄存器组,它们的状态由控制ARM状态的指令的镜像指令来控制。
程序的控制流指令由ARM处理器来处理,所有协处理器指令只能同数据处理和数据传送有关。按照RISC的Load/Store体系原则,数据的处理和传送指令是被清楚分开的,所以它们有不同的指令格式。
ARM处理器支持16个协处理器,在程序执行过程中,每个协处理器忽略ARM和其他协处理器指令。当一个协处理器硬件不能执行属于它的协处理器指令时,将产生一个未定义指令异常中断,在该异常中断处理过程中,可以通过软件仿真该硬件操作。如果,一个系统中不包含向量浮点运算器,则可以选择浮点运算软件包来支持向量浮点运算。
ARM协处理器可以部分地执行一条指令,而后产生中断。如除法运算除数为0和溢出,这样可以更好地处理运行时产生(run-time-generated)的异常。但是,指令的部分执行是由协处理器完成的,此过程对ARM来说是透明的。当ARM处理器重新获得执行时,它将从产生异常的指令处开始执行。
对某一个协处理器来说,并不一定用到协处理器指令中的所有的域。具体协处理器如何定义和操作完全由协处理器的制造商自己决定,因此ARM协处理器指令中的协处理器寄存器的标识符以及操作助记符也有各种不同的实现定义。程序员可以通过宏定义这些指令的语法格式。
ARM协处理器指令分以下3类。
· 协处理器数据操作。协处理器数据操作完全是协处理器内部操作,它完成协处理器寄存器的状态改变。如浮点加运算,在浮点协处理器中两个寄存器相加,结果放在第3个寄存器中。这类指令包括CDP指令。
· 协处理器数据传送指令。这类指令从寄存器读取数据装入协处理器寄存器,或将协处理器寄存器的数据装入存储器。因为协处理器可以支持自己的数据类型,所以每个寄存器传送的字数与协处理器有关。ARM处理器产生存储器地址,但传送的字节由协处理器控制。这类指令包括LDC和STC指令。
· 协处理器寄存器传送指令。在某些情况下,需要ARM处理器和协处理器之间传送数据。如一个浮点运算协处理器,FIX指令从协处理器寄存器取得浮点数据,将它转换为整数,并将整数传送到ARM寄存器中。经常需要用浮点比较产生的结果来影响控制流,因此,比较结果必须传送到ARM的CPSR中。这类协处理器寄存器传送指令包括MCR和MRC。
表9.1列出了所有协处理器处理指令。
表9.1 协处理器指令
助 记 符 | 操 作 |
CDP | 协处理器数据操作 |
LDC | 装载协处理器寄存器 |
MCR | 从ARM寄存器传数据到协处理器寄存器 |
MRC | 从协处理器寄存器传数据到ARM寄存器 |
STC | 存储协处理器寄存器 |
9.1.1 协处理器数据操作指令CDP
1.指令编码格式
此指令用于控制数据在协处理器寄存器内部的操作。通常情况下该指令由协处理器完成,如果协处理器不能成功地执行该操作,将产生未定义指令异常。
指令的编码格式如图9.1所示。
图9.1 CDP指令编码格式
2.指令的语法格式
CDP{<cond>} <coproc>,<opcode_1>,<CRd>,<CRn>,<CRm>,<opcode_2>
CDP2 <coproc>,<opcode_1>,<CRd>,<CRn>,<CRm>,<opcode_2>
① <cond>
为指令编码中的条件域。它指示指令在什么条件下执行。当<cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② CDP2
协处理器数据操作指令CDP的一种特殊格式。这种格式中指定编码的条件域<cond>为ob1111。这种设计为协处理器的设计者提供了一个灵活的扩展空间。此指令只能无条件执行。
③ <coproc>
指定协处理器的编号,标准的协处理器的名字为p0、p1、…、p15。
④ <opcode_1>
指定协处理器执行的操作码,确定哪一个协处理器指令将被执行。
⑤ <CRd>
作为目标寄存器的协处理器寄存器。
⑥ <CRn>
确定包含第一个操作数的协处理器寄存器。
⑦ <CRm>
确定包含第二个操作数的协处理器寄存器。
⑧ <opcode_2>
指定协处理器执行的操作码,确定哪一个协处理器指令将被执行。通常与<opcode_1> 指定协处理器执行的操作码,确定哪一个协处理器指
- 实时操作系统软件调度器/硬件调度器的设计与实现(03-27)
- BASIC在PLC控制系统中的应用(08-15)
- 协处理器及其他指令之:零计数指令CLZ(08-13)
- 协处理器及其他指令之:交换指令(08-13)
- 协处理器及其他指令之:状态寄存器访问指令(08-13)
- 高效的C编程之: 浮点运算(08-30)