汇编练习:有符号数比较的相关位置状态

描述

两个有符号整数为了比较大小,可以计算二者的差,然后看状态寄存器的相关位。我们断言:

如果a<b,那么ZF=0SF\neq OF,即零状态位为0(也就是相减结果不为0),并且符号位SF的结果和溢出位OF不一致的。

首先,如果a<b,二者必然不相等,因此减法结果一定不为0,所以ZF=0很好理解。
SF\neq OF直观上说明:

  • 如果差是负数(SF=1),则一定没有发生溢出(OF=0);
  • 如果差是非负数(SF=0),则一定发生了溢出(OF=1

那么如何理解SF,OF这俩个位?

理解

溢出

关于溢出。考虑一个4位的假想CPU,则一个有符号整数的表示范围显然是-8\sim7,如果运算结果超过7就会发生上溢出,此时会绕回到负端;同理如果运算结果小于-8,就会发生下溢出,此时会绕回到正端。例如,5+4=9,因为9>7,因此发生了上溢出,绕回到负端就是-7;又如-4+(-5)=-9,因为-9<-8,因此发生了下溢出,就会绕回到正端就是7

我们可以把数域范围想象成一个钟表:

那么可以将算式理解为在的基础上向某个方向走了步,如果表示是顺时针,否则表示方向是逆时针。因此,可以理解为从刻度顺时针走步,可见到达:
同理,认为是,表示从的刻度开始逆时针走步,于是刚好到:

减法与溢出

考虑减法a-b\;(a\neq b),可以看作是0+(a-b)。令c=|a-b|,这就是说,其结果就是从0刻度按照某个方向走c步所达到的位置。显然,1\leqslant c\leqslant15,这就意味着,从0出发,顺时针最多到达-1,逆时针最多到达1,如下图所示

因此,如果,那么,于是其结果就是逆时针走步,当结果是时没有发生溢出,此时结果是负数,所以有;如果发生了溢出,可以发现此时一定是下溢出,溢出后的结果只可能是,不可能出现负数(因为最远到达1,不可能又绕回到负数端),因此如果此时,那么必然有。

反过来说,当二者相减后,如果ZF=0,那么必有a\neq b;此时如果OF=0即没有溢出,那么a<b当且仅当a-b<0当且仅当SF=1;如果OF=1即发生了溢出,且SF=0说明发生了下溢出,这表明a-b<0

综上所述,a<b,当且仅当ZF=0SF\neq OF

总结

其实以4位考虑,有符号数的范围是-8\sim7。此范围任何两个互不相同的数相减,最大值是15,最小值是-15。因此如果能发生下溢出,差一定是负数;如果能发生上溢出,差一定是正数。不可能差是正数但是出现下溢出的情况。

推荐阅读更多精彩内容