簡體   English   中英

如何為8086手動更改標志(在匯編代碼中)?

[英]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標志中,只能使用clcstccmc直接操作CF.
沒有指令可以讀取CF,但您可以通過cmovccadcsetcc等指令間接閱讀。 所有其他標志需要使用專門定制的算術指令進行修改,或者通過將eflagsStatus組內容eflagsah (使用lahf )或堆棧(使用pushfd )而不是將其eflagseflags (使用sahfpopfd )。

控制標志組中,只有DF可以使用cldstd進行操作。
要讀取DF的當前值,您需要使用pushfd

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


以供參考:

  • 在64位模式下,標志寄存器是rflags但到目前為止保留了較高的32位,因此rflags被處理為eflags
  • pushfdeflags在堆棧中。 還有一個16位版本的pushf只推送低16位的eflags popfd / popf
  • lahf / sahf只復制狀態標志。

1“ Intel手冊”第1卷第3.4.3節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM