似乎JS和JL都可以在下面的代码片段(var >= 0
)中实现比较,那么使用这些2实现if / else有什么不同?
int var;
if (var >= 0)
{
...
}
else
{
...
}
答案 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 == 0x9C
,30 == 0x1E
,0x9C - 0x1E = 0x7E == 126
。
所以我们得到了一个积极的结果(SF=0
)和溢出(OF=1
)。因此,在这种情况下,JS
不会跳转,JL
会跳转(因为SF != OF
)。
您应该使用哪种跳跃条件取决于您尝试实现的目标。如果你正在比较两个值,你希望它们被解释为有符号并跳转,如果一个小于另一个;使用JL
。如果你想在计算结果为负时跳过;使用JS
。
答案 1 :(得分:0)
进一步的调查显示,要在C中实现条件语句,JS/JL
的选择取决于先前的比较指令。如果通过TEST
进行比较,则使用JS,如果按JL
进行比较则使用CMP
。