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,一经查实,立即删除!

相关文章

JavaScript消息框

1.警告框 function myTest(){alert("这里的内容会弹出");} 2.确认框 其返回的值是 true 或 false 。 function myTest(){confirm("这里的内容会弹出");} 3.提示框 prompt prompt(参数1,参数2):其参数1 是显示提示要输入的信息&…

.Net 事务

在分布式应用程序中,不可避免地会经常使用到事务控制。事务有一个开头和一个结尾,它们指定了事务的边界,事务在其边界之内可以跨越进程和计算机。事务边界内的所有资源都参与同一个事务。要维护事务边界内资源间的一致性,事务必须…

Android WifiDisplay分析一:相关Service的启动

网址:http://www.2cto.com/kf/201404/290996.html 最近在学习Android 4.4上面的WifiDisplay(Miracast)相关的模块,这里先从WifiDisplay用到的各个Service讲起,然后再从WifiDisplaySettings里面讲解打开wfd的流程。首先看下面的主要几个Servic…

Cortex-A15 Memory Hierarchy

ARM 平台为实现速度和成本的平衡,使用多个层次的内存架构。对于多核 CPU 组成的 SOC,每个CPU 内部都有一组高速缓存,包含:ICache、DCache 和 TLB。多个 CPU 共享一个更大的 L2 缓存。L2缓存再和 CPU 外部的DDR3 内存交互。ICache …

Android 图片的缩略图

<1>简介 之前往往是通过Bitmap、Drawable和Canvas配合完成&#xff0c;需要写一系列繁杂的逻辑去缩小原有图片&#xff0c;从而得到缩略图。 现在我给大家介绍一种比较简单的方法&#xff1a;&#xff08;网上有&#xff09; 在Android 2.2版本中&#xff0c;新增了一个T…

《JavaScript权威指南》学习笔记 第二天 下好一盘大棋

前段学习js的时候总是零零散散的&#xff0c;以至于很多东西都模棱两可。时间稍微一久&#xff0c;就容易忘记。最主要的原因是这些东西&#xff0c;原来学的时候就不是太懂&#xff0c;以至于和其他知识无法形成记忆链&#xff0c;所以孤零零的知识特别容易忘记。重温犀牛书&a…

SUID或SGID程序中能不能用system函数

system()函数的声明和说明如下&#xff1a; 注意它的描述那里&#xff0c;system()执行一个由command参数定义的命令&#xff0c;通过调用/bin/sh -c命令来实现这个功能。也就是说它的逻辑是这样的&#xff01; 进程调用system函数&#xff0c;system函数调用fork创建一个子进程…

Xamarin iOS编写第一个应用程序创建工程

Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后&#xff0c;就可以在Xamarin Studio中编写程序了。本节将主要讲解在Xamarin Studio中如何进行工程的创建以及编写代码等内容XamariniOS编写第一个应用程序创建工程本文选自Xamarin iOS开发实战大学霸。 1.3.…

Birt使用总结

把report放到其他服务器要重新建立Data Source ,这是配置&#xff0c;拷贝项目时不会同时拷贝 (1)在EXTJs中利用Report实现报表的刷新 Ext.getCmp("showview").body.update("<iframe idshowviewframe src" "> </iframe>"…

【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)

本系列笔记为方便日后自己查阅而写&#xff0c;更多的是个人见解&#xff0c;也算一种学习的复习与总结&#xff0c;望善始善终吧~ 一阶常系数微分方程 Aududt 将一阶常系数微分方程转换为线性代数问题的关键在于常系数微分方程的解一定是指数形式的。那么我们的需要求解的东西…

iOS学习之基本概念

学习iOS最重要的是态度和兴趣&#xff0c;如果你对于学习始终抱有不断的热情和端正的态度&#xff0c;那么&#xff0c;无论是什么&#xff0c;你总会成功的&#xff01; 有一句话与大家共勉&#xff1a;过程中跌倒多少次都没有关系&#xff0c;重要的是&#xff0c;跌倒后你能…

【转】gvim配置及相关插件安装

0.准备软件及插件。(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gvim72.exe。(b)vimcdoc-1.7.0-setup.exe 地址http://prdownloads.sourceforge.net/vimcdoc/vimcdoc-1.7.0-setup.exe?download(c)ec57w32.zip 地址http://prdownloads.sourceforge.net/ctags/ec57w32.zip(…

Android 高级编程 RecyclerView 控件的使用

RecyclerView 是Android 新添加的一个用来取代ListView的控件&#xff0c;它的灵活性与可替代性比listview更好。 看一下继承关系&#xff1a; ava.lang.Object ↳android.view.View ↳android.view.ViewGroup ↳android.support.v7.widget.RecyclerViewKnown Direct …

jquery判断一个div的边界是否超出另外一个div的边界

摘要&#xff1a;本文简单介绍jquery判断一个div的边界是否超出另外一个div的边界&#xff0c;如果超出边界做出相应的处理。 1、实现效果 判断前 判断后 2、实现思路 实现类似的判断&#xff0c;主要是获取两个div在浏览器中的上下左右的四至&#xff0c;在jquery中&#xff0…

maven环境快速搭建(转)

最近&#xff0c;开发中要用到maven&#xff0c;所以对maven进行了简单的学习。因为有个maven高手在身边&#xff0c;所以&#xff0c;很快就上手了&#xff0c;我这里算是自我总结吧。关于maven是什么东东&#xff0c;请参考其它文章。 ----------------准备工作-------------…

cocos2d-x3.0 相对布局(一)

2dx相对布局和Android非常类似。假设前完成Android它应该是easy入门。Size widgetSize Director::getInstance()->getWinSize();Text* alert Text::create("Layout", "fonts/Marker Felt.ttf", 30 );alert->setColor(Color3B(159, 168, 176));aler…

夺命雷公狗---ECSHOP---08---商品页的拇改成星星

<strong>用户评价&#xff1a;</strong>{*---------商品评价星星开始----------*}<img src"./images/stars{$goods.comment_rank}.gif" alt"comment rank {$goods.comment_rank}">{*---------商品评价星星结束-------*} 这里主要是要有星…

文件指针

一.移动文件指针 SetFilePointer,hFile,lDistanceToMove,lpDistanceToMoveHigh,dwMoveMethod dwMoveMethod 指明移动的模式 FILE_BEGIN 不管文件处于什么地方,总是从文件的头部开始移动,这时的位置参数相当于指定了一个绝对位置 FILE_CURRENT 从当前的文件指针处开始移…

见证下的自我变化-2014全年总结

又是一年总结季&#xff0c;回过头看看看自己的成长&#xff0c;心里真的是满满的喜悦之情…… 一年前自己的总结博客&#xff1a;http://blog.csdn.net/huo065000/article/details/19632603 半年前自己的总结博客&#xff1a;http://blog.csdn.net/huo065000/article/details/…

【Linux学习篇】This virtual machine is configured for 64-bit guest operating systems.……

在学习Linux的基本操作的时候&#xff0c;安装虚拟环境则提示自己 This virtualmachine is configured for 64-bit guest operatingsystems.……起初由于各种拒绝的心理&#xff0c;所以屏蔽了这个错误&#xff0c;但是屏蔽永远也解决不了问题的&#xff0c;所以自己则尝试百度…