协处理器指令系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
协处理器指令系统
协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。
协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。协处理器在指令执行期间内利用数据总线来传递数据。80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU 之间的数据交换,而80387~Pentium系列芯片,则是利用I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。
一.指令操作符的命名规则
协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:
1、在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作,弹出栈顶数据以后要对其它的寄存器进行相应的调整。如:FADDP/FSUBP/FSUBRP /FMULP/FDIVP /FDIVRP等;
2、在操作符后面加上字母R:表示将两个操作数的源/目的位置交换再进行运算,它仅限于减法、除法指令,因为加法和乘法不受源/目的操作数的位置影响结果。如:FSUBR和FDIVR等;
不加R时——目的操作数=目的操作数op 源操作数
加R模式——目的操作数=源操作数op 目的操作数
假设:栈顶数据st(0)为10,内存变量data的值为1,分别执行下列
指令将有不同的结果。
F SUB data ; ST(0)=ST(0)-data
F SUBR data ;ST(0)=data-ST(0)
F SUB ST(3), ST(0) ;指令执行后,ST(3)=ST(3)-ST(0)
F SUBR ST(3), ST(0) ;指令执行后,ST(3)=ST(0)-ST(3)
3、操作符的第2个字母是I:表示内存操作数是整数(注意:不能是BYTE类型)。它对加、减、乘、除指令以及堆栈操作指令都有效。
FIADD data ——整数加法,它表示内存单元data是一个整数,把该整数加到栈顶的浮点数上(ST(0)=ST(0)+data)。
4、操作符的第二个字母是B:表示用于操作压缩的BCD码格式的内存操作数(用TWORD声明,10个字节),如FBLD和FBSTP 等。
5、操作符的第2个字母是N:表示在指令执行之前检查非屏蔽数值性错误。如:FSA VE和FNSA VE等,前者称为等待形式(wait version),后者称为非等待形式(no-wait version)。
在使用.8087伪指令情况下,汇编程序会在等待形式的指令前面加上指令WAIT,而在非等待形式的指令前面加上空操作指令NOP。
理解了上述操作符命名规则,就能很容易地区分同类指令之间的差异。
二.数据传送指令
为了满足协处理器和CPU之间进行数据交流的需求,就需要实现内存单元和协处理器之间进行数据传送的指令。协处理器的指令系统中有三大类数据传送指令:BCD传送指令、数传送指令和浮点数传送指令。
(一)、BCD传送指令
1、FBLD
指令格式:FBLD MemBCD
指令功能:将操作数中的BCD数据压入协处理器的堆栈中(ST(0)=MemBCD);MemBCD是TWORD类型的内存变量。
2、FBSTP
指令格式:FBSTP MemBCD
指令功能:将协处理器中的BCD数据存入内存(MemBCD=ST(0)),并进行堆栈的弹出操作。
例如:
.387
d ata1 DT123, -543
d ata2 DT 2.5
……
F BLD data1 F BSTP data ;把data1压进栈(ST(0)=data1)
;把当前堆顶数据弹出,并传送给data (data=ST(0))
(二)、整数传送指令
1、FILD
指令格式:FILD MemInt ;ST(0)=MemInt
其中:MemInt 是定义为整型数据类型的内存单元,但不能是用BYTE 定义的存储单元。下同,不再叙述。
2、FIST/FISTP
指令格式:
其中:
指令功能: FIST MemInt
FISTP MemInt Mem 是定义整型数据类型的内存单元,(用WORD,DWORD 和QWORD 定义)。
将协处理器堆栈栈顶的数据传送到目标存储单元中。在进
行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成整型数据。
而FIST 与FISTP 的区别在以前就讲过,在执令后加P 的表示带有出栈操作。那么FIST 的功能是MemInt=ST(0),但ST(0)不出栈,但FISTP 则在进行传送之后再进行对栈顶进行出栈。
(三)、浮点数传送指令
1、FLD
指令格式:
FLD STReg/MemReal
指令功能:
将浮点数据压入协处理器的堆栈中。当进行内存单元内容压栈时,系统会自动决定传送数据的精度。比如:用DD 或REAL4定义的内存单元数值是单精度数等。
STReg 是处理器堆栈寄存器ST(0)~ST(7)。
例如:
.387
data1 DWORD 123, -543
data2 REAL8 -321.5
data3 REAL10 2.5
……
FLD data1 ;压一个单精度数据进栈
FLD data2 ;压一个双精度数据进栈
FLD ST(0) ;把堆栈寄存器ST(0)的值再压进栈
FLD data3 ;压一个扩展精度数据进栈
2、FST
指令格式: 指令功能: FST STReg/MemReal
将协处理器堆栈栈顶的数据传送到目标操作数中。在进行
数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成相应精度的数据。
3、FSTP
指令格式: F STP STReg/MemReal
指令功能: 与FST 相类似,所不同的是:指令FST 执行完后,不进