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

MASM doesn't insert x87 WAIT prefixes with some combinations of CPU and FPU directives

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 指令。仅当您想观察 FPU 执行的存储或异常时才需要显式 WAIT 前缀。

因此,当CPU选择的是80286或更高版本时,汇编器通常会忽略WAIT前缀。为其生成 WAIT 前缀的指令是可以丢弃或影响挂起的浮点异常的指令。生成 WAIT 前缀以确保在指令执行之前传递任何浮点异常。如果不需要,通常可以使用这些指令前缀 FN 而不是 F 的单独变体。

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