关于标志信息ZF、OF、SF、CF的理解

CF: 进/借位标志,最近的无符号整数相加/减后的进/借位情况,有进/借位时,CF=1,否则CF=0
准确来说CF是用于判断无符号数的溢出的,CF为1,则发生溢出
ZF: 零标志,最近的操作数运算结果是否为0,若是,ZF=1,否则ZF=0
SF: 符号标志,最近的带符号数运算结果的符号,若为负,SF=1,否则SF=0
OF: 溢出标志,最近的带符号数运算结果是否溢出,若溢出,OF=1,否则OF=0

如何计算CF,ZF,SF,OF

首先,我们要清楚,计算机内的数都是以补码的形式存储,有符号和无符号数都是一样的计算,只是最后的解释方式不一样
举例:

#define u8 unsigned char 
.......
printf("%d,%d,%x,%o",(char)0x80,(u8)0x80,(u8)0x80,(u8)0x80); #-128,128,80,200 

0x80在计算机中的存储形式就是0b1000 0000
以char来解释,1是符号位,所以,(char)0x80是-0的补码,对应的值就是-128
以unsigned char来解释,所以(u8)0x80对应的值就是0x80,即128
将0x80用unsigned char的十六进制,八进制解释,就分别是80,200,当然对应的值都是128

接下来,我将以FFE8H+7FE6H与FFE8H-7FE6H来展示如何计算CF,ZF,SF,OF

ZF的计算显然不用多说,
SF的判断也很简单,判断计算结果的最高位,最高位为1,则SF为1
OF是用来判断带符号数的溢出的,那么什么情况我们认为发生溢出了呢?
	一个正数和一个负数相加会发生溢出吗?不会
	两个同符号数相加,得到一个异号的数呢?显然发生溢出了
	计算机如何判断这个呢?(单符号位)
		判断计算俩数与计算结果的符号位
		或者是 最高位与次高位 进位值的异或
	显然,对于无符号数,7FH+01H=80H是正常的,不算溢出,所以OF只能判断带符号位的溢出
CF是用来判断无符号数的溢出的,那么什么情况我们认为发生溢出了呢?
	在两数相加时,超过最大限值,即最高位进位,为上溢。在两数相减时,结果为负,即最高位借位,为下溢。
	两数相加:比如 FFH+01H=(1)00H,像这样的,进位了,便发生溢出
	两数相减:比如04H-05H=04H+FBH=FFH,没有进位,便是发生溢出。
		对这里我解释一下,我们知道补码的原理,-05H实际上是变成100H-05H,也就是FBH来计算的,也就是事先借了个位
		所以这里的 补码加法没有进位 说明了借的位用掉了,那么这就是说 原码减法发生了借位。
		如果用05H-04H=05H+100H-04H=05H+FCH=100H+01H,这里借的位没有用上,所以加法发生了进位
	对于为什么CF不能判断带符号位的溢出:(-1)+(-1) <--> FFH+FFH=(1)FEH <--> -2, 溢出了,但对于带符号数,这是正常计算

这是书上给的计算公式,注意 C i n = 0 C_{in}=0 Cin=0表示是加法运算, C i n = 1 C_{in}=1 Cin=1表示是减法运算
在这里插入图片描述

FFE8H+7FE6H=(1)7FCEH  总共是16位的大小,1是溢出的位
ZF位:显然7FCEH不是0,故ZF=0
SF位:7FCEH最高位为0,故SF=0
OF位:FFE8H,7FE6H,7FCEH的最高位分别为1,0,0。1+0-->0,显然溢出,OF=1
CF位:加法运算,溢出位为1,因此CF=1

FFE8H-7FE6H=FFE8H+801AH=(1)8002H
解释一下,计算机内数字是以补码形式存储的,16,8,2进制的数其实是直接被视为补码存储到了计算机里,不加变换的,也就是说FFE8H,7FE6H在计算机里存储的就是FFE8H,7FE6H,上面的减法就是补码的减法
而我们知道,减去数a的补码其实等于加上-a的补码(减1等于加负1的意思,只不过是用补码格式计算而已,好比二进制,十进制计算只是进制不同)
a的补码和-a补码的关系是,符号位在内全部取反,然后加1(证明:a-->-a-->-a补码)
所以7FE6H,符号位在内全部取反为8019H,加1后为801AH,
故FFE8H-7FE6H=FFE8H+801AH

ZF位:显然8002H不是0,故ZF=0
SF位:8002H最高位为1,故SF=1
OF位:FFE8H、801AH、8002H的最高位分别为1,1,1。1+1-->1,显然无溢出,OF=0
CF位:减法运算,溢出位为1,因此CF=0

例题取自王道计算机组成原理的4.3节 程序的机器级代码表示 选择题1,2,故可以保证标志位的计算无误。
话说这玩意,我自己回头看都有些迷糊,其他人看着是不是挺烦的

  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值