如果前面加上"add"命令,"jb"表示什么?

Kev*_*rke 4 x86 instructions

假设我在x86中有以下说明

add dh, dl            ; These are both unsigned integers.
jb loc_123456
Run Code Online (Sandbox Code Playgroud)

jb在这种情况下意味着什么?一般来说,它意味着"如果低于标准跳跃",但我不确定这意味着什么.

Sim*_*ter 7

jb 如果进位标志置位则跳转,这是加法溢出时的跳转.

如果其中一个整数已签名,我们还必须查看符号位并jg改为使用该指令.


amd*_*mdn 5

根据英特尔软件开发人员手册, “ JB”代表“跳到下面”

5.1.7控制传递指令 控制传递指令提供跳转,条件跳转,循环以及调用和返回操作,以控制程序流。

  • JE / JZ如果相等则跳跃/如果零则跳跃
  • JNE / JNZ如果不相等则跳转/如果不为零则跳转
  • JA / JNBE如果大于则跳转/不小于等于则跳转
  • JAE / JNB如果大于或等于则跳转/不小于则跳转
  • JB / JNAE如果低于则跳转/不大于或等于则跳转
  • JBE / JNA如果小于等于则跳转/不大于等于跳转
  • JG / JNLE如果大于则跳转/不小于等于则跳转
  • JGE / JNL如果大于或等于则跳转/不小于则跳转
  • JL / JNGE小于则跳转/大于或等于则跳转
  • JLE / JNG小于或等于则跳转/不大于则跳转
  • JC如果进位则跳转
  • JNC如果不携带则跳转
  • JO溢出时跳转
  • JNO如果不溢出则跳转
  • JS如果有符号则跳转(负)
  • JNS如果没有符号则跳转(非负)
  • JPO / JNP如果奇偶校验则跳转/如果不是奇偶校验则跳转
  • JPE / JP如果奇偶校验则跳转/如果奇偶校验则跳转

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

  • JB / JNAE / JC全部组装到同一指令
  • JAE / JNB / JNC全部组装到同一指令

这是将同义词分组在一起的便捷表格

JB通常在“ CMP”之后使用,像这样

cmp dh,dl
jb loc_123456      ; jump if DH is below DL
Run Code Online (Sandbox Code Playgroud)

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

cmp dh,dl
jnae loc_123456    ; jump if DH is not above or equal to DL
Run Code Online (Sandbox Code Playgroud)

或带有“ JC”

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

在您的情况下,使用“ JC”可能是一个更好的选择,如果套入,则跳转

add dh, dl            ; These are both unsigned integers.
jc loc_123456         ; Jump if carry set
Run Code Online (Sandbox Code Playgroud)

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

关于一条指令计算哪些EFLAGS位有一些奥秘的规则,有时不管操作数如何,总将其设置为1或0,对于其他指令,某些EFLAGS位未定义,某些指令保留某些EFLAGS位(该指令不变)。例如,INC和DEC指令将EFLAGS中的进位标志的内容保留下来。轮换指令更新进位和溢出标志,并保留其他标志,如果计数大于一个,则轮换后未定义溢出标志,等等。

这是一个正确的例子。在此示例中,条件分支正在测试在两个不同的8位寄存器上运行的两个不同指令的结果。

rol   dl,1
inc   dh
jnbe  loc_123456
Run Code Online (Sandbox Code Playgroud)

ROL旋转指令将DL向左旋转一位,将EFLAGS进位标志设置为旋转的最后一位。INC指令将DH递增1,保留EFLAGS进位标志,在EFLAG中设置其他算术标志。如果EFLAGS进位标志为零且EFLAGS零标志清零,则JNBE是一个“跳转,如果不小于或等于”。如果在DH递增之后DH寄存器不为零,则清零标志(除非DH为0xFF且在将其包装为0x00之后才为真)。进位标志设置为匹配左旋转的最后一位,换句话说,左旋转之后的DL的最低有效位(以前是最高有效位)。如果您将JNBE视为“如果不低于或等于则跳转”,则毫无意义,