caf*_*aze 2 x86 assembly digital-logic
基于比较有符号整数的跳转使用零、符号和溢出标志来确定操作数之间的关系。在CMP使用两个有符号操作数之后,有三种可能的情况:
ZF = 1 - 目的地 = 来源SF = OF - 目的地 > 来源SF != OF - 目的地 < 来源我无法理解场景 2 和 3。我已经研究了可能的组合并看到它们确实有效 - 但我仍然无法弄清楚它们为什么有效。
谁能解释为什么 Sign 和 Overflow 标志的比较反映了有符号整数关系?
编辑:
似乎对我的要求有所了解。基于有符号比较的跳转使用零、符号和进位标志 - 这些包括JG、JL等。
例如:
mov al, 1
cmp al, -1
jg isGreater
isGreater:
Run Code Online (Sandbox Code Playgroud)
跳转是因为Overflow flag = Sign Flag(两者都是0),说明在有符号比较方面,目的操作数大于源操作数。
如果溢出标志设置为 1 并且标志标志设置为 0,则表示目的地较小。
我的问题是 - 我似乎无法理解为什么这实际上有效。
执行有符号减法R = Destination - Source产生有符号结果。
假设没有溢出——通常的算术法则成立:如果R = Destination - Source > 0 那么Destination > Source。
没有溢出意味着OF = 0,R > 0 意味着SF = 0。
现在假设有一个溢出——让我们称O为最重要的非符号位,而S为符号位。
溢出条件意味着 a) 计算结果的O需要借位而结果的S不需要,或者 b) 结果的O不需要借位而S需要。
在 a) 情况下,由于 result 的S不需要借位,操作数的两个S位是 (1, 0) (1, 1) 或 (0, 0)。
由于 result 的O需要借位,因此翻转第一个源S位,我们必须排除第二个和第三个选项。
所以操作数的符号位是 1 和 0(因此Destination < Source),根据假设,结果的符号位SF = 0 和OF = 1。
在情况 b) 中,由于 result 的S确实需要借位,因此操作数的两个S位是 (0, 1)。
由于O不需要借位,第一个操作数S位没有改变,我们不需要考虑任何进一步的情况。
所以操作数的符号位是 0 和 1(因此Destination > Source),根据假设,结果的符号位SF = 1 和OF = 1。
回顾一下:
简而言之OF = SF。