32位标志cpu内寄存器器中的标志位/域鈳以分成3组:状态标志位控制标志位,以及系统标志位下图定义了这些标志位以及对应的比特位编号。在处理器刚刚初始化之后(通過激活RESET引脚或者INIT引脚)EFLAGScpu内寄存器器的值被设定为H。比特位13,515,以及22~31都是Intel的保留位软件不要使用或依赖这些比特位的状态,否则將失去跨处理器兼容性
某些标志位可以使用通用指令(以后介绍)直接修改;但是并不存在一条x86指令可以用来直接检查或修改整个cpu内寄存器器(有变通的办法可以实现这个目的,下面介绍)
下面的指令可以用来在程序栈或EAXcpu内寄存器器与标志cpu内寄存器器之间搬移某些标志位组。
将标志cpu内寄存器器(低16位)加载到AHcpu内寄存器器 |
将AHcpu内寄存器器的值存储到标志cpu内寄存器器(低16位) |
将EFLAGS标志cpu内寄存器器(低16位)压栈 |
从棧中弹出两个字节(16位)到EFLAGScpu内寄存器器的低16位 |
将EFLAGS标志cpu内寄存器器(32位)压栈 |
从栈中弹出4个字节(32位)到EFLAGScpu内寄存器器 |
注:其他的可以修改标誌位的指令还包括:STC/CLC/CMC(进位标志位)CLD/STD(方向标志),和STI/CLI(中断允许标志)
当EFLAG标志cpu内寄存器器的内容被传输到程序栈或者EAXcpu内寄存器器之後,可以是处理器提供的比特位操作指令(BT/BTS/BTR/BTC)来检查并修改某些标志位
测试比特位(即指定的比特位送入标志cpu内寄存器器的CF标志位) |
测試并设置比特位(指定的比特位先送入CF标志位,然后该位设置为1) |
测试并清除比特位(指定的比特位先送入CF标志位然后该位设置为0) |
测試并求补比特位(指定的比特位先送入CF标志位,然后该位取反) |
当挂起某个任务时(利用处理器的多任务机制)处理器自动的将EFLAGS标志cpu内寄存器器保存到被挂起任务的任务状态段TSS中。当切换到新任务时处理器从新任务的TSS中加载对应的EFLAGS标志cpu内寄存器器。参看下图的32位TSS结构EFLAGS標志cpu内寄存器器起自第36字节(黄色标出)。
当调用中断处理器程序或异常处理程序时处理器自动的将EFLAGS标志cpu内寄存器器的内容保存在栈上。当中断/异常处理器程序时通过任务切换执行时EFLAGS的内容保存在被挂起的任务的TSS中(如上段所述)。
随着IA-32架构的演化EFLAGScpu内寄存器器中的标誌位也随之增加,但是已有的标志位的位置与功能都保持与前代处理器一致这样,访问或修改这些标志位的程序才可以正确的运行在后玳处理器上(注:x86架构的重要成功因素之一就是向前兼容最大的保护了厂商在软件上的投资)。