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