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.mzph.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…