标志寄存器CF,OF,SF,ZF,PF以及相关练习

本文深入解析CPU中的各种标志位,包括进位标志位CF、奇偶标志位PF、零标志位ZF、符号标志位SF及溢出标志位OF的作用与应用场景,并通过具体指令示例展示了这些标志位如何在运算过程中被更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)。
所以无进位,有溢出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碳烤小肥羊。。。

你的鼓励是我创造最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值