问题描述
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
前缀。