gpt4 book ai didi

assembly - 如果前面有 "jb"命令,那么 "add"表示什么?

转载 作者:行者123 更新时间:2023-12-02 20:43:20 25 4
gpt4 key购买 nike

假设我在 x86 中有以下说明

add dh, dl            ; These are both unsigned integers.
jb loc_123456

jb 在此上下文中表示什么?一般来说,它的意思是“如果低于则跳转”,但我不确定这在这种情况下意味着什么。

最佳答案

根据 Intel's Software Developer's Manual,“JB”代表“如果低于则跳转”

5.1.7 Control Transfer Instructions The control transfer instructions provide jump, conditional jump, loop, and call and return operations to control program flow.

  • JE/JZ Jump if equal/Jump if zero
  • JNE/JNZ Jump if not equal/Jump if not zero
  • JA/JNBE Jump if above/Jump if not below or equal
  • JAE/JNB Jump if above or equal/Jump if not below
  • JB/JNAE Jump if below/Jump if not above or equal
  • JBE/JNA Jump if below or equal/Jump if not above
  • JG/JNLE Jump if greater/Jump if not less or equal
  • JGE/JNL Jump if greater or equal/Jump if not less
  • JL/JNGE Jump if less/Jump if not greater or equal
  • JLE/JNG Jump if less or equal/Jump if not greater
  • JC Jump if carry
  • JNC Jump if not carry
  • JO Jump if overflow
  • JNO Jump if not overflow
  • JS Jump if sign (negative)
  • JNS Jump if not sign (non-negative)
  • JPO/JNP Jump if parity odd/Jump if not parity
  • JPE/JP Jump if parity even/Jump if parity

x86 条件分支仅识别 8 种类型的条件(及其逆条件,因此总共 16 种)。使用哪种助记符(同义词)取决于具体情况,通常您会使用更有意义的助记符。如果反汇编代码,那么反汇编程序可能不够智能,无法选择最有意义的选择。请注意,在上面的列表中,英特尔列出了 18 个条件跳转,而不是 16 个,这是因为

  • JB/JNAE/JC 全部汇编为同一条指令
  • JAE/JNB/JNC 全部汇编为同一条指令

Here's a convenient table,同义词分组在一起。

JB通常用在“CMP”之后,类似这样

cmp dh,dl
jb loc_123456 ; jump if DH is below DL

如果设置了进位标志,则“JB”分支。如前所述,您还可以使用 JNAE“如果不高于或等于则跳转”执行相同的条件分支

cmp dh,dl
jnae loc_123456 ; jump if DH is not above or equal to DL

或者用“JC”

cmp dh,dl
jc loc_123456 ; jump if there was a carry (borrow) when subtracting DL from DH

在您的情况下,使用“JC”可能是更好的选择,如果进位设置则跳转

add dh, dl            ; These are both unsigned integers.
jc loc_123456 ; Jump if carry set

将条件分支视为测试前一条指令的结果是很方便的 - 然而它在 x86 架构中的定义方式 EFLAGS 寄存器是保存结果条件代码的“中间人”。某些指令(通常是算术、逻辑、比较)会更新 EFLAGS 寄存器来指示运算结果,而条件分支指令又使用 EFLAGS 寄存器来确定是否进行分支。

关于指令计算哪些 EFLAGS 位有一些晦涩的规则,有时无论操作数如何,总是设置为 1 或 0,对于其他指令,某些 EFLAGS 位未定义,并且某些指令保留某些 EFLAGS 位(不被操作说明)。例如,INC 和DEC 指令将进位标志的内容保留在EFLAGS 中。循环指令更新进位和溢出标志并保留其他标志,如果计数大于 1,则循环后溢出标志未定义...等等。

这里有一个人为的例子来说明这一点。在此示例中,条件分支正在测试在两个不同的 8 位寄存器上运行的两条不同指令的结果。

rol   dl,1
inc dh
jnbe loc_123456

ROL 循环指令将 DL 左循环一位,并将 EFLAGS 进位标志设置为循环的最后一位。 INC 指令将 DH 加 1,保留 EFLAGS 进位标志,设置 EFLAG 中的其他算术标志。 JNBE 是“如果不低于或等于则跳转”,如果 EFLAGS 进位标志为零且 EFLAGS 零标志清零,则进行分支。如果在递增 DH 后 DH 寄存器不为零,则零标志被清除(这是正确的,除非 DH 为 0xFF 并且在递增后将其包装为 0x00)。进位标志设置为与左移的最后一位相匹配,换句话说,左移后 DL 的最低有效位(之前是最高有效位)。如果您将 JNBE 视为“如果不低于或等于则跳转”,则 JNBE 没什么意义,但如果您将其视为简单地测试进位标志和零标志是否都为零,则可能有意义。

关于assembly - 如果前面有 "jb"命令,那么 "add"表示什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23370521/

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