JS和JL x86指令之间的区别

时间:2014-07-30 08:16:16

标签: assembly x86

似乎JS和JL都可以在下面的代码片段(var >= 0)中实现比较,那么使用这些2实现if / else有什么不同?

BTW:他们检查的EFLAGS有点不同,所以我也想知道为什么不同的EFLAGS会被测试用于类似的声明。

int var;
if (var >= 0)
{
...
}
else
{
...
}

2 个答案:

答案 0 :(得分:4)

如果符号标志设置为JS,则

SF=1跳转;如果符号标志不等于溢出标志(JL),则SF != OF跳转

有些情况会遇到其中一种情况,但不会影响另一种情况。请考虑以下事项:

mov al, -100
cmp al, 30

此处将根据-100 - 30的结果设置标志。 -100为负数且30为正,但结果(-130)无法用two's complement中的8位表示,因此您将获得算术溢出和积极的结果126。

如果我们使用十六进制表示法,可能更容易看到:-100 == 0x9C30 == 0x1E0x9C - 0x1E = 0x7E == 126

所以我们得到了一个积极的结果(SF=0)和溢出(OF=1)。因此,在这种情况下,JS不会跳转,JL会跳转(因为SF != OF)。

您应该使用哪种跳跃条件取决于您尝试实现的目标。如果你正在比较两个值,你希望它们被解释为有符号并跳转,如果一个小于另一个;使用JL。如果你想在计算结果为负时跳过;使用JS

答案 1 :(得分:0)

进一步的调查显示,要在C中实现条件语句,JS/JL的选择取决于先前的比较指令。如果通过TEST进行比较,则使用JS,如果按JL进行比较则使用CMP