欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年协处理器指令系统参照 .pdf

    • 资源ID:42691684       资源大小:196.88KB        全文页数:23页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年协处理器指令系统参照 .pdf

    协处理器指令系统协处理器共有68 条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC 指令,ESC 指令代表了协处理器的操作码。协处理器指令在执行过程中,需要访问内存单元时,CPU 会为其形成内存地址。协处理器在指令执行期间内利用数据总线来传递数据。80287 协处理器利用I/O 地址 00FAH00FFH 来实现其与 CPU之间的数据交换,而80387Pentium 系列芯片,则是利用I/O 地址800000FAH800000FFH 来实现这两者之间的数据交换。一指令操作符的命名规则协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:1、在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作,弹出栈顶数据以后要对其它的寄存器进行相应的调整。如:FADDP/FSUBP/FSUBRP/FMULP/FDIVP/FDIVRP 等;2、在操作符后面加上字母R:表示将两个操作数的源/目的位置交换再进行运算,它仅限于减法、除法指令,因为加法和乘法不受源/目的操作数的位置影响结果。如:FSUBR 和 FDIVR 等;不加 R 时 目的操作数=目的操作数op 源操作数加 R 模式 目的操作数=源操作数op 目的操作数假设:栈顶数据st(0)为 10,内存变量 data的值为 1,分别执行下列名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 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:表示用于操作压缩的BCD 码格式的内存操作数(用TWORD 声明,10 个字节),如 FBLD 和 FBSTP等。5、操作符的第2 个字母是 N:表示在指令执行之前检查非屏蔽数值性错误。如:FSAVE 和 FNSAVE 等,前者称为等待形式(wait version),后者称为非等待形式(no-wait version)。在使用.8087 伪指令情况下,汇编程序会在等待形式的指令前面加上指令 WAIT,而在非等待形式的指令前面加上空操作指令NOP。理解了上述操作符命名规则,就能很容易地区分同类指令之间的差异。二数据传送指令名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 23 页 -为了满足协处理器和CPU 之间进行数据交流的需求,就需要实现内存单元和协处理器之间进行数据传送的指令。协处理器的指令系统中有三大类数据传送指令:BCD 传送指令、数传送指令和浮点数传送指令。(一)、BCD 传送指令1、FBLD 指令格式:FBLDMemBCD 指 令 功能:将操 作数 中 的BCD 数 据压 入 协处 理 器的 堆栈 中(ST(0)=MemBCD);MemBCD 是 TWORD 类型的内存变量。2、FBSTP 指令格式:FBSTPMemBCD 指令功能:将协处理器中的BCD 数据存入内存(MemBCD=ST(0),并进行堆栈的弹出操作。例如:.387 data1 DT123,-543 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是 定 义 整 型 数 据 类 型 的 内 存 单 元,(用WORD,DWORD 和 QWORD 定义)。将协处理器堆栈栈顶的数据传送到目标存储单元中。在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成整型数据。而 FIST 与 FISTP 的区别在以前就讲过,在执令后加P 的表示带有出栈操作。那么FIST 的功能是 MemInt=ST(0),但 ST(0)不出栈,但FISTP 则在进行传送之后再进行对栈顶进行出栈。(三)、浮点数传送指令1、FLD 指令格式:FLDSTReg/MemReal 指令功能:名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 23 页 -将浮点数据压入协处理器的堆栈中。当进行内存单元内容压栈时,系统会自动决定传送数据的精度。比如:用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 将协处理器堆栈栈顶的数据传送到目标操作数中。在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成相应精度的数据。3、FSTP 指令格式:FSTP STReg/MemReal 指令功能:与 FST 相类似,所不同的是:指令FST 执行完后,不进名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 23 页 -行堆栈的弹出操作,即:堆栈不发生变化,而指令FSTP执行完后,则需要进行堆栈的弹出操作,堆栈将发生变化。从上面的浮点传送指令中可以看出,不仅可以对内存变量进行传送,也可以进行寄存器之间的传送,这一点是整型数据以及BCD 型数据传送指令所不具有的。4、FXCH 指令格式:指令功能:FXCHSTReg 将指定的寄存器中的浮点数与堆顶浮点数进行交换。如果不指定操作数,那么,默认ST(0)和 ST(1)二者之间交换数据。例如:FXCH ST(2)ST(0)与堆栈寄存器 ST(2)进行数据交换。由于 FXCH 指令隐含 ST(0)作为其中的一个操作数,所以其后只需指定一个操作数,但该操作数必须是寄存器,而且不能为ST(0),但是该指令后的寄存器是可选的,如果没有指定寄存器操作数,那么隐含是对 ST(1)和 ST(0)进行交换。对数据传送指令的一点总结:它包括三种数据的传送指令,整型,压缩的 BCD 型以及实型,三种数据的传送有各自的指令集。压缩的BCD 传送指令仅有压栈以及弹栈两条:FBLD以及FBSTP,它们都仅有一个操作数,而且操作数必须是内存操作数的TWORD 类型。整型数据传送指令有三条:FILD、FIST 和 FISTP,其中后两条是出栈,唯一的区别在于出栈后是否改变(弹出)栈顶数据。它们都名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 23 页 -仅有一个操作数,而且操作数必须是内存操作数的WORD、DWORD以及 QWORD 类型,不能为 BYTE 类型。相对来讲,实数传送指令比较多,它一共有四条:FLD、FST、FSTP 和 FXCH。前三条指令的用法与整型类似,只不过用于传送实型数据,而且三条指令不仅支持内存操作数(为REAL4、REAL8 和REAL10 类型),而且支持寄存器之间的传送。三条指令同样需要一个操作数。而对于FXCH 指令,它可以有一个或者没有操作数,但如果有操作数,那么这个参数必须为寄存器。三.算术运算指令在协处理器的指令系统中,有关数学运算指令有:加法指令、减法指令、乘法指令、除法指令和求平方根指令等。涉及数学运算的指令有比例运算、舍入运算、求绝对值运算和改变数值符号运算等指令。(一)、整型算术运算指令指令格式:FIADD MemInt;加法指令FISUB MemInt;减法指令FISUBR MemInt;减法指令FIMUL MemInt;乘法指令FIDIV MemInt;除法指令FIDIVR MemInt;除法指令名师资料总结-精品资料欢迎下载-名师精心整理-第 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);相对于 FISUBR 指令。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,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 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 的算术运算指令进行实数运算,并且不指定任何操作数的时候,指令默认有一个弹出操作。但这个规则仅用于实型算术运算,因为整型算术运算有一个操作数。(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)的运算。(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),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)寄存器,而目的操作数是 ST(1)ST(7)中的任何一个,但不能是 ST(0)。在进行运算时,运算结果存入目的寄存器中(ST(1)ST(7)),然后对 ST(0)进行弹出,弹出后下面的所有寄存器都要作相应的调整,例如:.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 FSUBRP ST(1),ST(0)那么,结果是这样计算的:ST(1)=ST(0)-ST(1)=4.13-3.14=0.99并且将 ST(0)弹出,然后存放结果的ST(1)以及后续的寄存器就进行调整,那么此时 ST(1)就变成 ST(0)了,那么最后的结果存入ST(0)中,而原来的 ST(0)值 4.13则被移出。(三)、其它数学运算指令在协处理器中,除了完成具体的数学运算指令外,还设置了若干个与数学运算有关的运算指令。改变符号:FCHS 这个指令会改变ST(0)的正负值,如果原先ST(0)为正值,执行后变为负值;原先为负值,执行后为正值。可以用这个指令计算相反数。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 23 页 -绝对值:FABS 把 ST(0)之值取出,取其绝对值后再存回去。平方根:FSQRT 将 ST(0)之值取出,开根号后再存回去。FSCALE 指令这个指令是计算ST(0)*2ST(1)之值,再把结果存入ST(0)里而ST(1)之值不变。ST(1)必须是在-32768 到 32768(-215到 215)之间的整数,如果超过这个范围计算结果无法确定,如果不是整数ST(1)会先向零舍入 成整数再计算。所以为安全起见,最好是由整数载入到ST(1)里。FRNDINT 指令这个指令是把ST(0)的数值舍入成整数,FPU 提供四种舍入方式,由 FPU 的控制字组(control word)中的 RC 两个位决定,如下表:RC 舍入控制说明例子00 四舍五入向最近的整数逢四舍去,遇五进位4.8 5.04.8 5.0 4.2 4.04.2 4.0 01 取小于源数的最大整数正值舍去小数部分负值舍去小数部分后再减一4.8 4.04.8 5.0 4.2 4.04.2 5.0 10 取大于源数的最小整数正值舍去小数部分后再加一负值舍去小数部分4.8 5.04.8 4.0 4.2 5.04.2 4.0 名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 23 页 -11 向零对齐不论正负值均舍去小数部分4.8 4.04.8 4.0 4.2 4.04.2 4.0 FPREM 指令这个指令是求余数,较简略的说法是将ST(0)除以 ST(1)后的余数存回ST,ST(1)则不变(ST(0)=ST(0)%ST(1)。这个指令实际运作时,是以连续减法的方式求出余数。FXTRACT 指令这个指令称为抽取指数与有效数,是把ST(0)内的数值改成X*2Y,然后把Y 存回 ST(0)里,再把 X 压入堆栈,所以最后ST(0)为有效数,ST(1)为以 2 为底的指数。FXTRACT 与 FSCALE 恰好成相反运算。四.比较运算指令使用比较指令是将栈顶中的数(ST(0)与其它操作数进行比较,实现条件跳转。所谓条件跳转就是比较两数的大小,如果某数较大,就执行一段程序,若较小则执行另一段程序。在FPU 的指令集并没有能使FPU 跳转的指令,事实上FPU 也无法改变CPU 寄存器之值(还记得要改变程序执行地址必须改变CS:IP 之值),所以要产生FPU 条件跳转必须用间接方法。其步骤有四个:先用 FPU 的比较指令改变FPU 的状态寄存器寄存器。再用 FPU 的指令 FSTSW 把状态寄存器存入一个内存变量里。将此内存变量存入AH 寄存器,再用 CPU 指令 SAHF 指令存名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 23 页 -入 CPU 的标志寄存器里。此步骤使标志寄存器之值等于FPU 状态寄存器。再用 CPU 指令 JL/JG/JE/JA/JB 来跳转至正确处执行。状态寄存器FPU 有五类寄存器,前章已介绍过最常用的堆栈寄存器,这里将介绍状态寄存器(status register)。状态寄存器是一个16 位的寄存器,表示FPU 的状态,所谓状态是指FPU 是不是在忙碌中、是否除以零、是否无效运算、现在堆栈顶端是那一个堆栈寄存器等等,在此处我们要注意的是四个状态码位,C0、C1、C2、C3。这些位分布如下图:1514 13 12 11 10 9 87 6 5 4 3 2 1 0B C3TOPC2C1C0ESSFPE UE OE ZE DE IE比较指令:FCOM、FCOMP、FCOMPP、FICOM、FICOMP 标题所见的这些比较指令都是以堆栈顶(ST(0)为目的操作数,而源操作数可以是内存变量或是其它的堆栈寄存器,例如:FCOM ST(0),ST(1)FCOM ST(0),x 上述第一例是比较ST(0)和 ST(1)之数值,第二例是比较ST(0)和内存变量x 之数值,而这内存变量的形态可以是短实数和长实数。因为 FCOM 等指令均以ST(0)为目的操作数,所以 ST(0)是可以省略不写的,例如上述两例,可以写成下面的样子,名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 23 页 -FCOM ST(1)FCOM x 结果是一样的。假如ST(0)的比较对象是ST(1)的话(源操作数是 ST(1),连 ST(1)也可以省略。至于FCOMP 和 FCOMPP 分别是比较后弹出一次和弹出两次,这里弹出的数会丢失而不会存入内存中,这点和 FSTP 不同。而 FICOM 和 FICOMP 是用来比较整数的,而源操作数可以是字和双字整数,但不能是寄存器,至于目的操作数默认为是 ST(0)。FPU 的比较指令会改变状态寄存器的C3 和 C0 位,比较后跟据 ST(0)和源操作数的大小,设置C3 和 C0 标志位如下表所示:比较结果C3 C0 ST(0)源操作数0 0 ST(0)源操作数0 1 ST(0)=源操作数1 0 ST(0)不可比较1 1 FSTSW 指令FSTSW(store status register)这个指令的功能是把状态寄存器取出并存入内存变量里,而这个内存变量必须是16 位的内存变量。其语法是:FSTSW mem16 SAHF 指令名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 23 页 -SAHF 是 8088 指令集中的一个指令,并非FPU 指令。这个指令是把AH 寄存器中的值移到标志寄存器的较低的8 个位,这8 个位只有第七、六、四、二、零位有用,第五、三、一位没有使用。如下图所示:所以假如AH 为 0100 0000B,则执行SAHF 指令后,零标志会被设为一。所以,跳转指令其实是仅仅看标志寄存器的设定值决定如何跳转,至于标志寄存器如何设定(人为还是机器指令运行结果),在跳转指令执行时是不会理会的。FPU 的状态寄存器里的C3 和 C0 位,经FSTSW 指令传到16 位内存变量,再传到AX 寄存器里,AH 的第 6 和 0 位(ZF 和CF)就是表示 C3 和 C0 位,再由 SAHF 指令移到标志寄存器,其对应的位是零标志与进位标志,所以只要检查这两个标志就可以比较ST(0)与源操作数的大小,而决定跳转方向。FTST 和 FXAM 指令FTST 栈顶数据 ST(0)与 0 进行比较。FXAM 检测栈顶数据 ST(0)是正数、负数,还是规格化数。两条指令都是无操作数指令,它们的的比较结果参考C3 和 C0值的那个表。五.常数操作指令FPU 里有7 个指令是用来把常用的常数压入堆栈顶称为常数名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 23 页 -指令。这些常数都是内建在FPU 里的数值,都属于暂时实数,其有效位数达19 位数,当程序需要用到时可以很快的加载,节省时间与内存。这7 个常数指令介绍如下:FLD1 载入 1.0。(把 1.0 压入堆栈顶)FLDZ 载入零。(把 0.0 压入堆栈顶)FLDPI 载入圆周率,3.141592653589793239。(把 压入堆栈顶)FLDL2T 载入Log210。(把Log210压入堆栈顶)FLDL2E 载入Log2e,e 是自然对数的底数。(把Log2e压入堆栈顶)FLDLG2 载入Log102。(把Log102压入堆栈顶)FLDLN2 载入Loge2,事实上Loge2等于 Ln 2。(把Loge2压入堆栈顶)六.超越函数运算指令所谓超越函数运算指令是指复杂的函数运算的指令。8087 有五个超越指令,一个用于指数,两个用于自然对数,另外两个用于三角函数的计算。对于 8087 的超越指令所输入的自变量和数学上的自变量不完全相同,例如求2 的 X 次方,在数学上X 可以是任意值,但用 8087 计算时 X 却只能在0 到 0.5 之间,如果要求2 的任意数次方得用程序来计算。假如在8087 程序中的自变量超过这个范围,会引起错误但是8087 却没有检查机制,所以要小心使用。名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 23 页 -F2XM1 指令这个指令是用来计算2ST-1然后将结果存回ST 里。F2XM1 里的 X 表示 ST 寄存器,M 表示减法之意,它的语法就是:F2XM1 不含任何操作数。这个指令运算之前还有一个限制,那就是X 必须是在0 到0.5 之间的实数才行,可以等于0 或0.5;在Pentium 等级及其以上,X 可以扩充到在0 到 1 之间。这个指令之所以要减一的目的是如果X 很小,则2X会很接近一,减去一可增加有效数。FYL2X 指令这个指令是用来计算ST(1)*Log2ST,这个指令会先弹出ST 然后以计算的结果取代ST 寄存器。这个指令的限制是ST 必须为正数。FYL2XP1 指令这个指令是计算ST*Log2(ST(1)+1),这个指令会先弹出ST 然后以计算的结果取代ST 寄存器,ST(1)必须是大于零且小于二分之根号二的数。这个指令在Log 后的数很接近一时,比FYL2X 有较好的准确度。FPTAN 指令这个指令用来计算tan(ST)之结果,而计算结果是以分数Y/X 的形式存入堆栈,计算后先把tan(ST)之值压入堆栈(当作 Y 值),再把 1(当作 X 值)压入堆栈,换句话说最后的结果是ST(1)为 tan(ST),名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 23 页 -ST 为 1。在 8087等级的 FPU 运算时,计算前 ST 必须是 0/4;如果在 Pentium 等级及其以上的CPU,除了计算前ST 须以弧度表示外,似乎没有范围限制。FPATAN 指令这个指令是用来计算arctan(ST(1)/ST)的,然后把计算结果以弧度表示存入 ST。整个计算过程是先弹出堆栈顶当做分母(X),再弹出新的堆栈顶(也就是原来的 ST(1)当做分子,计算 Y/X 之反正切函数,再把计算结果存回堆栈顶。如果是在8087 FPU 上运算,计算前ST 与 ST(1)必须为正值,而在Pentium 及其以上的CPU 则无此限制。在 80387 等级及其以上的FPU 还提供的更多的超越函数:FSIN 指令这是用来计算堆栈顶的正弦函数(sin),再把结果压入堆栈顶,计算前堆栈顶没有范围的限制,但要使用弧度,80387 等级及其以上的 FPU 才提供这个指令。FCOS 指令这是用来计算堆栈顶的余弦函数(cos),再把结果压入堆栈顶,计算前堆栈顶没有范围的限制,但要使用弧度,80387 等级及其以上的 FPU 才提供这个指令。FSINCOS 指令这个指令只有在80387 等级及其以上的FPU 才提供,它会弹出堆栈顶然后计算sin ST 与 cos ST 之值,然后把 sin ST 之结果压名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 23 页 -入堆栈寄存器,再把con ST 之结果压入堆栈寄存器,所以堆栈顶为余弦值,ST(1)为正弦值。七.协处理器控制指令协处理器控制指令是用来控制协处理器状态而设置的,它包括协处理器的 初始化、状态寄存器内容的存取、异常处理 和任务切换 等操作。FINIT/FNINIT 初始化协处理器,初始化后协处理器的状态如下表所示:协处理器初始化的状态控制项值状态含义控制位 IC 0 投影控制位 PC 10 扩展精度控制位 RC 00 最近舍入或偶数错误屏蔽11111 错误位关闭忙标志0 不忙C3C0?未定TOP 000 堆栈栈顶设定为寄存器0 ES 0 无错误错误位00000 无错误名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 23 页 -全部标记11 空寄存器-不改变FLDCW Mem16 将由操作数指定的字存储单元内容存储到控制寄存器中。FSTCW/FNSTCW Mem16 把控制寄存器的内容存储到由操作数指定的字存储单元。与指令“FLDCW”相对应。FSTSW Mem16 FSTSW AX FNSTSW Mem16 FNSTSW AX 将控制寄存器的内容传送到寄存器AX中。在 8087 协处理器中无此指令。FCLEX/FNCLEX 清除状态寄存器中的“错误”和“忙”标志。FSAVE Mem FNSAVE Mem 将全部机器状态存储到内存中。FRSTOR Mem 从内存复原机器状态,它可恢复由指令“FSAVE/FNSAVE”保存的信息。名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 23 页 -FSTENV Mem FNSTENVMem 存储协处理器环境。FLDENV Mem 重新装入由指令FSTENV/FNSTENV存储的协处理器环境。FINCST 堆栈指针加 1。FDECSTP 堆栈指针减 1。FFREE ST(i)释放堆栈寄存器,即使其标记为空,但其内容并没有改变。FNOP 协处理器的空操作FWAIT 使处理器处于等待状态,以便协处理器完成其操作。该指令主要用于在 CPU 访问被协处理器影响的内存数据之前。名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 23 页 -

    注意事项

    本文(2022年协处理器指令系统参照 .pdf)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开