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、FLDCWFLD、FST、FSTP、FXCH、FLDZ、FLD1、FLDPI、FLDL2E、FLDL2T,FLDLG2,FLDLN2,filt,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、fnni、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前缀。

相关内容

  • 没有找到相关文章

最新更新