Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly JS和JL x86指令之间的差异_Assembly_X86 - Fatal编程技术网

Assembly JS和JL x86指令之间的差异

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, -

似乎JS和JL都可以在下面的代码片段(
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
工作得非常好,因为。