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.ca