2022年协处理器指令系统参照 .pdf
《2022年协处理器指令系统参照 .pdf》由会员分享,可在线阅读,更多相关《2022年协处理器指令系统参照 .pdf(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、协处理器指令系统协处理器共有68 条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC 指令,ESC 指令代表了协处理器的操作码。协处理器指令在执行过程中,需要访问内存单元时,CPU 会为其形成内存地址。协处理器在指令执行期间内利用数据总线来传递数据。80287 协处理器利用I/O 地址 00FAH00FFH 来实现其与 CPU之间的数据交换,而80387Pentium 系列芯片,则是利用I/O 地址800000FAH800000FFH 来实现这两者之间的数据交换。一指令操作符的命名规则协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:1、在操作符后面加
2、上字母P:表示该指令执行完后,还进行一次堆栈弹出操作,弹出栈顶数据以后要对其它的寄存器进行相应的调整。如:FADDP/FSUBP/FSUBRP/FMULP/FDIVP/FDIVRP 等;2、在操作符后面加上字母R:表示将两个操作数的源/目的位置交换再进行运算,它仅限于减法、除法指令,因为加法和乘法不受源/目的操作数的位置影响结果。如:FSUBR 和 FDIVR 等;不加 R 时 目的操作数=目的操作数op 源操作数加 R 模式 目的操作数=源操作数op 目的操作数假设:栈顶数据st(0)为 10,内存变量 data的值为 1,分别执行下列名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页
3、,共 23 页 -指令将有不同的结果。FSUB data;ST(0)=ST(0)-data FSUBR data;ST(0)=data-ST(0)FSUB ST(3),ST(0);指令执行后,ST(3)=ST(3)-ST(0)FSUBR ST(3),ST(0);指令执行后,ST(3)=ST(0)-ST(3)3、操作符的第2 个字母是 I:表示内存操作数是整数(注意:不能是 BYTE 类型)。它对加、减、乘、除指令以及堆栈操作指令都有效。FIADDdata 整数加法,它表示内存单元data是一个整数,把该整数加到栈顶的浮点数上(ST(0)=ST(0)+data)。4、操作符的第二个字母是B:表示
4、用于操作压缩的BCD 码格式的内存操作数(用TWORD 声明,10 个字节),如 FBLD 和 FBSTP等。5、操作符的第2 个字母是 N:表示在指令执行之前检查非屏蔽数值性错误。如:FSAVE 和 FNSAVE 等,前者称为等待形式(wait version),后者称为非等待形式(no-wait version)。在使用.8087 伪指令情况下,汇编程序会在等待形式的指令前面加上指令 WAIT,而在非等待形式的指令前面加上空操作指令NOP。理解了上述操作符命名规则,就能很容易地区分同类指令之间的差异。二数据传送指令名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 23 页 -为
5、了满足协处理器和CPU 之间进行数据交流的需求,就需要实现内存单元和协处理器之间进行数据传送的指令。协处理器的指令系统中有三大类数据传送指令:BCD 传送指令、数传送指令和浮点数传送指令。(一)、BCD 传送指令1、FBLD 指令格式:FBLDMemBCD 指 令 功能:将操 作数 中 的BCD 数 据压 入 协处 理 器的 堆栈 中(ST(0)=MemBCD);MemBCD 是 TWORD 类型的内存变量。2、FBSTP 指令格式:FBSTPMemBCD 指令功能:将协处理器中的BCD 数据存入内存(MemBCD=ST(0),并进行堆栈的弹出操作。例如:.387 data1 DT123,-5
6、43 data2 DT2.5 FBLD data1 FBSTP data;把 data1压进栈(ST(0)=data1);把当前堆顶数据弹出,并传送给data(data=ST(0)名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 23 页 -(二)、整数传送指令1、FILD 指令格式:FILDMemInt;ST(0)=MemInt 其中:MemInt 是定义为整型数据类型的内存单元,但不能是用 BYTE定义的存储单元。下同,不再叙述。2、FIST/FISTP 指令格式:其中:指令功能:FISTMemInt FISTPMemInt Mem是 定 义 整 型 数 据 类 型 的 内 存
7、 单 元,(用WORD,DWORD 和 QWORD 定义)。将协处理器堆栈栈顶的数据传送到目标存储单元中。在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成整型数据。而 FIST 与 FISTP 的区别在以前就讲过,在执令后加P 的表示带有出栈操作。那么FIST 的功能是 MemInt=ST(0),但 ST(0)不出栈,但FISTP 则在进行传送之后再进行对栈顶进行出栈。(三)、浮点数传送指令1、FLD 指令格式:FLDSTReg/MemReal 指令功能:名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 23 页 -将浮点数据压入协处理器的堆栈中。当进行
8、内存单元内容压栈时,系统会自动决定传送数据的精度。比如:用DD 或 REAL4 定义的内存单元数值是单精度数等。STReg是处理器堆栈寄存器ST(0)ST(7)。例如:.387 data1 DWORD123,-543 data2 REAL8-321.5 data3 REAL102.5 FLD data1;压一个单精度数据进栈FLD data2;压一个双精度数据进栈FLD ST(0);把堆栈寄存器 ST(0)的值再压进栈FLD data3;压一个扩展精度数据进栈2、FST 指令格式:指令功能:FST STReg/MemReal 将协处理器堆栈栈顶的数据传送到目标操作数中。在进行数据传送时,系统自
9、动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成相应精度的数据。3、FSTP 指令格式:FSTP STReg/MemReal 指令功能:与 FST 相类似,所不同的是:指令FST 执行完后,不进名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 23 页 -行堆栈的弹出操作,即:堆栈不发生变化,而指令FSTP执行完后,则需要进行堆栈的弹出操作,堆栈将发生变化。从上面的浮点传送指令中可以看出,不仅可以对内存变量进行传送,也可以进行寄存器之间的传送,这一点是整型数据以及BCD 型数据传送指令所不具有的。4、FXCH 指令格式:指令功能:FXCHSTReg 将指定的寄存器中的浮点数与堆
10、顶浮点数进行交换。如果不指定操作数,那么,默认ST(0)和 ST(1)二者之间交换数据。例如:FXCH ST(2)ST(0)与堆栈寄存器 ST(2)进行数据交换。由于 FXCH 指令隐含 ST(0)作为其中的一个操作数,所以其后只需指定一个操作数,但该操作数必须是寄存器,而且不能为ST(0),但是该指令后的寄存器是可选的,如果没有指定寄存器操作数,那么隐含是对 ST(1)和 ST(0)进行交换。对数据传送指令的一点总结:它包括三种数据的传送指令,整型,压缩的 BCD 型以及实型,三种数据的传送有各自的指令集。压缩的BCD 传送指令仅有压栈以及弹栈两条:FBLD以及FBSTP,它们都仅有一个操作
11、数,而且操作数必须是内存操作数的TWORD 类型。整型数据传送指令有三条:FILD、FIST 和 FISTP,其中后两条是出栈,唯一的区别在于出栈后是否改变(弹出)栈顶数据。它们都名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 23 页 -仅有一个操作数,而且操作数必须是内存操作数的WORD、DWORD以及 QWORD 类型,不能为 BYTE 类型。相对来讲,实数传送指令比较多,它一共有四条:FLD、FST、FSTP 和 FXCH。前三条指令的用法与整型类似,只不过用于传送实型数据,而且三条指令不仅支持内存操作数(为REAL4、REAL8 和REAL10 类型),而且支持寄存器之
12、间的传送。三条指令同样需要一个操作数。而对于FXCH 指令,它可以有一个或者没有操作数,但如果有操作数,那么这个参数必须为寄存器。三.算术运算指令在协处理器的指令系统中,有关数学运算指令有:加法指令、减法指令、乘法指令、除法指令和求平方根指令等。涉及数学运算的指令有比例运算、舍入运算、求绝对值运算和改变数值符号运算等指令。(一)、整型算术运算指令指令格式:FIADD MemInt;加法指令FISUB MemInt;减法指令FISUBR MemInt;减法指令FIMUL MemInt;乘法指令FIDIV MemInt;除法指令FIDIVR MemInt;除法指令名师资料总结-精品资料欢迎下载-名
13、师精心整理-第 7 页,共 23 页 -指令说明:由于整型算术运算指令都仅有一个操作数,那么另一个操作数就被隐含成 ST(0),而运算结果也被保存在ST(0)中。加和乘都仅有一条指令,它们的运算规则为:ST(0)=ST(0)+MemInt ST(0)=ST(0)*MemInt 但减法和除法都分别有两条指令,后面带R 的指令是在运算之前先交换源/目的操作数的位置再进行运算。由于在加法和乘法运算中交换两个操作数的位置的运算结果是一样的,所以不存在加R 的情况。减法和除法的运算规则为:ST(0)=ST(0)-MemInt;相对于 FISUB 指令。ST(0)=MemInt-ST(0);相对于 FIS
14、UBR 指令。ST(0)=ST(0)/MemInt;相对于 FIDIV 指令。ST(0)=MemInt/ST(0);相对于 FIDIVR 指令。综上所述,在进行整型算术运算中,仅须指定一个内存操作数就可以了,另一个操作数则默认为是ST(0),并且结果也存放在ST(0)中。(二)、实型算术运算指令1.不带弹出操作的算术运算指令。指令格式:FADD STReg1,STReg2;加法指令。FADD MemReal;加法指令。名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 23 页 -FSUB STReg1,STReg2;减法指令FSUB MemReal;减法指令FSUBR STReg1
15、,STReg2;减法指令FSUBR MemReal;减法指令FMUL STReg1,STReg2;乘法指令FMUL MemReal;乘法指令FDIV STReg1,STReg2;除法指令FDIV MemReal;除法指令FDIVR STReg1,STReg2;除法指令FDIVR MemReal;除法指令上面的指令可以分为带R 和不带 R,区别在以前就讲过。从上面的格式可以看出,它们都有三种使用格式:(1)不带任何操作数。如果不带操作数,那么FPU 就默认为 ST(1)作为目的操作数,而ST(0)作为源操作数。但这种情况下有一个弹出的动作,如:.DATA Val1 REAL8 3.14 Val2
16、 REAL8 4.13.CODE FLD Val1;ST(0)=3.14 FLD Val2;ST(0)=4.13 ST(1)=3.14 FSUB;ST(1)=ST(1)-ST(0)=3.14-4.13=-0.99,再弹出 ST(0)名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 23 页 -也就是说执行过程是ST(1)=ST(1)op ST(0),再将 ST(0)弹出,那么ST(1)就变成 ST(0),而原来的 ST(0)就被弹出了。这一点是初学者最容易忘记的地方,在不带有P 的算术运算指令进行实数运算,并且不指定任何操作数的时候,指令默认有一个弹出操作。但这个规则仅用于实型算术
17、运算,因为整型算术运算有一个操作数。(2)带有一个操作数。从上面的指令格式可以看出,如果带有一个操作数,那么这个操作数必须是内存操作数,在这种情况下,将ST(0)与该操作数进行运算,不管源/目的操作数位置如何,结果都存入ST(0)中(注意:这种情况没有弹出动作)。例如:.DATA Val1 REAL8 3.14 Val2 REAL8 4.13.CODE FLD Val1;ST(0)=3.14 FSUB Val2;ST(0)=ST(0)-Val2=3.14-4.13=-0.99 而在上面的 FSUB 带一个 R 的话,即FSUBR Val2 那么就进行 ST(0)=Val2-ST(0)的运算。(
18、3)带两个操作数。如果带有两个操作数,那么两个操作数必须都为寄存器,而且其中一个寄存器必须为ST(0)。结果存入目的寄存器中,同样这种情况名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 23 页 -不带弹出动作。例如:.DATA Val1 REAL8 3.14 Val2 REAL8 4.13.CODE FLD Val1;ST(0)=3.14 FLD Val2;ST(0)=4.13,ST(1)=3.14 FSUB ST(0),ST(1)那么,ST(0)=ST(0)-ST(1)=4.13-3.14=0.99,但 ST(1)的值不变,还是为 3.14。如果写成:FSUB ST(1),
19、ST(0)那么,ST(1)=ST(1)-ST(0)=3.14-4.13=-0.99,而 ST(0)值不变。2.带弹出操作的算术运算指令指令格式:FADDP STReg,ST;加法指令FSUBP STReg,ST;减法指令FSUBRP STReg,ST;减法指令FMULP STReg,ST;乘法指令FDIVP STReg,ST;除法指令FDIVRP STReg,ST;除法指令由于所有的指令都带P,那么都有弹出动作,从指令格式中可以看出,它们都有两个操作数,而且俩操作数都是寄存器,源操作数都名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 23 页 -是 ST(0)寄存器,而目的操作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年协处理器指令系统参照 2022 处理器 指令系统 参照
限制150内