[英]how to change flags manually (in assembly code) for 8086?
有沒有辦法手動更改每個標志? 或者你必須使用一個你知道會改變它們的結果的命令嗎?
基本上我正在使用命令RCL
,我不想在開始時獲得1,所以我想將CF更改為0,我知道我可以使用如下命令:
mov al, 0
shl al, 1
但我想知道是否有其他方法可以做到這一點,而不使用其他命令結果。
我還想知道你是否可以告訴我的方式,也可以用來改變所有的標志,不僅是CF,還有OF,ZF等等。
沒有任何指令將eflags
視為讀寫GP寄存器。
引用英特爾1 :
EFLAGS寄存器中的某些標志可以使用專用指令直接修改(在以下部分中描述)。 沒有指令允許直接檢查或修改整個寄存器 。
以下指令可用於將標志組移入和移出過程堆棧或EAX寄存器:
LAHF,SAHF,PUSHF,PUSHFD,POPF和POPFD。 在將EFLAGS寄存器的內容傳送到過程堆棧或EAX寄存器之后,可以使用處理器的位操作指令(BT,BTS,BTR和BTC)檢查和修改標志。
eflags
寄存器分為三組: 狀態標志 , 控制標志和系統標志 。
在Status標志中,只能使用clc
, stc
, cmc
直接操作CF.
沒有指令可以讀取CF,但您可以通過cmovcc
, adc
, setcc
等指令間接閱讀。 所有其他標志需要使用專門定制的算術指令進行修改,或者通過將eflags
的Status組內容eflags
到ah
(使用lahf
)或堆棧(使用pushfd
)而不是將其eflags
回eflags
(使用sahf
或popfd
)。
在控制標志組中,只有DF可以使用cld
和std
進行操作。
要讀取DF
的當前值,您需要使用pushfd
。
系統標志通常通過執行某些特權操作來間接操作,例如切換任務,進入v86模式等。
可以使用cli
和sti
直接操作IF 。
所有其他標志只能使用pushfd
/ popfd
進行操作。
以供參考:
rflags
但到目前為止保留了較高的32位,因此rflags
被處理為eflags
。 pushfd
推eflags
在堆棧中。 還有一個16位版本的pushf
只推送低16位的eflags
。 popfd
/ popf
。 lahf
/ sahf
只復制狀態標志。 1“ Intel手冊”第1卷第3.4.3節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.