标志寄存器 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu(20.04)中安装Pycharm(2020.1.2)详细教程「建议收藏」

    Ubuntu(20.04)中安装Pycharm(2020.1.2)详细教程「建议收藏」一、下载并解压Pycharm1、官网下载:https://www.jetbrains.com/pycharm/download/#section=linux学习使用,下载community版本即可2、下载下来是tar.gz格式,将文件传入到虚拟机中。vmware安装了增强功能可直接拖拽。如果无法使用,则可以设置共享文件夹,可自行网上搜索。共享后的文件夹在ubuntu中的目录位置是:/mnt/hgfs/你设置的共享文件夹3、将文件复制(cp)或移动(mv)到/opt文件目录下。并解压(ta

    2022年8月26日
    11
  • 微信公众平台、微信公众平台.小程序、微信.开放平台[通俗易懂]

    微信公众平台、微信公众平台.小程序、微信.开放平台[通俗易懂]一个开发者账号如何上线多个小程序?一个小程序账号对应一个小程序,可发布一个小程序上线。如果需要开发多款小程序,请注册新的账号。https://developers.weixin.qq.com/community/develop/doc/000886957d47f87cf9997f47c5b000小程序怎么发布,一套小程序代码怎么同时发布到不同的小程序上面,发布为体验版和正式版本!点击上传旁边的详情按钮,打开配置页面,修改项目addip,吧这个appid修改成需要覆盖的线上小程序id即可https:

    2022年6月16日
    44
  • Python天天美味(13) – struct.unpack

    Python天天美味(13) – struct.unpack

    2022年2月23日
    65
  • 人体表面积的计算公式_体表面积快速计算公式

    人体表面积的计算公式_体表面积快速计算公式体表面积(BSA)即是人体表面积。由于形状的特殊性,直接测量非常复杂。多年来,人们总结出许多计算公式用于估算体表面积。使用这些公式,身体表面积将以平方米计算出来。常用体表面积计算公式:1)Mosteller公式:一个最经常使用的公式,发布于1987年。BSA(m²)=([身高(cm)x体重(kg)]/3600)^½。2)DuBois与DuBois公式(1,注):BSA(…

    2022年4月19日
    486
  • 内存屏障 – MemoryBarrier[通俗易懂]

    内存屏障 – MemoryBarrier[通俗易懂]处理器的乱序和并发执行目前的高级处理器,为了提高内部逻辑元件的利用率以提高运行速度,通常会采用多指令发射、乱序执行等各种措施。现在普遍使用的一些超标量处理器通常能够在一个指令周期内并发执行多条指令。处理器从L1I-Cache预取了一批指令后,就会分析找出那些互相没有关联可以并发执行的指令,然后送到几个独立的执行单元进行并发执行。比如下面这样的代码(假定编译器不做优化):  z

    2022年7月12日
    22
  • Android Studio 和 SDK 下载、安装和环境变量配置

    Android Studio 和 SDK 下载、安装和环境变量配置win10下AndroidStudio和SDK下载、安装和环境变量配置                        ——madebysiwuxie0951、首先必须安装Java JDK (JavaJDK下载、安装和环境变量配置,传送阵:点击开始传送)2、本人电脑系统

    2022年7月19日
    20

发表回复

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

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