gpt4 book ai didi

assembly - JS和JL x86指令的区别

转载 作者:行者123 更新时间:2023-12-05 01:47:32 30 4
gpt4 key购买 nike

看来JS和JL都可以在下面的代码片段(var >= 0)中实现比较,那么用这两个来实现if/else有什么区别呢?

顺便说一句:他们检查的 EFLAGS 有点不同,所以我也想知道为什么不同的 EFLAGS 会针对类似的语句进行测试。

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

最佳答案

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

关于assembly - JS和JL x86指令的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25031860/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com