assembly - MASM 不会插入带有某些 CPU 和 FPU 指令组合的 x87 WAIT 前缀

标签 assembly x86 masm masm32 x87

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/

相关文章:

c - 汇编代码如何确定变量在堆栈中的位置?

assembly - 如何在MASM程序集中将十进制数转换为REAL10?

assembly - Objdump 在编译的程序集上将 fsubrp 交换为 fsubp?

assembly - 在不同 CPU 上表现不同的 X64 指令

assembly - 如何用汇编语言创建文本编辑器?

assembly - 汇编中的 int 10h , ah as 0d 始终返回 0 作为鼠标指针下像素的颜色

c++ - 我什么时候应该使用_mm_sfence _mm_lfence和_mm_mfence

javascript - assembly 模拟器Javascript

assembly - 在IvyBridge上的指针追逐循环中,附近的从属存储产生了奇怪的性能影响。添加额外的负载可以加快速度吗?

masm - 错误 A2105 : Expected : instruction or directive Assembly