2017-06-24 62 views
3
section .data 
    qVar1: dq 1 


section .bss 
    var28: resb 28 


section .text 
    _main: 

     ; Use an MMX instruction 

      movq mm0, [qVar1] ; Move quadword from r/m64 to mm. 

     ; Read Tag Word 

      fstenv [var28] 
      mov ax, [var28 + 8] ; move the Tag Word to ax 

此时ax0101 0101 0101 0110MMX指令,且x87 FPU标记字

但是从英特尔手册,章节9.5.1 MMX指令,且x87 FPU标记字,我引用:

每个MMX指令之后,整个的x87 FPU标记字设置为有效(00B)。

那么为什么ax不是全零?

回答

5

你报的部分继续说:

第12章,“英特尔®MMX™技术系统编程,”英特尔®64和IA-32架构软件 开发者手册,卷3A,提供有关的x87 FPU对的x87 FPU标记字的影响和MMX指令的附加信息。

在第三手动的事实部12.2澄清:

当MMX指令写入一个值的MMX寄存器,同时,通过对应的浮点寄存器的79位64被设置为全1。

指令movq mm0, [qVar1]然后设置寄存器R0到0xffff_00000000_00000000是从80387开始无效double extended precision浮点值(先前是一个正无穷大)。
这将在以后重要。

fstenv指令不是保存实际标签字,而是解释寄存器和实际标签字来计算将存储在存储器中的标签字。
标签字寄存器然后被复位为空的所有寄存器。

fstenv上的x87 FPU标记字的效果是:

标签和寄存器值被读出和解释 ;那么所有的标签都被设置为11B。

,并存储在存储器中的的x87 FPU标记字的图像是:

标签是根据在浮点寄存器的实际值 设置; 即,空的寄存器被标记11B 和有效寄存器被标记为00B (非零),01B(零),或10B(特殊)。

Effects of the MMX and x87 instructions on the x87 FPU tag word

如果你之前的任何XMM代码中使用emms标签都将11B(空)。
只要movq mm0, [qVar1]执行完毕,所有标签都被设置为00b(有效)。
当执行fstenv时,寄存器被标记为非空并分析它们的内容:所有寄存器R1-R7看起来都是零,而R0如前所见,在存储器中存储的图像中包含特殊值及其标记因此是10b(特殊)。

在第二手册fstenv该条目得承认写下来作为

操作
DEST [FPUControlWord]←FPUControlWord其伪代码欺骗;
DEST [FPUStatusWord]←FPUStatusWord;
DEST [FPUTagWord]←FPUTagWord;
DEST [FPUDataPointer]←FPUDataPointer;
DEST [FPUInstructionPointer]←FPUInstructionPointer;
DEST [FPULastInstructionOpcode]←FPULastInstructionOpcode;

这是不正确的。