似乎JS和JL都可以实现下面代码片段(var >= 0)中的比较,那么使用这两个来实现if/else有什么区别?
顺便说一句:他们检查的 EFLAGS 有点不同,所以我也想知道为什么不同的 EFLAGS 会针对类似的语句进行测试。
int var;
if (var >= 0)
{
...
}
else
{
...
}
Run Code Online (Sandbox Code Playgroud)
JS如果设置了符号标志 ( SF=1),则JL跳转,如果符号标志不等于溢出标志 ( SF != OF) ,则跳转。
在某些情况下,会满足这些条件之一,但不会满足另一个。考虑以下:
mov al, -100
cmp al, 30
Run Code Online (Sandbox Code Playgroud)
这里的标志将根据-100 - 30. -100为负且30为正,但结果 ( -130) 不能用二进制补码中的 8 位表示,因此您会得到算术溢出和正 126 的结果。
如果我们使用十六进制表示法-100 == 0x9C,这可能更容易看出:, 30 == 0x1E, 0x9C - 0x1E = 0x7E == 126。
所以我们有一个积极的结果 ( SF=0) 和溢出 ( OF=1)。因此,在这种情况下JS不会跳,但JL会(因为SF != OF)。
您应该使用哪种跳转条件取决于您要达到的目标。如果您正在比较两个值,并且希望将它们解释为有符号并在其中一个小于另一个时跳转;使用JL. 如果计算结果是否为负,则要跳转;使用JS.
| 归档时间: |
|
| 查看次数: |
693 次 |
| 最近记录: |