`
nannan408
  • 浏览: 1770895 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

汇编中的协处理器及命令大全

阅读更多
   协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助忆时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。
在协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。协处理器在协处理器指令期间内利用数据总线来传递数据。80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~Pentium系列芯片,则是利用I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。
指令操作符的命名规则
协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:
1、在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作。如:FADD和FADDP等;
2、在操作符后面加上字母R:表示该操作是反模式,它仅限于减法、除法指令。如:FSUB和FSUBR等;
正模式 —— 栈顶数据=栈顶数据 op 指令操作数,或OPN1=OPN1 – OPN2
反模式 —— 栈顶数据=指令操作数 op 栈顶数据,或OPN1=OPN2 – OPN1
假设:栈顶数据为10,内存变量data的值为1,分别执行下列指令将有不同的结果。
FSUB data ;指令执行后,栈顶数据为9
FSUBR data ;指令执行后,栈顶数据为-9
FSUB ST, ST(1) ;指令执行后,ST=ST-ST(1)
FSUBR ST, ST(1) ;指令执行后,ST=ST(1)-ST

3、操作符的第2个字母是I:表示内存中数据是整数。它对加、减、乘除指令都有效。
例如:FADD data——浮点数加法;
FIADD data——整数加法,它表示内存单元data是一个整数,把该整数加到栈顶的浮点数上。
4、操作符的第2个字母是N:表示在指令执行之前检查非屏蔽数值性错误。如:FSAVE和FNSAVE等,前者称为等待形式(wait version),后者称为非等待形式(no-wait version)。
在使用.8087伪指令情况下,汇编程序会在等待形式的指令前面加上指令WAIT,而在非等待形式的指令前面加上空操作指令NOP。
理解了上述操作符命名规则,就能很容易地区分同类指令之间的差异。


以上摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/kf/201102/83313.html
下面详细介绍下协处理器指令:
1、加法指令

指令格式: FADD [STReg1, STReg2](*)
FADD MemReal
FADDP STReg, ST
FIADD MemInt


(*)在此指令格式下,如果同时指定了二个堆栈寄存器,那么,其中一个寄存器必须是ST。其它指令的同类格式与此同理。

指令FADD含有二个隐含操作数ST(1)和ST,其运算功能是:从堆栈中弹出这二个操作数,然后把计算的“和”压入堆栈,即:ST=ST(1)+ST。

指令“FADD MemReal”的功能:ST=ST+MemReal
指令“FADDP STReg, ST”的功能:STReg=STReg+ST,并弹出堆栈的栈顶
指令“FIADD MemInt”的功能:ST=ST+MemInt

2、减法指令

指令格式: FSUB [STReg1, STReg2]
FSUB MemReal
FSUBP STReg, ST
FISUB MemInt
FSUBR [STReg1, STReg2] ;后四条指令是前四条指令的反模式形式
FSUBR MemReal
FSUBRP STReg,ST
FISUBR MemInt


指令FSUB含有二个隐含操作数ST(1)和ST,其运算功能是:从堆栈中弹出这二个操作数,然后把计算的“差”压入堆栈,即:ST=ST(1)-ST。

指令“FSUB MemReal”的功能:ST=ST-MemReal
指令“FSUBP STReg, ST”的功能:STReg=STReg-ST,并弹出堆栈的栈顶
指令“FISUB MemInt”的功能:ST=ST-MemInt

反模式的四条指令的功能在此从略,请参阅11.3.1中的有关说明。

3、乘法指令

指令格式: FMUL [STReg1, STReg2]
FMUL MemReal
FMULP STReg, ST
FIMUL MemInt


4、除法指令

指令格式: FDIV [STReg1, STReg2]
FDIV MemReal
FDIVP STReg, ST
FIDIV MemInt
FDIVR [STReg1, STReg2] ;后四条指令是前四条指令的反模式形式
FDIVR MemReal
FDIVRP STReg, ST
FIDIVR MemInt


例如:

.387
word1 DW 20
data1 REAL8 8
data2 REAL8 -2
data3 REAL8 -12
……
FLD data1 ;本例只是显示指令的使用方法,无具体的实际功能
FLD data2
FLD data3
FDIV ST(2), ST
FDIV data1
FDIVP ST(2), ST
FIDIV word1


5、其它数学运算指令

在协处理器中,除了完成具体的数学运算指令外,还设置了若干个与数学运算有关的运算指令。具体的运算指令及其功能描述如表11.4所列。

表11.4 与数学运算有关的其它指令

指令格式
指令的功能

FSQRT
求栈顶数据的平方根。如果对负数求其平方根,则会发生错误,并可通过检测状态寄存器的标志位IE来确定。

FSCALE
将ST(1)中的数(转换成整数)加上ST的阶码,该指令能快速完成乘/除2n的运算。ST(1)中的数必须在2-15到215之间。

FPREM/FPREM1
ST=ST%ST(1),80387及其以后的协处理器支持FPREM1。

FRNDINT
对栈顶数据进行舍入运算,使之转换成整数。

FXTRACT
将栈顶数据分成二部分:无偏阶码和尾数。尾数存入栈顶,无偏阶码存入ST(1)。它常用将浮点数转换成小数形式打印输出。

FABS
ST=|ST|,即:求栈顶数据的绝对值。

FCHS
ST=-ST,即:改变栈顶数据的符号。



表11.5 比较运算指令及其功能

指令格式
指令的功能

FCOM
将栈顶数据与另一个操作数进行比较,该操作数可以存储在堆栈寄存器中,也可存储在内存中。
当在指令中不指定操作数时,其默认的操作数是ST和ST(1)。

FCOMP/FCOMPP
此指令的比较功能与FCOM相一致,所不同的是指出从堆栈中弹出一个,还是二个数据。

FICOM MemInt
FICOMP MemInt
栈顶数据与内存单元进行整数比较。指令FICOMP还要弹出栈顶数据。

FUCOM [STReg]
FUCOMP [STReg]
FUCOMPP
反向比较,其功能与上面同类指令类似。

FTST
栈顶数据与0进行比较。比较结果对条件编码位的影响如表11.2所示。

FXAM
检测栈顶数据是正数、负数,还是规格化数。比较结果对条件编码位的影响如表11.2所示。

11.3.5 超越函数运算指令

超越函数运算指令是用来实现三角函数或一些特殊的算术表达式而设置的,具体的指令及其功能说明如表11.6所列。

表11.6 超越函数运算指令及其功能

指令格式
指令的功能

FPTAN
求部分Y/X=tanθ,角度θ存于栈顶,其结果:
ST=X,ST(1)=Y
(1)、在8087-80287中,角度θ的范围上是0~π/4;
(2)、在80387以后的协处理器中,角度θ的范围上是0~263;
如果交度超过其取值范围,则状态IE标定为非法错误。

FPATAN
求部分反正切值θ=arctan(X/Y),X取自ST,Y取自ST(1);
其中:X和Y必须满足:0≤Y<X<∞;
指令执行时进行一次弹出操作,结果存入栈顶。

F2XM1
求2X-1的值,X取自栈顶,结果也存放栈顶,X的取值范围:-1~1。

FCOS或FSIN
求栈顶ST中角度的正弦或余弦值,ST中存放的是弧度。
运算结果也存于ST。

FSINCOS
求栈顶ST中角度的正弦和余弦值,ST中存放的是弧度。
运算结果:ST=正弦值,ST(1)=余弦值。

FYL2X
计算Ylog2X的值,X=ST,Y=ST(1),其中:X>0。
结果存入有一个弹出操作后的栈顶。

FYL2XP1
计算Ylog2(X+1)的值,X=ST,Y=ST(1),其中:0<X<1-2-0.5。
结果存入有一个弹出操作后的栈顶。



表11.7 常数压栈指令及其常数值

指令格式 指令的功能 指令格式 指令的功能
FLDZ
ST=+0.0
FLDL2T
ST= log210

FLD1
ST=+1.0
FLDLG2
ST= log102

FLDPI
ST=π
FLDLN2
ST= loge2

FLDL2E
ST=log2e



11.3.7 协处理器控制指令

协处理器控制指令是用来实现控制协处理器状态而设置的,它包括协处理器的初始化、状态寄存器内容的存?⒁斐4 砗腿挝袂谢坏炔僮鳌>咛宓闹噶罴捌涔δ芩得魅绫?1.8所列。

表11.8 比较运算指令及其功能

指令格式
指令的功能

FINIT/FNINIT
初始化协处理器,初始化后协处理器的状态如表11.9所列。

FLDCW Mem16
将由操作数指定的字存储单元内容存储到控制寄存器中。

FSTCW Mem16
FNSTCW Mem16
把控制寄存器的内容存储到由操作数指定的字存储单元。与指令“FLDCW”相对应。

FSTSW Mem16
FSTSW AX
FNSTSW Mem16
FNSTSW AX
将控制寄存器的内容传送到寄存器AX中。

在8087协处理器中无此指令。

FCLEX/FNCLEX
清除状态寄存器中的“错误”和“忙”标志。

FSAVE Mem
FNSAVE Mem
将全部机器状态存储到内存中。

FRSTOR Mem
从内存复原机器状态,它可恢复由指令“FSAVE/FNSAVE”保存的信息。

FSTENV Mem
FNSTENVMem
存储协处理器环境。

FLDENV Mem
重新装入由指令FSTENV/FNSTENV存储的协处理器环境

FINCST
堆栈指针加1。

FDECSTP
堆栈指针减1。

FFREE ST(i)
释放堆栈寄存器,即使其标记为空,但其内容并没有改变。

FNOP
协处理器的空操作

FWAIT
使处理器处于等待状态,以便协处理器完成其操作。该指令主要用于在CPU访问被协处理器影响的内存数据之前。



表11.9 协处理器初始化的状态

控制项 值 状态含义
控制位IC
0
投影

控制位PC
10
扩展精度

控制位RC
00
最近舍入或偶数

错误屏蔽
11111
错误位关闭

忙标志
0
不忙

C3~C0
????
未定

TOP
000
堆栈栈顶设定为寄存器0

ES
0
无错误

错误位
00000
无错误

全部标记
11


寄存器
--
不改变


分享到:
评论

相关推荐

    协处理器指令的介绍

    本文旨在深入探讨ARM架构中的协处理器指令及其工作原理,帮助读者更好地理解并掌握这一重要概念。 #### 二、协处理器概述 协处理器是一种专门设计来辅助主处理器完成特定任务的处理器,它能够有效地提高系统整体...

    常用ARM指令集及汇编(完整版).pdf

    ARM指令集包括数据处理指令、存储器访问指令、协处理器指令、跳转指令、杂项指令等。每种指令都有其特定的格式和功能,比如数据处理指令能够执行算术逻辑运算,存储器访问指令用来读写内存。 5. ARM存储器访问指令...

    飞思卡尔9S12X系列双核中的协处理器XGATE使用方法.zip

    飞思卡尔9S12X系列微控制器是嵌入式系统设计中常用的一款高性能器件,其独特的双核架构包括了主CPU和协处理器XGATE,这种设计为开发者提供了更强大的处理能力和灵活性。XGATE作为辅助处理器,专门用于执行实时任务和...

    CP15协处理器的使用方法

    CP15协处理器是ARM架构处理器中的一个重要组件,主要用于处理特定的硬件操作和管理功能,尤其是在嵌入式系统和移动设备中。它提供了对处理器核心的高级控制,包括内存管理和中断处理等。以下是对CP15协处理器使用...

    ARM9汇编指令大全

    协处理器指令允许处理器与外部硬件接口,如I/O设备或浮点协处理器。`MCR`、`MRC`用于控制协处理器操作,`CDP`和`CDP2`用于执行复杂数学或特定功能操作。 **10. 异常和中断处理** ARM9处理器支持多种异常和中断处理...

    飞思卡尔9S12X系列双核中的协处理器XGATE使用方法.zip_mc9s12 协处理器_xgate 双口RAM_xgate用法

    XGATE协处理器拥有自己的指令集和存储空间,包括一个双口RAM(Dual Port RAM)。双口RAM的独特之处在于它可以同时从两个独立的接口读写数据,这在处理并发操作时非常有用。在飞思卡尔9S12X系统中,主CPU和XGATE都...

    常用ARM指令集及汇编-经典完整版.rar

    MCR和MRC指令用于向协处理器发送命令和读取其结果,MRS和MSR指令则用于在通用处理器寄存器和协处理器状态之间传输数据。 学习ARM指令集不仅需要理解各个指令的语法和功能,还需要熟悉ARM处理器的工作模式、寄存器...

    ARM汇编指令集查看手册

    协处理器指令,如`MCR`(Move to Coprocessor Register)、`MRC`(Move from Coprocessor Register)等,允许CPU与协处理器之间交换数据。 6. **异常产生指令**: 异常是指处理器在遇到特定情况时进入非正常执行...

    汇编语言学习大全

     11.3 协处理器的指令系统  1 操作符的命名规则  2 数据传送指令  3 数学运算指令  4 比较运算指令  5 超越函数运算指令  6 常数操作指令  7 协处理器控制指令  11.4 协处理器的编程举例  11.5 习题 ...

    关于汇编语言和C语言接口技术的研究

    3. **代码重用**:有时候,为了充分利用现有的汇编代码资源,需要将其集成到C程序中,这就要求能够有效地处理C语言与汇编语言之间的接口问题。 #### Microsoft C/C++程序中集成汇编代码的方法 在Microsoft C/C++...

    常用ARM指令集及汇编(经典完整版).rar

    Coprocessor指令通常涉及与特定协处理器交互,如`MRC`(从协处理器读)和`MCR`(向协处理器写)。 在实际应用中,理解并熟练掌握这些指令对于进行低级优化、编写系统级代码或者调试底层问题至关重要。通过阅读这份...

    常用ARM指令集及汇编.pdf

    - **CDP**、**LDC**、**STC**、**MCR**、**MRC**:与协处理器交互的指令。 5. **杂项指令**: - **SWI**:软件中断,用于操作系统调用。 - **MRS**、**MSR**:从/到状态寄存器的转移。 ### Thumb指令集 Thumb...

    arm汇编指令中文完整版

    - **第4章**:详细介绍了ARM指令集,包括指令汇总、Thumb指令宽度选择、内存访问指令、通用数据处理指令、乘法指令、饱和指令、并行指令、组合和分离指令、跳转指令、协处理器指令以及其他指令等。 - **知识点详解...

    v82.01 鸿蒙内核源码分析 (协处理器篇) - CPU 的好帮手 - 百篇博客分析 OpenHarmony 源码.doc

    本文将着重讲解CPU的得力助手——协处理器CP15,以及与其相关的汇编指令MCR和MRC。在OpenHarmony这样的实时操作系统中,理解和掌握协处理器的工作原理和功能,对于优化系统性能和进行底层调试至关重要。 协处理器,...

    常用ARM指令集及汇编

    - **协处理器指令**:用于访问协处理器,如CDP、LDC、STC。 - **杂项指令**:如SWI(Software Interrupt)、MRS(Move Register from Status)、MSR(Move Status to Register)。 - **伪指令**:如ADR、ADRL、...

Global site tag (gtag.js) - Google Analytics