Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(4) - 32位EFLAGS - 状态标志与控制标志

Status Flags

状态标志位(比特位0,2,4,6,7和11)指示了算术指令的结果,例如ADD,SUB,MUL,与DIV指令。

标志位

描述

CF(bit 0)

进位/借位Carry。如果算术指令的结果的最高有效位产生了进位/借位,则置1;否则置0。这个标志位指示了无符号整数计算的结果是否溢出;也用于多精度(multiple-precision)算术运算(注:例如利用两个16位宽的寄存器做32位加减法,中间结果会用到CF标志位,下面有解释)。

PF(bit 2)

奇偶校验位Parity。如果指令结果的最低字节含有偶数个比特1,则置1;否则置0。

AF(bit 4)

辅助进位/借位Auxiliary Carry。如果算术运算在第3比特位(最低比特位是0)产生了进位/借位,则置1;否则置0。这个标志主要用于二进制编码的十进制数BCD算术运算。

ZF(bit 6)

零标志位Zero。如果指令结果为0,则置1;否则置0

SF(bit 7)

符号位Sign。设置为指令结果的最高有效比特位,即有符号整数的符号比特位。0表示结果是正数或者是0;1表示负数。

OF(bit 11)

溢出位Overflow。如果整数运算结果超出了目标操作数可容纳的值域(正数过大,负数过小,不包括符号位),则置1;否则置0(即结果可信)。这个标志指示了有符号整数算术运算的结果是否溢出。

 

在这些标志位中,只有CF标志位可以直接使用STC/CLC/CMC指令进行修改。BT,BTS,BTR,BTC指令可以将指定的标志位复制到CF标志位中。

有了状态标志位,就可以让单条算术运算指令为3种不同的数据类型产生结果:无符号整数,有符号整数,和BCD整数。如果算术运算的结果作为无符号整数,则CF标志位指示了结果是否越界(out-of-range);如果作为有符号整数,则OF标志位指示了结果是否溢出(overflow);如果作为BCD整数,则需要检查AF标志位。SF标志位指示了有符号整数的符号。ZF标志指示了结果是否为0,对有符号整数与无符号整数都适用。

当执行多精度整型运算时,CF标志位可辅助ADC指令做加法,或辅助SBB指令做减法,这样可以将进位/借位条件从前一个操作传递给下一个操作。如下示例,若ADD指令结果的最高位产生了进位,则ADC指令会将这个进位(在CF标志位中)加到结果中。

条件转移指令Jcc(按cc条件跳转),SETcc指令(按cc条件设置字节),LOOPcc指令(按cc条件循环),和CMOVcc指令(按cc条件move)都会使用一个或多个状态标志位,将其作为条件进行测试,根据测试结果执行跳转,设置,循环或搬移操作。

Control Flag (DF Flag)

方向标志位(DF,bit 10)控制字符串指令(MOVS,CMPS,SCAS,LODS,STOS)的操作方向。将DF设置为1,则字符串指令的操作方向是自动递减(即从高地址向低地址处理字符串);DF=0,则是自动递增(即从低地址向高地址处理字符串)。

STD/CLD指令分别用于设置与清除DF标志位。

指令

描述

MOVS

将DS:ESI地址上的字符串搬移到ES:EDI地址上

CMPS

从源操作数中减去目标操作数,根据结果设置标志寄存器的状态标志位(CF,ZF,OF,SF,PF和AF);结果并不保存到内存中。

SCAS

从EAX/AX/AL寄存器中减去目标字符串,根据结果设置标志寄存器的状态标志位。

LODS

将DS:ESI地址上的字符串加载到EAX/AX/AL寄存器

STOS

将EAX/AX/AL寄存器中的字符串保存到ES:EDI指定的地址中

STD/CLD

设置/清除DF标志位

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值