假设我在x86中有以下说明
add dh, dl ; These are both unsigned integers.
jb loc_123456
Run Code Online (Sandbox Code Playgroud)
jb在这种情况下意味着什么?一般来说,它意味着"如果低于标准跳跃",但我不确定这意味着什么.
根据英特尔软件开发人员手册, “ 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通常在“ 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视为“如果不低于或等于则跳转”,则毫无意义,