标志寄存器 EFL

2024-03-08 04:40
文章标签 寄存器 标志 efl

本文主要是介绍标志寄存器 EFL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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)

方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。


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

1. I/O特权标志IOPL(I/O Privilege Level)

I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。
该字段指定了要求执行I/O指令的特权级。
如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。

2. 嵌套任务标志NT(Nested Task)

嵌套任务标志NT用来控制中断返回指令IRET的执行。
具体规定如下:
(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;
(2)、当NT=1,通过任务转换实现中断返回。

3. 重启动标志RF(Restart Flag)

重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示“接受”调试故障,否则拒绝之。在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。

4. 虚拟8086方式标志VM(Virtual 8086 Mode)

如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。


修改EFL的方法

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

  1. 思路
    先将EFL标志位的数据全部读取出来,然后对某一位进行操作。

    • 如果要置0,可以声明一个除要修改位其他位全为1的变量,然后与读取的EFL标志位进行与操作
    • 如果要置1,可以声明一个除要修改位其他位全为0的变量,然后与读取的EFL标志位进行或操作

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

  2. 在汇编文件中定义两个对EFL寄存器进行操作的函数

    _read_elfags:		; int read_elfags(void);PUSHFDPOP		EAXRET
    
    _save_elfags:		; void save_elfags(int elfags);MOV		EAX, [ESP + 4]PUSH	EAXPOPFD	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)

这篇关于标志寄存器 EFL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786039

相关文章

寄存器B

MCS-51单片机的中央处理器包含运算部件和控制部件两部分。         1. 运算部件         运算部件以算术逻辑运算单元ALU为核心,包含累加器ACC、B寄存器、暂存器、标志寄存器PSW等许多部件,它能实现算术运算、逻辑运算、位运算、数据传输等处理。         算术逻辑运算单元ALU是一个8位的运算器,它不仅可以完成8位二进制数据加、减、乘、除等基本的算

COCO Kepoints 标志位

COCO 数据集中annotations字段keypoints是一个长度为3*k的数组,其中k是category中keypoints的总数量。每一个keypoint是一个长度为3的数组,第一和第二个元素分别是x和y坐标值,第三个元素是个标志位v,v为0时表示这个关键点没有标注(这种情况下x=y=v=0),v为1时表示这个关键点标注了但是不可见(被遮挡了),v为2时表示这个关键点标注了同时也可见

士兰微 SC32F5432 通过配置寄存器方式 将管脚配成开漏输出模式和TTL输入模式

目录 前言: 士兰微电子介绍 士兰微 SC32F5432介绍 士兰微 SC32F5432 通过配置寄存器方式 将管脚配成开漏输出模式和TTL输入模式 开漏输出模式 TTL输入模式 前言: 下面是对我在工作时公司所使用的一款国产芯片(士兰微 SC32F5432)开发过程所遇到的一些问题的记录与解决。 士兰微电子介绍 杭州士兰微电子股份有限公司(600460)坐落于杭州

笔记 14 : 彭老师课本第 8 章, UART : 寄存器介绍 ,

(99) 继续介绍 uart 的关于通道的 一整套 寄存器, UCON 等: ++ 接着介绍寄存器 UTRSTAT : ++ 接着介绍读写数据的寄存器: ++ 设置 uart 的波特率,有关的寄存器: ++ (100) (101) 谢谢

AUXR-特殊功能寄存器(只写)

AUXR : Auxiliary Register(只写) MnemonicAddbitB7B6B5B4B3B2B1B0Reset ValueAUXR8EHname -  -  - - - -EXTRAMALEOFFxxxx,xx00 禁止ALE信号输出(应用示例供参考,C语言):sfr AUXR = 0x8e; //声明AUXR寄存器的地址AUXR = 0x01;//ALEOFF位置1

FPGA编程基础(一)--参数传递与寄存器使用

一、参数映射 参数映射的功能就是实现参数化元件。所谓的”参数化元件“就是指元件的某些参数是可调的,通过调整这些参数从而可实现一类结构类似而功能不同的电路。在应用中,很多电路都可采用参数映射来达到统一设计,如计数器、分频器、不同位宽的加法器以及不同刷新频率的VGA视频接口驱动电路等。 参数传递 参数传递就是在编译时对参数重新赋值而改变其值。传递的参数是子模块中定义的parameter,其传递方

【软件逆向】第38课,软件逆向安全工程师之操作标志寄存器实例,每天5分钟学习逆向吧!

在这些实例学习中,我们使用汇编指令来操作标志寄存器,并根据标志寄存器的状态进行条件分支。这些操作对于编写高效的汇编程序以及理解程序的行为至关重要 实例 1:使用 PUSHF 和 POPF 保存和恢复标志寄存器状态 section .text global _start _start: ; 初始化 AL 寄存器 MOV AL, 0xFF ; 对 AL 寄存器进行加一操作,这将导致 AL 寄存器的

新路程------hi3516a 在应用层对寄存器的操作

由于在应用层没法用writel,所以参考himm.c写了一个设置,代码如下: void uart1_rtsn_high(void) {     void * pMem  = NULL;   pMem = memmap(0x201d0010, DEFAULT_MD_LEN);   *(U32*)pMem = 0xff; } 文件名是rs485.c,但是用arm-hisiv300-linux

【软件逆向】第30课,软件逆向安全工程师之(五)寄存器相对寻址,每天5分钟学习逆向吧!

寄存器相对寻址是汇编语言中的一种寻址方式,它结合了寄存器间接寻址和立即数偏移。在这种寻址方式中,操作数的有效地址是通过将一个寄存器的内容与一个固定的偏移量(立即数)相加来得到的。以下是关于寄存器相对寻址的详细信息: 寄存器相对寻址的特点: 操作数地址是寄存器内容与偏移量的和:有效地址是寄存器的内容加上一个固定的立即数偏移量。灵活且具体:提供了对特定内存位置的间接访问,同时允许通过改变寄存器的内

RTC(实时时钟)/BKP(备份寄存器

1 unix时间戳 2 时间戳转换函数 3  BKP(备份寄存器) 1 TAMPER引脚侵入事件  2  RTC校准时间 3 RST闹钟脉冲和秒脉冲         可以输出出来为其他信号提供  4 校准时钟,寄存器加输出RTC校准时钟   5 总结:3个功能只能同时使用一个 4 BKP基本结构 5  RTC框图   6  RTC硬件电路