MASM不会插入带有某些CPU和FPU指令组合的x87WAIT前缀

Masm 允许在指令前使用不同的 cpu 组合,但某些组合不能正确检测需要等待前缀的协处理器指令,并且在需要等待前缀时将导致没有等待前缀。以下组合将导致它们之后的任何数学协处理器指令没有等待前缀:

    example 1:
     .386
     .8087
     ;now enter math coprocessor instruction
    example 2:
     .286
     .8087
     ;now enter math coprocessor instruction
    example 3:
     .386
     .287
     ;now enter math coprocessor instruction

如果然后使用数学协处理器指令,则不会创建等待前缀(通常由 MASM 创建)。以下是在应该有等待前缀时不会有等待前缀的说明:

FRSTOR、FFREE、FDECSTP、FINCSTP、FLDENV、FLDCW FLD、FST、FSTP、FXCH、FLDZ、FLD1、FLDPI、FLDL2E、FLDL2T、FLDLG2、FLDLN2、FILD、FIST、FISTP、FBLD、FBSTP、FCOM、FCOMP、FCOMPP、FICOM ,FICOMP,FXAM,FADD,FADDP,FMUL,FMULP,FSUB,FSUBP,FSUBR,FSUBRP,FDIV,FDIVP,FDIVR,FDIVRP,FABS,FCHS,FSQRT,FRNDINT,FIADD,FIMUL,FISUB,FISUBR,FIDIV,FIDIVR,FPTAN ,FPATAN,F2XM1,FSCALE, FYL2X,FYL2XP1,FPREM,FPREM1,FXTRACT,FSETPM 和 FNOP

这些指令不受影响:

FCLEX、FNCLEX、FSAVE、FNSAVE、FENI、FNENI、FDISI、FNDISI、FSTENV、FNSTENV、FINIT、FNINIT、FSTSW、FNSTSW、FSTCW 和 FNSTCW

这是一个错误吗?我没有找到提到这种行为的文档。我没有更高版本的 MASM 来查看是否已修复。我的版本是 masm v6。

回答

只有 8087 需要WAIT在每个浮点指令前加上前缀(除非您手动计算周期以确保经过足够的时间来完成操作)。从 80286 和 80287 开始,主处理器将等待协处理器操作完成,然后才自行发出任何 FPU 指令,而无需依赖WAIT指令。WAIT仅当您想观察 FPU 执行的存储或异常时才需要显式前缀。

For this reason, assemblers generally leave out WAITprefixes when the CPU selected is an 80286 or later. 为其WAIT生成前缀的指令是可以丢弃或影响未决浮点异常的指令。一个WAIT生成的前缀,以确保任何浮点异常的指令执行前交付。如果不需要,通常可以使用这些指令前缀的单独变体FNF不是。

8087 协处理器不能与 80286 或更高版本的主处理器一起使用,因此我认为 MASM 将该.8087指令视为“存在协处理器”而不是“存在 8087”。因此,只有选择的主处理器才能区分是否WAIT发出前缀。


以上是MASM不会插入带有某些CPU和FPU指令组合的x87WAIT前缀的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>