繁体   English   中英

比较符号和溢出标志如何确定操作数关系?

[英]How does comparing the Sign and Overflow Flag determine operand relationships?

基于比较带符号整数的跳转基于零,符号和溢出标志来确定操作数之间的关系。 在具有两个带符号的操作数的CMP之后,存在三种可能的情况:

  1. ZF = 1目标=源
  2. SF = OF OF-目的地>源
  3. SF != OF OF-目标<源

我在理解方案2和3时遇到了麻烦。我已经研究了可能的组合,并看到它们确实起作用-但我仍然不知道它们为什么起作用。

谁能解释为什么Sign和Overflow标志的比较反映了有符号整数关系?

编辑:

关于我的要求似乎有一些理解。 基于带符号比较的跳转使用零,符号和进位标志-这些标志包括JGJL等。

例如:

mov   al, 1
cmp   al, -1    
jg    isGreater

isGreater: 

之所以会执行跳转,是因为溢出标志=符号标志(均为0),表示在符号比较方面,目标操作数大于源操作数。

如果将溢出标志设置为1,将符号标志设置为0,则表明目标较小。

我的问题是-我只是似乎无法绕开为什么这确实有效。

OF标志跟踪有符号的溢出 ,即符号的变化。
符号标志显然只是跟踪数字是否为负数。
这两个标志都监视目标操作数的符号或最高有效位(MSB)。

比较CMP指令执行减法。
如果A != B并且两个操作数都具有相同的符号,则显然会发生以下情况(假设dword操作数)。

 100 -  200 = -100 (sign change OF=1 + SF=1, ergo A(100) < B(200)).
-100 - -200 =  300 (sign change OF=1 + SF=0, ergo A(-100) > B(-200)).

如果A和B的符号不同,则会发生以下情况。

-100 - 100 = -200 (no sign change, SF=1, OF=0, A < B)
100 - -100 = 200  (no sign change, SF=0, OF=0, A > B)

这就是涵盖OF + SF的所有可能场景。
如您所见,仅当SF <> OFA > B SF <> OF而仅当SF = OFA < B

唯一的例外是发生未签名的溢出。
假设我们正在比较字节操作数(-128..127)。

126 - -126 = -4 (sign change OF=1 + SF=1, ergo A(126) < B(-126)) ***Oops.

但是,这将触发进位标志( CF )被置位,非溢出操作将不会置位。
仅当计算结果不适合操作数大小时才会出现这些不正确的结果,解决方案是密切关注进位标志,而不假定OF和SF处理所有可能的情况。

执行带符号的减法R = 目标 - 产生带符号的结果。

假设没有溢出-通常的算术定律成立:如果R = Destination - Source > 0,则Destination > Source
没有溢出意味着OF = 0, R > 0意味着SF = 0。

现在假设存在溢出-我们将O称为最高有效的非符号位,将S称为符号位。
溢出条件意味着:a)计算结果的O不需要借位而结果的S不需要,或者b)结果的O不需要借位而S的需要。

在a)情况下,由于结果的S不需要借位,因此操作数的两个S位为(1、0)(1、1)或(0、0)。
由于结果的O需要借位,因此需要翻转第一个源S位,因此我们必须排除第二个和第三个选项。
因此,操作数的符号位分别为1和0(因此Destination < Source ),根据假设,结果的符号位SF = 0和OF = 1。

在情况b)中,由于结果的S确实需要借位,因此操作数的两个S位为(0,1)。
由于O不需要借位,因此第一个操作数S位未更改,因此我们无需考虑任何其他情况。
因此,操作数的符号位为0和1(因此Destination > Source ),根据假设,结果的符号位SF = 1和OF = 1。

回顾一下:

  • 如果OF = 0,目标 > => SF = 0
  • 如果OF = 1,目标 > => SF = 1

简而言之OF = SF

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM