标志寄存器
flag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。
而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
8086CPU的flag寄存器的结构:
ZF标志
flag的第6位是ZF,零标志位(zero flag)。
它记录相关指令(add、sub、mul、div、inc、or、and操作)执行后,结果是否为0 。ZF = 1结果不为0,ZF = 0结果为0。
mov、push、pop等传送指令不修改标志寄存器的信息。
PF标志
flag的第2位是PF,奇偶标志位。
它记录指令执行后,结果的所有二进制位中1的个数是否为偶数,如果为偶数则PF = 1,为奇数,PF = 0。
SF标志
flag的第7位是SF,符号标志位。
它记录指令执行后,结果是否为负(就是看它二进制的第一位是不是1),如果为负数则SF = 1,结果为正,SF = 0。
例如:
我们可以将add指令进行的运算当作无符号数的运算,那么add指令相当于计算129+1,结果为130(10000010B),
也可以将add指令进行的运算当作有符号数的运算,那么add指令相当于计算-(125+1)(补码=-(原码取反+1)),结果为-126(10000010B)。
CF标志
flag的第0位是CF,进位标志位。
一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
比如,两个8 位数据:98H+98H,将产生进位。
由于这个进位值在8位数中无法保存,其实CPU在运算的时候,并不丢弃这个进位值,而是记录在一个特殊的寄存器的某一位上。
8086CPU 就用flag的CF位来记录这个进位值。
比如,两个 8 位数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。
而flag的CF位也可以用来记录这个借位值。
CF在减法时记录借位,加法时记录进位
判断加法是否有进位:两个八位数据相加是否大于255(2^8)
判断减法是否有借位:两个八位数据相加是否小于-255
OF标志
在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。
mov al,98
add al,99
add指令运算的结果是(al)=0C5H ,因为进行的是有