![](/img/trans.png)
[英]How to determine when zero flag, sign flag, overflow flag and carry flag are set?
[英]How does comparing the Sign and Overflow Flag determine operand relationships?
基于比较带符号整数的跳转基于零,符号和溢出标志来确定操作数之间的关系。 在具有两个带符号的操作数的CMP
之后,存在三种可能的情况:
ZF = 1
目标=源 SF = OF
OF-目的地>源 SF != OF
OF-目标<源 我在理解方案2和3时遇到了麻烦。我已经研究了可能的组合,并看到它们确实起作用-但我仍然不知道它们为什么起作用。
谁能解释为什么Sign和Overflow标志的比较反映了有符号整数关系?
编辑:
关于我的要求似乎有一些理解。 基于带符号比较的跳转使用零,符号和进位标志-这些标志包括JG
, JL
等。
例如:
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 <> OF
时A > B
SF <> OF
而仅当SF = OF
时A < 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 = SF 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.