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
前缀。
关于assembly - MASM 不会插入带有某些 CPU 和 FPU 指令组合的 x87 WAIT 前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65418457/