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