Assembly JS和JL x86指令之间的差异
似乎JS和JL都可以在下面的代码片段(Assembly JS和JL x86指令之间的差异,assembly,x86,Assembly,X86,似乎JS和JL都可以在下面的代码片段(var>=0)中实现比较,那么使用这两个来实现if/else有什么区别呢 顺便说一句:他们检查的EFLAG有点不同,所以我也想知道为什么不同的EFLAG会被测试为类似的语句 int var; if (var >= 0) { ... } else { ... } JS如果设置了符号标志(SF=1)则跳转,而JL如果符号标志不等于溢出标志(SF!=OF)则跳转 在某些情况下,这些条件中的一个将得到满足,而另一个则不满足。考虑以下事项: mov al, -
var>=0
)中实现比较,那么使用这两个来实现if/else有什么区别呢
顺便说一句:他们检查的EFLAG有点不同,所以我也想知道为什么不同的EFLAG会被测试为类似的语句
int var;
if (var >= 0)
{
...
}
else
{
...
}
JS
如果设置了符号标志(SF=1
)则跳转,而JL
如果符号标志不等于溢出标志(SF!=OF
)则跳转
在某些情况下,这些条件中的一个将得到满足,而另一个则不满足。考虑以下事项:
mov al, -100
cmp al, 30
在此,将根据-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
进一步的研究表明,要在C中实现条件语句,JS/JL
的选择取决于先前的比较指令。如果通过TEST
进行比较,则使用JS;如果通过CMP
进行比较,则使用JL
,TEST
指令总是清除,因此在测试之后,JL和JS是等效的。编译器可以在测试
后使用JS,如果它喜欢的话。测试eax,eax
/jl
工作得非常好,因为。