FLAGS寄存器是Intel x86微处理器中的状态寄存器,它包含处理器的当前状态。这个寄存器是16位宽的。它的后继者EFLAGS和RFLAGS寄存器的宽度分别为32位和64位。较宽的寄存器保持了与较小的前辈的兼容性。
位位置1、3和5的固定位,进位、奇偶校验、调整、零和标志标志都继承自更早的体系结构8080和8085。调整标志在8080中被称为辅助进位,在Zilog Z80架构中被称为半进位。

所有标志寄存器都包含条件码,标志位可以让一个机器语言指令的结果影响另一个指令。算术和逻辑指令设置部分或全部标志,而条件跳转指令根据某些标志的值采取可变的动作。例如,jz(如果为0则跳转)、jc(如果进位则跳转)和jo(如果溢出则跳转)取决于特定标志。其他条件跳转测试几个标志的组合。
标记寄存器可以从堆栈中移动或移动到堆栈中。这是保存和恢复处理器上下文工作的一部分,相对于一个例程,例如中断服务例程,它对寄存器的更改不应该被调用代码看到。以下是相关说明:

PUSHF和POPF指令传送16位标志寄存器。
PUSHFD/POPFD(在i386架构中引入)传输32位双寄存器eflag。
PUSHFQ/POPFQ(在x64架构中引入)传输64位四字寄存器的RFLAGS。
在64位模式下,PUSHF/POPF和PUSHFQ/POPFQ可用,而PUSHFD/POPFD不可用
标志寄存器的下8位也可以直接由SAHF和LAHF进行加载/存储操作(将AH加载/存储到标志中)

推入和弹出( push and pop)标志寄存器能使程序能够操作标志中的信息,而不需要机器语言指令方式:
cld和std指令分别清除和设置方向标志(DF);但是没有指令来补充DF
这可以通过以下汇编代码实现:

pushf          ; Use the stack to transfer the FLAGS
pop   ax       ; ...into the AX register
push  ax       ; and copy them back onto the stack for storage
xor   ax, 400h ; Toggle (complement) DF only; other bits are unchanged
push  ax       ; Use the stack again to move the modified value
popf           ; ...into the FLAGS register
; Insert here the code that required the DF flag to be complemented
popf          ; Restore the original value of the FLAGS

与英特尔Cpu相关的定义和常量

//cpu\i386\include\rtems\score\registers.h/*** @file* * @brief Intel CPU Constants and Definitions* * @addtogroup RTEMSScoreCPUi386* * This file contains definition and constants related to Intel Cpu*//**  COPYRIGHT (c) 1998 valette@crf.canon.fr**  The license and distribution terms for this file may be*  found in the file LICENSE in this distribution or at*  http://www.rtems.org/license/LICENSE.*/#ifndef _RTEMS_SCORE_REGISTERS_H
#define _RTEMS_SCORE_REGISTERS_H/** definition related to EFLAGS*/
#define EFLAGS_CARRY            0x1
#define EFLAGS_PARITY           0x4#define EFLAGS_AUX_CARRY     0x10
#define EFLAGS_ZERO         0x40
#define EFLAGS_SIGN         0x80#define EFLAGS_TRAP         0x100
#define EFLAGS_INTR_ENABLE      0x200
#define EFLAGS_DIRECTION        0x400
#define EFLAGS_OVERFLOW         0x800#define    EFLAGS_IOPL_MASK        0x3000
#define EFLAGS_NESTED_TASK      0x8000#define EFLAGS_RESUME         0x10000
#define EFLAGS_VIRTUAL_MODE     0x20000
#define EFLAGS_ALIGN_CHECK      0x40000
#define EFLAGS_VIRTUAL_INTR     0x80000#define EFLAGS_VIRTUAL_INTR_PEND 0x100000
#define EFLAGS_ID           0x200000/** definitions related to CR0*/
#define CR0_PROTECTION_ENABLE       0x1
#define CR0_MONITOR_COPROC      0x2
#define CR0_COPROC_SOFT_EMUL        0x4
#define CR0_FLOATING_INSTR_EXCEPTION    0x8#define CR0_EXTENSION_TYPE       0x10
#define CR0_NUMERIC_ERROR       0x20#define CR0_WRITE_PROTECT       0x10000
#define CR0_ALIGMENT_MASK       0x40000#define CR0_NO_WRITE_THROUGH     0x20000000
#define CR0_PAGE_LEVEL_CACHE_DISABLE    0x40000000
#define CR0_PAGING          0x80000000/** definitions related to CR3*/#define CR3_PAGE_CACHE_DISABLE        0x10
#define CR3_PAGE_WRITE_THROUGH      0x8
#define CR3_PAGE_DIRECTORY_MASK     0xFFFFF000#endif

EFLAGS寄存器:EFLAGS(program status and control) register主要用于提供程序的状态及进行相应的控制

标志寄存器,又称程序状态寄存器(它的内容是Program Status Word,PSW)
这是一个,控制标志和系统标志的寄存器
标志寄存器EFLAGS中的系统标志和IOPL字段用于控制I/O访问、可屏蔽硬件中断、调试、任务切换以及虚拟8086模式 [2]
运算结果标志位编辑
进位标志CF
(Carry Flag)
进位标志CF主要用来反映运算是否产生进位。如果运算结果的最高位产生了一个进位(或借位),那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
奇偶标志PF
(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
辅助进位标志AF
(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
零标志ZF
(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。
符号标志SF
(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。运算结果为正数时,SF的值为0,否则其值为1。
溢出标志OF
(Overflow Flag)
运算结果超过当前运算位数所能表示的范围,OF的值被置为1,否则,OF的值被清为0
状态控制标志位编辑
状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
追踪标志TF
(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式。
中断允许标志IF
(Interrupt-enable Flag)
CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求
当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求
CPU的指令系统中也有专门的指令来改变标志位IF的值
方向标志DF
(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
32位标志寄存器增加的标志位编辑
I/O特权标志IOPL
(I/O Privilege Level)
I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
嵌套任务标志NT
(Nested Task)
嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:
当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;
当NT=1,通过任务转换实现中断返回。
恢复标志RF
(Resume Flag)
恢复标志RF用来控制是否接受调试故障。规定:RF=0时,表示“接受”调试故障,否则拒绝之。在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。 [3]
虚拟8086方式标志VM
(Virtual 8086 Mode)
如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态
EFLAGS是一个32位寄存器,用于表示布尔值的集合,用于存储操作的结果和处理器的状态。

The EFLAGS is a 32-bit register used as a collection of bits representing Boolean values to store the results of operations and the state of the processor.The names of these bits are:31    30  29  28  27  26  25  24  23  22  21  20  19  18  17  16
0   0   0   0   0   0   0   0   0   0   ID  VIP VIF AC  VM  RF
15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
0   NT  IOPL    OF  DF  IF  TF  SF  ZF  0   AF  0   PF  1   CF
The bits named 0 and 1 are reserved bits and shouldn't be modified.The different use of these flags are:
0.  CF : Carry Flag. Set if the last arithmetic operation carried (addition) or borrowed (subtraction) a bit beyond the size of the register. This is then checked when the operation is followed with an add-with-carry or subtract-with-borrow to deal with values too large for just one register to contain.
2.  PF : Parity Flag. Set if the number of set bits in the least significant byte is a multiple of 2.
4.  AF : Adjust Flag. Carry of Binary Code Decimal (BCD) numbers arithmetic operations.
6.  ZF : Zero Flag. Set if the result of an operation is Zero (0).
7.  SF : Sign Flag. Set if the result of an operation is negative.
8.  TF : Trap Flag. Set if step by step debugging.
9.  IF : Interruption Flag. Set if interrupts are enabled.
10. DF : Direction Flag. Stream direction. If set, string operations will decrement their pointer rather than incrementing it, reading memory backwards.
11. OF : Overflow Flag. Set if signed arithmetic operations result in a value too large for the register to contain.
12-13.  IOPL : I/O Privilege Level field (2 bits). I/O Privilege Level of the current process.
14. NT : Nested Task flag. Controls chaining of interrupts. Set if the current process is linked to the next process.
16. RF : Resume Flag. Response to debug exceptions.
17. VM : Virtual-8086 Mode. Set if in 8086 compatibility mode.
18. AC : Alignment Check. Set if alignment checking of memory references is done.
19. VIF : Virtual Interrupt Flag. Virtual image of IF.
20. VIP : Virtual Interrupt Pending flag. Set if an interrupt is pending.
21. ID : Identification Flag. Support for CPUID instruction if can be set.

参考引用
https://en.wikibooks.org/wiki/X86_Assembly

RTEMS实时操作系统精要(2)-FLAGS、EFLAGS寄存器相关推荐

  1. RTEMS实时操作系统精要(1)-简介

    最早用于美国国防系统,早期的名称为实时导弹系统(Real Time Executive for Missile Systems),后来改名为实时军用系统(Real Time Executive for ...

  2. 实时操作系统与通用计算机操作系统的区别,实时操作系统(RTOS)和通用操作系统(OS)之间的区别...

    RTOS vs OS 大多数人都熟悉电脑上使用的操作系统. 用于个人电脑的最常见的操作系统包括:微软的Windows,苹果的OS X以及各种版本的Linux. 但是多数人都不知道实时操作系统(缩写RT ...

  3. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十八章 UCOSII 实验 3...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十八章 ...

  4. UCOSIII实时操作系统------软件定时器

    文章目录 前言 一.概述 二.使用步骤 1.创建软件定时器 2.启动软件定时器 3.停止软件定时器 4.删除软件定时器 总结 前言 UCOSIII实时操作系统------软件定时器 提示:以下是本篇文 ...

  5. RT-Thread 创始人熊谱翔:我和 Linux、嵌入式实时操作系统 RT-Thread

    我和 Linux.嵌入式实时操作系统 RT-Thread -- RT-Thread创始人熊谱翔,2015 年 接触 Linux 说起 Linux 应该从我在校园时期说起.我是在山城--重庆邮电学院念的 ...

  6. 嵌入式操作系统和RTOS(实时操作系统)介绍。

    目录 嵌入式操作系统 RTOS(实时操作系统) 实时操作系统: 什么是嵌入式操作系统 一μClinux 二μC/OS-II 三eCos 四 FreeRTOS 五 mbed OS 六 RTX 七 VxW ...

  7. 【嵌入式系统—实时操作系统】uC/OS-II 及其STM32F103移植

    你经历过吗? 背景 踏入嵌入式领域,我们往往首先接触的都是单片机编程,而51也往往成为了入门首选. 而这种单片机编程通常都是指裸机编程(轮询系统/前后台系统),即没有加入 RTOS (多任务的实时操作 ...

  8. 嵌入式系统开发16——嵌入式实时操作系统uC/OS的简介及简单应用

    本文主要介绍嵌入式实时操作系统(RTOS),并且以uc/OS为例,将其移植到stm32F103C8T6上,构建3个任务:其中两个task分别以1s和3s周期对LED灯进行点亮-熄灭的控制:另外一个ta ...

  9. RT-Thread创始人熊谱翔: 我和Linux、嵌入式实时操作系统RT-Thread

    本文转载至: http://www.rt-thread.org/dynamic/78.html 接触Linux 说起Linux应该从我在校园时期说起.我是在山城--重庆邮电学院念的书,1998年时宿舍 ...

最新文章

  1. 卷积神经网络(CNN)的原理
  2. 从struts2拦截器到自定义拦截器
  3. 二分类预测用的几个预测结果精确度计算方法
  4. BeetleX.WebFamily文件图片管理集成
  5. 双端队列 BFS + Chamber of Secrets CodeForces - 173B
  6. 单路电压表c语言编程,用AT89C51单片机制作的数字电压表
  7. mysql连接查询on_MySql 连接查询中 on 和 where 的区别
  8. HNU 实验五 拜访朋友
  9. HDU 5768 Lucky7 (中国剩余定理+容斥)
  10. Java 技巧篇-IntelliJ IDEA快捷键设置,格式化代码快捷键
  11. 重置计算机的网络配置是什么意思,电脑怎么重置网络设置 win10网络重置后连不上网怎么办...
  12. java碳纤维山地车车架咋样_自行车碳纤维车架值得买吗?它有哪些优缺点?老骑手来给你答案!...
  13. 腾达fh307没有显示服务器名,腾达(Tenda)FH307路由器无线WiFi密码和名称设置
  14. HANA掀起数据处理狂潮 农夫山泉有点甜?
  15. rtthread spiflash (w25q64)
  16. 人工智能/数据科学比赛汇总 2019.8
  17. SVM分类,一对多;
  18. 【渗透实例】Fuzz大法好啊
  19. BF算法及KMP算法的实现
  20. vue-动态加载图片

热门文章

  1. 软件工程课程学生信息
  2. js获取网页面的高度和宽度
  3. 那些年,我还在学习actionscript
  4. 去除链接虚线边框css
  5. IE与Mozila FireFox 中的 JS
  6. 【产品分析】Microsoft MyPhone试用手记
  7. cobbler一键部署centos7.4(脚本)
  8. TLS,SSL,HTTPS with Python(转)
  9. 20 个势头最猛的开发者工具
  10. 如何判断离散数组 是递增趋势_期货交易中,如何通过交易周期判断趋势,做到顺势而为?...