标志寄存器 EFL

标志寄存器 EFLEFL 介绍 EFL 的所有标志全称如上图所示 前 8 位 0 7 因为用不到 所以不作介绍 想看的可以点击原文链接 状态控制位 1 追踪标志位 TF TrapFlag 当追踪标志 TF 被置为 1 时 CPU 进入单步执行方式 即每执行一条指令 产生一个单步中断请求 这种方式主要用于程序的调试 指令系统中没有专门的指令来改变标志位 TF 的值 但可直接通过文末介绍的方法来进行修改 2 中断允许标志位

EFL介绍

img
EFL的所有标志全称如上图所示,前8位(0~7)因为用不到,所以不作介绍,想看的可以点击原文链接。




状态控制位

1. 追踪标志位TF(Trap Flag)

当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。

指令系统中没有专门的指令来改变标志位TF的值,但可直接通过文末介绍的方法来进行修改。

2. 中断允许标志位IF(Interrupt-enable Flag)

中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:

  • 当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
  • 当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

CPU的指令系统中专门的指令来改变标志位IF的值。

3. 方向标志DF(Direction Flag)

32位标志寄存器增加的标志位

1. I/O特权标志IOPL(I/O Privilege Level)
2. 嵌套任务标志NT(Nested Task)
3. 重启动标志RF(Restart Flag)
4. 虚拟8086方式标志VM(Virtual 8086 Mode)

修改EFL的方法

这节只是提供一个思路,而且不同版本的汇编语言可能会略有不同,大家还是以理解为主。


  1. 思路
    先将EFL标志位的数据全部读取出来,然后对某一位进行操作。
    • 如果要置0,可以声明一个除要修改位其他位全为1的变量,然后与读取的EFL标志位进行与操作
    • 如果要置1,可以声明一个除要修改位其他位全为0的变量,然后与读取的EFL标志位进行或操作


    再将修改后的EFL标志位存入寄存器。

  2. 在汇编文件中定义两个对EFL寄存器进行操作的函数
    _read_elfags: ; int read_elfags(void); PUSHFD POP EAX RET 
    _save_elfags: ; void save_elfags(int elfags); MOV EAX, [ESP + 4] PUSH EAX POPFD RET 
  3. 在源文件中进行调用(C版本)
    /* 声明 */ #define EFLAGS_AC_BIT 0X00040000 /* 0000 0000 0000 ‭0100 0000 0000 0000 0000‬ */ int read_elfags(void); void save_elfags(int elfags); /* 调用 */ int elfags = read_elfags(); elfags |= EFLAGS_AC_BIT; store_elfags(eflags); 


原文链接

标志寄存器(EFL)



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233243.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSAS(2)_SSA全称

    SSAS(2)_SSA全称上1篇通过书中实验练习,开发了一个SSASCube。这里,基于这个Cube,再深入小结、试验有关SSASCube开发的扩展知识:维度属性间的关系及维度的层次结构(Hierarchies)维度与度量的关系多维数据集(Cube)KPI的实现多维数据集(Cube)行为(Action)的实现,例如:钻取多维数据集(Cube)的本地化与视图多维表达式(MDX)的应用书名:MCTSSel

    2025年7月27日
    3
  • Eureka 的 Application Client client的执行演示样例

    Eureka 的 Application Client client的执行演示样例

    2021年12月16日
    46
  • git版本管理工具介绍(git管理工具有哪些)

    Git 是一个分布式版本控制工具,它的作者 LinusTorvalds是这样给我们介绍Git —— Thestupidcontenttracker(傻瓜式的内容跟踪器)1、Git背景Git最初由LinusTorvalds编写,用于Linux内核开发的版本控制工具。Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不必服务器端软

    2022年4月14日
    94
  • IUnKNown接口——QueryInterface函数

    IUnKNown接口——QueryInterface函数COM笔记-QueryInterface函数fangyukuan2010.6.1客户同组件的交互都是通过一个接口完成的。在客户查询组件的其他接口时,也是通过接口完成的。这个接口就是IUnknown。它在UNKNWN.H头文件定义:如下       Interface IUnknown       {            virtual HRESULT _

    2022年6月29日
    31
  • python 监控网页_python实时监控网页

    python 监控网页_python实时监控网页PHP从语言层面上讲几乎是一无是处,具体实现的质量也乏善可陈,但它胜在最要命的部署上:没有任何其他语言有像PHP一样适合大规模部署的方式。基本上装好Apache/mod_php之后,PHP应用的部署就简化为了复制文件。  即便是考虑到性能原因等采用nginx/FastCGI等替代方式,额外的工作也只是在于最初配置。一旦配置完成,之后的部署都是文件复制。服务器重启后通常会自动启动a…

    2022年7月16日
    16
  • IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:荡漾- blog.csdn.net/qq_38380025/article/details/105247548…

    2021年6月26日
    124

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号