2016-10-02 63 views
0

有沒有辦法手動更改每個標誌?或者你是否必須使用一個結果,你知道會改變它們的命令?更改標誌手動組裝8086

基本上我用命令RCL工作,我不希望在開始時拿到1,所以我想給CF改變爲0,我知道我可以使用命令,如:

mov al, 0 
shl al, 1 

但我想知道是否有任何其他方式做到這一點,而不使用其他命令的結果。
而且我想知道你是否會教我的方式,實際上可以改變所有的標誌,而不僅僅是CF,OF,ZF等等。

+0

也許sahf/popf? – Leeor

+0

是的,你是對的!非常感謝你!你幫了我很多 – Argaman

+0

Carry有專門的指示(回答),但如果你很幸運,有時你可以重新排序你的代碼,例如,如果你碰巧在rcr之前做了一些和/或/ xor,它會使CF = 0。組裝「打高爾夫球」的一部分是在可能的情況下以即使副產品可重複使用的方式排列您的指令。但是這樣的代碼很難閱讀和理解,所以'clc'完全適合你。如果你需要改變標誌(RCL是一個有效的需求),那麼很可能CPU有某種方式,整個指令集很好地協同工作(儘管有時並不明顯)。 – Ped7g

回答

1

沒有任何指令將eflags視爲可讀寫的GP寄存器。
引用英特爾:

一些在EFLAGS寄存器中的標誌,可以使用專用的指令(在 以下部分中描述)直接修改。 沒有說明允許整個寄存器直接被檢查或修改
以下指令可用於將標誌組移入和移出程序堆棧或EAX寄存器:
LAHF,SAHF,PUSHF,PUSHFD,POPF和POPFD。在EFLAGS寄存器的內容被傳送到 程序堆棧或EAX寄存器之後,可以使用處理器的位操作指令(BT,BTS,BTR和BTC)檢查和修改標誌。

eflags寄存器被分成三組:狀態標誌控制標誌系統標誌

eflags content

狀態標誌CF可以直接與clcstccmc來操縱。
沒有讀取CF的指令,但您可以用cmovcc,adc,setcc等指令間接讀取它。 所有其它標誌需要用專門定製算術指令或通過應對的狀態組內容的eflagsah(與lahf)或疊層(帶pushfd)被修改,並且比回eflags(與sahfpopfd)。

控制標誌組僅存在DF可與cldstd來操縱。
要讀取當前值DF,您需要使用pushfd

系統標記通常通過執行某些特權操作(如切換任務,進入v86模式等)來間接操作。
如果可以用clisti直接操縱。
所有其他標誌只能用pushfd/popfd來操縱。


參考:

  • 在64位模式中的標誌寄存器是rflags但較高的32位被保留爲止,從而rflags作爲eflags處理。
  • pushfd將棧推入eflags。還有一個16位版本pushf只推動eflags的低16位。與popfd/popf相同。
  • lahf/sahf只複製狀態標誌。

英特爾手冊,第1卷,第3.4.3節。

+0

非常感謝你 – Argaman