CF(进位标识):进位标志位。在无符号运算时,记录了运算结果的最高有效位向更高位的进位值或从更高位借位,产生进位或借位时CF=1,否则CF=0;
PF(奇偶标识):奇偶标志位。相关指令执行后结果所有bit中1的个数为偶数,那么PF=1,1的个数为奇数则PF=0;
ZF(零标识):零标志位。相关指令执行后结果为0那么ZF=1,结果不为0则ZF=0;
SF(符号标识):符号标志位。相关指令执行后结果为负那么SF=1,结果非负数则SF=0;
OF(溢出标识):溢出标志位。记录了有符号运算的结果是否发生了溢出,如果发生溢出OF=1,如果没有OF=0;
接下来做一道题来加深理解。
题目:写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值。
sub al,al
mov al,10h
add al,90h
mov al,80h
add al,80h
mov al,0fch
add al,05h
mov al,7dh
add al,0bh
CF OF SF ZF PF
答案: al CF OF SF ZF PF
sub al,al 0h/0000 0000b 0 0 0 1 1
mov al,10h 10h/0001 0000b 0 0 0 1 1
add al,90h a0h/1010 0000b 0 0 1 0 1
mov al,80h 80h/1000 0000b 0 0 1 0 1
add al,80h 0h/0000 0000b 1 1 0 1 1
mov al,0fch 0fch/1111 1100b 1 1 0 1 1
add al,05h 1h/0000 0001b 1 0 0 0 0
mov al,7dh 7dh/0111 1101b 1 0 0 0 0
add al,0bh 88h/1000 1000b 0 1 1 0 1
解析:
第一条指令:sub al,al。此时al的值为0,那么自然没有借位,也不会有溢出,不是负数,值为0,二进制中都是0,也就是0个1。
第二条指令:mov al,10h。我们只需要知道如mov、push、pop等指令不会对标志寄存器有影响就可以了。
第三条指令:add al,90h。这里就是10h+90h=0001 0000b+1001 0000b=1010 0000b=a0h。先看CF位,我们可以看到没有进位
(可以自己用计算器算下,不过要调为字型数据再去算);接下来是OF位,我们将10h换为十进制有符号数据为16,90h则为-112,
a0为-96也就是16-112=-96,正确,所以没有溢出。需注意的是:首先是转换为有符号数据是计算器要是字节型数据。其次,
在判断溢出时,如果答案我们算的一样,就是没有溢出,如果出现了正数+正数=负数一类的,那就是溢出了。
SF位是对于有符号数据来说的,也就是-96。PF位要注意是低8位就可以(不过这里也没有高8位,而且这个考的不多,知道就好)。
第五条指令:add al,80h。80h+80h=1000 0000b+1000 0000b=0000 0000b(0001 0000 0000b)=0h(100h)。
我们知道al是字节型的,只可以存储8。通过上边的式子我们也可以很明显的看出存在进位的现象。
所以如果用计算器(字节型)算的话就是0,如果是用字型计算器算的话就是另一个结果,因此CF=1。
80h对应的无符号数据是-128,最后的结果为(-128)+(-128)=0。负数加负数为0,肯定是溢出了。其他省略了。
第七条指令: add al,05h。0fch+05h=1111 1100b+0000 0101b=0000 0001b(1 0000 0001b)=1h(101h)。
有符号运算(-4)+5=1。所以有进位,没有溢出。
第九条指令:add al,0bh。7dh+0bh=0111 1101b+0000 1011b=1000 1000b=88h。有符号运算120+5=(-120)。
所以无进位,有溢出。