flag 的第 0 位是 CF,进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位的更高位,或从更高位的借位值。
对于位数为 N 的无符号数来说,其对应的二进制信息的最高位,即第 N-1 位,就是它的最高有效位,而假想存在的第 N 位,就是相对于最高有效位的更高位。如图11.2所示
我们知道,当两个数据相加的时候,有可能产生从最高有效位向更高位的进位。比如,两个8位数据:98H十98H,将产生进位。由于这个进位值在8位数中无法保存,我们在前面的课程中,就只是简单地说这个进位值丢失了。其实CPU在运算的时候,并不丢弃这个进位值,而是记录在一个特殊的寄存器的某一位上。8086CPU就用flag的CF位来记录这个进位值。比如,下面的指令:
mov al,98h add al,al ;执行后:(al)=30h,CF=1,CF 记录了从最高有效位向更高有效位的进位置 add al,al ;执行后:(al)=60h,CF=0,CF 记录了从最高有效位向更高有效位的进位置
而当两个数据做减法的时候,有可能向更高位借位。比如,两个8位数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。而flag的CF位也可以用来记录这个借位值。比如,下面的指令:
mov al,97h sub al,98h ;执行后,(al)=ffh,CF=1,CF 记录了向更高位的借位值。 sub al,al ;执行后,(al)=0,CF=0,CF 记录了向更高位的借位值。