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

问题描述

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 前缀。

For this reason,assemblers generally leave out WAIT prefixes when the CPU selected is an 80286 or later.为其生成 WAIT 前缀的指令是可能丢弃或影响未决浮点异常的指令。生成 WAIT 前缀以确保在指令执行之前传递任何浮点异常。如果不需要,这些指令前缀的单独变体通常可用 FN 而不是 F

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...