如何解决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、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
前缀。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。