Win32ASM學習[9]: 標志寄存器

?

TF(Trap Flag)——位8,跟蹤標志。置1 則開啟單步執行調試模式,置0 則關閉。在單步執行模式下,處理器在每條指令后產生一個調試異常,這樣在每條指令執行后都可以查看執行程序的狀態。如果程序用POPF、POPFD 或者ET 指令設置TF 標志,那么這之后的第一條指令就會產生調試異常。

?

IF (Interrupt enable)——位9,中斷許可標志。控制處理器對可屏蔽硬件中斷請求的響應。置1 則開啟可屏蔽硬件中斷響應,置0 則關閉可屏蔽硬件中斷響應。IF 標志不影響異常和不可屏蔽中斷(NMI)的產生。CPL、IOPL 和控制寄存器CR4 中的VME 標志決定著IF 標志是否可由CLI、STI、POPF、POPFD 和IRET 指令修改。

?

IOPL(I/O Privilege Level Field)——位12&位13, I/O 特權域。標示當前進程或任務的I/O 特權級別。當前進程或任務的CPL 必須小于或等于IOPL 才可以訪問I/O 地址空間。只有CPL 為0 的進程才可用POPF 和IRET 指令修改這個域。IOPL 是控制IF 標志修改的機制之一,同時也是當虛擬模式擴展生效時(控制寄存器CR4 中的VME 置位),控制虛擬8086 模式下中斷處理的機制之一。

?

NT (Nested?Task)——位14,嵌套任務。控制被中斷和被調用的任務的嵌套執行鏈。處理器調用一個由CALL 指令、中斷或者異常觸發的任務時設置該位,調用IRET指令返回時檢測并修改該位。該標志可以由POPF/POPFD 指令直接置位或置0,然而在應用程序中修改該標志的狀態會產生不可預料的異常。

?

RF(Resume)——位16, 恢復。控制處理器對指令斷點的響應。置1 則暫時禁用指令斷點產生調試異常(debug exceptions,#DE),但是其它異常情況仍可以產生異常。置0 則指令斷點產生調試異常。RF 標志的主要功能是許可從調試異常(指令斷點引發的)后面的那個指令開始繼續執行。調試軟件必須在用IRETD 指令返回到被中斷程序之前,將棧中的EFLAGES 映象中的該位置為1,以阻止指令斷點產生另外的調試異常。在返回并成功執行斷點指令之后,處理器會自動清零該位,從而許可繼續產生指令斷點故障。

?

VM (Virtual-8086 mode)——位17,虛擬8086 模式。置1 則進入虛擬8086 模式,置0 則返回保護模式。

?

AC (Alignment check)——位18,對齊檢查。置位該標志和控制寄存器CR0 的AM 標志則啟用對內存引用的對齊檢查,清除這兩個標志則禁用對齊檢查。當引用一個沒有對齊的操作數時,將會產生一個對齊檢查異常,比如在奇地址引用一個字地址或在不是4 的倍數的地址引用一個雙字地址。對齊檢查異常只在用戶態(3 級特權)下產生。默認特權為0 的內存引用,比如段描述符表的裝載,并不產生這個異常,盡管同樣的操作在用戶態會產生異常。對齊檢查異常用于檢查數據的對齊,當處理器之間交換數據時這很有用,交換數據需要所有的數據對齊。對齊檢查異常也可供解釋程序使用。讓某些指針不對齊就好比做上特殊標記,這樣就無需對每個指針都進行檢查,只在用到的時候,對這些特殊指針進行處理就可以了。

?

VIF (Virtual Interrupt)——位19,虛擬中斷。是IF 標志的一個虛擬映象。這個標志是和VIP標志一起使用的。當控制寄存器CR4 中的VME 或者PVI 標志置為1 且IOPL小于3 時,處理器只識別VIF 標志(VME 標志用來啟用虛擬8086 模式擴展,PVI 標志啟用保護模式下的虛擬中斷)。

?

VIP (Virtual interrupt pending)——位20,虛擬中斷等待。置1 表明有一個正在等待處理的中斷,置0 表明沒有等待處理的中斷。該標志和VIF 一起使用。處理器讀取該標志但從來不修改它。當VME 標志或者控制寄存器CR4 中的PVI 標志置1 且IOPL 小于3 時,處理器只識別VIP 標志。(VME 標志啟用虛擬8086模式擴展,PVI 標志啟用保護模式虛擬中斷)。

?

ID (Identification)——識別(第21 位)。置1 或0 表明是否支持CPUID 指令。

?

其它的通用標志:

CF——進位標志

PF——恢復標志

AF——輔助標志

ZF——零標志

SF——負號標志

DF——方向標志

OF——溢出標志

?

上表是 32 位寄存器 EFLAGS 的低 16 位.
不能直接讀寫 EFLAGS, 但有些方便的指令, 如:
LAHF: 讀取EFLAGS 低 8 位到 AH;

SAHF是將AH存至EFLAG低8位

---------------------------------------------------------------------------------------------------

CLC?? ;置CF=0
STC?? ;置CF=1
CMC? ;置CF= (Not CF)進位標志求反
CLD?? ;置DF= 0?
STD?? ;置DF=1

---------------------------------------------------------------------------------------------------

.386
.modelflat,stdcall

include
?? windows.inc
include
?? kernel32.inc
include
?? masm32.inc
include
?? debug.inc
includelib
kernel32.lib
includelib
masm32.lib
includelib
debug.lib

.data
??? szBin1?db? 8 dup(?), 0
??? szBin2?db? 8 dup(?), 0
??? szBin3?db? 8 dup(?), 0
??? szBin4?db? 8dup(?), 0
.code
main proc
???stc?????;置位 CF, CF = 1
???lahf
???invoke byt2bin_ex,ah,addr szBin1????

?? clc;復位 CF, CF = 0
???lahf
???invokebyt2bin_ex,ah,addr szBin2
???
???stc
???cmc;取反 CF, CF = not CF
???lahf
???invoke byt2bin_ex,ah,addrszBin3
???
???clc
???cmc;取反 CF, CF = not CF
???lahf
???invokebyt2bin_ex,ah,addr szBin4

??? PrintString szBin1 ;xxxxxxx1
??? PrintString szBin2 ;xxxxxxx0
??? PrintString szBin3 ;xxxxxxx0
??? PrintString szBin4 ;xxxxxxx1
???ret
main endp
end
main

---------------------------------------------------------------------------------------------------

如果要觀察整個 EFLAGS 的 32 個位, 可用 PUSHFD 和 POPFD 指令讓 EFLAGS 進棧、出棧

---------------------------------------------------------------------------------------------------

.586p
.model flat, stdcall

include
?? windows.inc
include
?? kernel32.inc
include
?? masm32.inc
include
?? debug.inc
includelib
kernel32.lib
includelib
masm32.lib
includelib
debug.lib

.data
??? szBin db 32 dup(?), 0
.code
main proc
??? stc
??? pushfd
??? invoke
dw2bin_ex, dword ptr [esp+4],addr szBin
??? popfd
??? PrintString szBin ;00000000000000000000001001000111
???
??? clc
??? pushfd
??? invoke
dw2bin_ex, dword ptr [esp+4],addr szBin
??? popfd
??? PrintString szBin ;00000000000000000000001010000110
??? ret
main endp
end
main

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375368.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375368.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375368.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP多進程并發服務端 Linux socket編程入門(2)

這里很簡單的使用了fork()函數,在執行了fork()以后的所有代碼都會由子進程和父進程同時執行。 他們同時擁有相同的資源(兩份拷貝),所以在子進程執行的過程中,子進程需要先close掉listenfd(監聽套接字&#…

ArcEngine 打開shape文件

IWorkspaceFactory wsf new ShapefileWorkspaceFactory(); IWorkspace pWorkspace wsf.Open(filePath, 0) ;//filePath為shapefile所在的文件夾 IFeatureWorkspace pFeatureWorkspace pWorkspace ; IFeatureClass pFeatureClass pFeatureWorkspace.OpenFeatureClass(&quo…

Win32ASM學習[10]:傳送指令

匯編指令的一般性要求: 1、兩個操作數的尺寸必須一致; 2、操作數不能同為內存. --------------------------------------------------------------------------------------------------------------- ;mov ;該指令不影響 EFlags ;指令格式: (其中的 r、m、i 分別表示: 寄存器、…

SQL Server 中關于 @@error 的一個小誤區

SQL Server 中關于 error 的一個小誤區 原文:SQL Server 中關于 error 的一個小誤區在SQL Server中&#xff0c;我常常會看到有些前輩這樣寫&#xff1a; if(error<>0)ROLLBACK TRANSACTION T elseCOMMIT TRANSACTION T 一開始&#xff0c;我看見別人這么寫&#xff0c;我…

Win32ASM學習[11]:邏輯運算

--------------------------------------------------------------------------------------------------------------------------- 一.邏輯與運算指令 AND 格式: AND OPRD1,OPRD2其中目的操作數OPRD1為任一通用寄存器或存儲器操作數.源操作數OPRD2為立即數、任一通用寄存器…

JavaScript消息框

1.警告框 function myTest(){alert("這里的內容會彈出");} 2.確認框 其返回的值是 true 或 false 。 function myTest(){confirm("這里的內容會彈出");} 3.提示框 prompt prompt(參數1&#xff0c;參數2)&#xff1a;其參數1 是顯示提示要輸入的信息&…

.Net 事務

在分布式應用程序中&#xff0c;不可避免地會經常使用到事務控制。事務有一個開頭和一個結尾&#xff0c;它們指定了事務的邊界&#xff0c;事務在其邊界之內可以跨越進程和計算機。事務邊界內的所有資源都參與同一個事務。要維護事務邊界內資源間的一致性&#xff0c;事務必須…

Win32ASM學習[12]:位測試指令位掃描指令

----------------------------------------------------------------------------------------------------------------------- 一.BT 指令 格式: BT OPD,OPS 功能: 目的操作數OPD中由源操作數OPS指定的位送CF標志 說明: 1. 在指令中,目的操作數OPD只能是16/32位通用寄存器…

Android WifiDisplay分析一:相關Service的啟動

網址&#xff1a;http://www.2cto.com/kf/201404/290996.html 最近在學習Android 4.4上面的WifiDisplay(Miracast)相關的模塊&#xff0c;這里先從WifiDisplay用到的各個Service講起&#xff0c;然后再從WifiDisplaySettings里面講解打開wfd的流程。首先看下面的主要幾個Servic…

mvc controller跳轉頁面方法

1、直接Redirect后加 Controller/Action Response.Redirect("/User/Edit"); // return Redirect("/User/Edit"); return RedirectToAction("about","Home"); Response.Redirect("/User/Edit"); 2、直接r…

Win32ASM學習[13]:移位指令SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD

一. SHL、SHR、SAL、SAR: 移位指令 ---------------------------------------------------------------------------------------------------- ;SHL(Shift Left): 邏輯左移 ;SHR(Shift Right): 邏輯右移 ;SAL(Shift Arithmetic Left): 算術左移 ;SAR(Shift Ari…

angular中的表單驗證

angular中的表單驗證很強大&#xff0c; 一共有5中驗證信息&#xff0c;$valid,$invalid,$pristine,$dirty,$error. $valid-----當驗證通過的時候&#xff0c;為true,不通過的時候為false $invalid----當驗證不通過的時候&#xff0c;為true&#xff0c;通過的時候為true $pris…

Cortex-A15 Memory Hierarchy

ARM 平臺為實現速度和成本的平衡&#xff0c;使用多個層次的內存架構。對于多核 CPU 組成的 SOC&#xff0c;每個CPU 內部都有一組高速緩存&#xff0c;包含&#xff1a;ICache、DCache 和 TLB。多個 CPU 共享一個更大的 L2 緩存。L2緩存再和 CPU 外部的DDR3 內存交互。ICache …

Win32ASM學習[14]:符號擴展指令: CBW,CWDE,CDQ,CWD

----------------------------------------------------------------------------------------------------------------------------------------------------------------- ;CBW(Convert Byte to Word): 將 AL 擴展為 AX ;CWDE(Convert Word to Extended Double): 將 …

Win32ASM學習[15]:加減指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP

------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;INC(Increment): 加一 ;DEC(Decrement): 減一 ;NEG(Negate): 求補(求反) ;ADD(Add): 加 ;A…

UINavigationController的簡單使用

UINavigationController的使用步驟初始化UINavigationController設置UIWindow的rootViewController為UINavigationController根據具體情況&#xff0c;通過push方法添加對應個數的子控制器UINavigationController的子控制器UINavigationController以棧的形式保存子控制器proper…

Android 圖片的縮略圖

<1>簡介 之前往往是通過Bitmap、Drawable和Canvas配合完成&#xff0c;需要寫一系列繁雜的邏輯去縮小原有圖片&#xff0c;從而得到縮略圖。 現在我給大家介紹一種比較簡單的方法&#xff1a;&#xff08;網上有&#xff09; 在Android 2.2版本中&#xff0c;新增了一個T…

Win32ASM學習[16] :乘除指令: MUL、IMUL、DIV、IDIV

---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 一. 無符號數乘法指令 MUL(MULtiply) 格式: MUL OPRD 功能: 乘法操作. 說明: 1. OPRD為通用…

Linux命令之man

一、引言 一直聽別人說linux下有個男人很厲害&#xff0c;遇到不會的不懂的都可以問他&#xff0c;自己也會幾個man命令&#xff0c;但是一直不知道到底man命令是怎么用的&#xff0c;比如查詢不同類的幫助該在man后跟數字幾&#xff0c;man后的數字有什么具體的意思&#xff0…

《JavaScript權威指南》學習筆記 第二天 下好一盤大棋

前段學習js的時候總是零零散散的&#xff0c;以至于很多東西都模棱兩可。時間稍微一久&#xff0c;就容易忘記。最主要的原因是這些東西&#xff0c;原來學的時候就不是太懂&#xff0c;以至于和其他知識無法形成記憶鏈&#xff0c;所以孤零零的知識特別容易忘記。重溫犀牛書&a…