Inter汇编语言程序设计之标志寄存器状态标志

来源:互联网 发布:酱紫类似的网络用语 编辑:程序博客网 时间:2024/04/29 05:08

书中第二章讨论了IA-32处理器中EFLAGES寄存器中各状态标志位(以下简称状态位)随计算结果变化的情况。本文关注的是进位标志CF、溢出标志OF、零标志ZF和符号标志SF。在文章中写到:

   进位标志(CF):在无符号算术运算中的结果太大而目的操作数无法容纳时置位。

   溢出标志(OF):在有符号算术运算中的结果太大而目的操作数无法容纳时置位。

   符号标志(SF):在算术或逻辑运算的结果为负时置位。

     零标志(CF):在算术或逻辑运算的结果为零时置位。

 

在实际的操作中,CPU是不能区分算术运算中的操作数究竟是无符号还是有符号的,它通过一系列规则在运算结束时对状态位进行设置。令人惊讶的是即使已经给变量设定了确定的数据类型,得到的状态位也许还是出乎意料。让我们看看这个例子:

  

 

我们知道BYTE类型能表示数的范围为0~255,SBYTE类型能表示数的范围为-128~+127。在上面这个例子中,我们期待的结果应该是这样:对于无符号数127,加上16后仍小于255,所以没有溢出,溢出位OF=0,而有符号数+127加上16后显然超出了SBYTE能表示数的范围。但是在实际调试中可以发现,两者对状态位的设置一模一样,OF=1。这是为什么呢?

 

正如前面所述,CPU在运算时并不关注操作数是有符号还是无符号的,即使预先已经设置好了数据类型。CPU对状态位应该设置什么样的值是通过一系列的规则判断来实现的。上面那个例子中的溢出位OF,是次高位向最高位的进位值与最高位的进位值(CF)的异或结果。以上面的例子为例:

  

第6位向第7位有进位,而最高位第7位向前没有进位,故OF = 1 XOR 0 = 1

 

对其他的三个状态位的设置,CPU遵循这样的规则:

1.CF为运算中最高有效位向前的进位。在使用al寄存器一类的8位寄存器时,可以将运算结果看成是9位的,运算结果的最高有效位保存在CF中,而其余的8位保存在al中。ax等16位寄存器和eax等32位寄存器的情况可以类推。

2.运算结果最高有效位被置位,则符号位SF=1。

3.运算结果所有有效位被复位,则零标志位ZF=1。这里的实际运算结果可能不是0,但是ZF仍然为1.例如溢出的例子,0FFh+1h=100h,虽然结果非零,但是保存在16位寄存器中的结果是0,故ZF被置位。

 

综上所述,在实际的运算过程中,“进位标志置位”不是“无符号数运算结果太大而目的操作数无法容纳”的充要条件,而只是必要条件。溢出标志位也有类似的结论。

原创粉丝点击