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


相关推荐

  • Nginx 单元测试自动化浅析之一-Test::Nginx源码分析和使用

    Nginx 单元测试自动化浅析之一-Test::Nginx源码分析和使用

    2022年2月23日
    48
  • openwrt安装aliddns使用阿里云ddns[通俗易懂]

    openwrt安装aliddns使用阿里云ddns[通俗易懂]openwrt安装aliddns使用阿里云ddns一些小伙伴安装了openwrt之后发现没法使用阿里云的ddns解析这里告诉你怎么添加aliddns插件需要会一些linux基础命令和ssh分四步安装依赖下载插件上传插件安装插件安装ddns-scripts、luci-app-ddns、openssl-util、wget依赖包使用luciweb界面里面的软件包管理,或者ssh使用opkg安装都一样有的openwrt自带的源地址可能下载很慢或根本无法下载,得换源下载alid

    2022年6月10日
    983
  • 理解51单片机最小系统的工作原理「建议收藏」

    理解51单片机最小系统的工作原理「建议收藏」51单片机最小应用系统概述要想使用单片机,第一个要搭建的电路就是单片机的最小系统,有了这个最小系统单片机就可以去正常的工作,即使没有其他的外围电路(显示器啥的),也可以对单片机进行程序的编写,程序也可以在单片机里面正常的运行。其包括MCS-51系列芯片一块,(51初步认识)电源电路,时钟电路,复位电路。51单片机最小系统原理图1.电源电路任何的电子设备都需要给其供应相对应的工作电源才可以正常工作,此芯片可用+5V的直流电源供电电源电路2.时钟电路单片机的芯片是数字电路芯片,数字芯片要想正常

    2022年6月23日
    34
  • css两端对齐IOS不适用 样式冲突

    css两端对齐IOS不适用 样式冲突问题 textclass explain v html info goodsExplain explain white space pre wrap 用来换行 display inline block text align justify 用来两端对齐 text align last left word break break word 文本带有换行符 没有带标签 textclass explain v html info goodsExplain

    2025年7月27日
    1
  • Navicat Premium 15激活【2021最新】

    (Navicat Premium 15激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月28日
    68
  • ubuntu修改密码(详细版)「建议收藏」

    ubuntu修改密码(详细版)「建议收藏」今天打开Ubuntu突然不记得开机密码了,这里记下我的重置密码的方法 :步骤:1.点如上图左上角->Player(P)->电源(P)->重启客户端(R)->确认重启2.点击完重启立即长按SHIFT按键,直到出现下图这个界面3.选择AdvancedoptionsforUbuntu选项然后敲回车,出现下图界面4.选择Ubuntu,with…

    2022年9月29日
    4

发表回复

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

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