2017-06-24 53 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;

這是不正確的。