2017-01-20 36 views
-2

我不知道爲什麼,當我編譯這個大會POPF和RCL/RCR指令

mov ax , 0x00FF 
push ax 
popf 
rcr ax , 1 

我得到807F作爲答案。我知道popf將堆棧的頂部移動到標誌寄存器中,但它是如何影響CF的?它只插入第一個或最後一個被移動的單詞?

+2

你爲什麼不諮詢指令集的參考? EFLAGS的最低位是'CF',所以是從那裏開始設置的。取決於你如何看待它,它是第一個或最後一個位:) – Jester

+0

它完全用您從AX推送的內容覆蓋標誌。 –

+0

使用調試器。它會顯示寄存器的值以及* real *中的每個標誌的值。爲獲得最佳效果,請結合指令集文檔(Google爲指令名稱+ x86)。 –

回答

1

在使用popf之前,您已經推送了一個設置了8位的值。這些設置位中僅有5個將有效地改變一些處理器標誌。

後直接popf的EFLAGS的最低字寄存器這個樣子的:

-- NT IO/PL OF DF IF TF SF ZF -- AF -- PF -- CF 
0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 
          ^ ^ ^
           These bits you are not allowed to change 

從圖中得出,進位標誌設置完畢。由於rcr ax, 1指令將CF移入仍保持0000000011111111(00FFh)的AX寄存器的第15位,結果變爲1000000001111111(807Fh)。 CF仍然/再次設置,因爲AX寄存器中的舊位0被放在那裏。