gpt4 book ai didi

assembly - CMP 后的 JG/JNLE/JL/JNGE

转载 作者:行者123 更新时间:2023-12-03 03:45:32 27 4
gpt4 key购买 nike

我不明白 CMP 之后的 JG/JNLE/JL/JNGE 指令。

例如,如果我有:

CMP al,dl
jg label1

al=101时; dl =200

我们问jg什么?是在 al>dl 上吗?或al-dl>0

下一个代码有同样的问题:

test al,dl
jg label1

我不明白我们比较什么,也不明白我们问“jg”是什么。

换句话说,我不明白什么时候我们会跳转到 label1,什么时候不会。

最佳答案

当您执行 cmp a,b 时,标志的设置就像您计算过 a - b 一样。 。然后条件跳转指令检查这些标志以确定是否应该进行跳转。

换句话说,您拥有的第一个代码块(添加了我的注释):

cmp  al, dl     ; set flags based on the comparison.
jg label1 ; then jump based on the flags.

会跳转到label1当且仅当al大于dl .

您最好将其视为 al > dl但你的两个选择在数学上是等价的:

al          >   dl
(al - dl) > (dl - dl) [subtract dl from both sides]
(al - dl) > 0 [cancel the terms on the right hand side]

使用 jg 时需要小心因为它假设您的值已签名。因此,如果您比较字节 101 ( 101 以二进制补码表示)与 200 ( -56 以二进制补码表示),前者实际上会更大。如果这不是您想要的,您应该使用等效的无符号比较。

参见here有关跳转选择的更多详细信息,为了完整起见,按以下顺序复制如下:

  • 未签名或未签名的在 CMP 之后使用时进行比较。
  • 未签名的。
  • 签名。
<表类=“s-表”><标题>说明描述签名已检查条件 <正文>乔溢出则跳转OF = 1JNO不溢出则跳转OF = 0JS如果有符号则跳转SF = 1JNS如果没有符号则跳转SF = 0JE
JZ如果相等则跳转
如果为零则跳转ZF = 1JNE
JNZ不等于则跳转
不为零则跳转ZF = 0JP
JPE如果奇偶校验则跳转
如果奇偶校验偶数则跳转PF = 1JNP
JPO无奇偶校验则跳转
奇偶校验则跳转PF = 0JCXZ
JECXZ
JRCXZ如果CX为零则跳转
如果ECX为零则跳转
如果RCX为零则跳转CX = 0
ECX = 0
RCX = 0JB
JNAE
JC如果低于则跳转
如果不高于或等于则跳转
如果进位则跳转未签名CF = 1JNB
JAE
JNC不低于则跳转
高于或等于则跳转
不进位则跳转未签名CF = 0JBE
JNA如果低于或等于则跳转
如果不高于则跳转未签名CF = 1 或 ZF = 1JA
JNBE如果高于则跳转
如果不低于或等于则跳转未签名CF = 0 且 ZF = 0JL
JNGE小于则跳转
不大于或等于则跳转签名SF <> OFJGE
JNL大于或等于则跳转
不小于则跳转签名SF = OFJLE
JNG小于或等于则跳转
如果不大于则跳转签名ZF = 1 或 SF <> OFJG
JNLE如果大于则跳转
如果不小于或等于则跳转签名ZF = 0 且 SF = OF

关于 assembly - CMP 后的 JG/JNLE/JL/JNGE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9617877/

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