Assembly 什么是;jb";如果前面有一个“则表示”;加上「;指挥部?

Assembly 什么是;jb";如果前面有一个“则表示”;加上「;指挥部?,assembly,x86,disassembly,instructions,Assembly,X86,Disassembly,Instructions,假设我在x86中有以下指令 add dh, dl ; These are both unsigned integers. jb loc_123456 在此上下文中,jb表示什么?通常它的意思是“低于时跳转”,但我不确定这在上下文中是什么意思。jb如果设置了进位标志,则跳转,当加法溢出时跳转 如果其中一个整数是有符号的,我们还必须查看符号位并使用jg指令。根据“JB”表示“在下面跳转” 5.1.7控制传输指令 控制传输指令提供跳转、条件跳转、循环以及调用和返回操作来控制程序

假设我在x86中有以下指令

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

在此上下文中,
jb
表示什么?通常它的意思是“低于时跳转”,但我不确定这在上下文中是什么意思。

jb
如果设置了进位标志,则跳转,当加法溢出时跳转

如果其中一个整数是有符号的,我们还必须查看符号位并使用
jg
指令。

根据“JB”表示“在下面跳转”

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

  • JE/JZ相等时跳转/零时跳转
  • JNE/JNZ不相等跳转/不为零跳转
  • JA/JNBE高于或等于时跳转/不低于或等于时跳转
  • 高于或等于JAE/JNB跳转/不低于JAE/JNB跳转
  • JB/JNAE低于时跳转/不高于或等于时跳转
  • JBE/JNA低于或等于跳转/不高于跳转
  • JG/JNLE如果大于或等于跳转/如果不小于或等于跳转
  • JGE/JNL大于或等于跳转/小于或等于跳转
  • JL/JNGE跳转(如果小于/如果不大于或等于)
  • JLE/JNG如果小于或等于跳转/如果不大于跳转
  • 如果进位跳转
  • 如果不携带JNC跳转
  • 溢出时跳转
  • 如果没有溢出,JNO跳转
  • 如果符号为负,则JS跳转
  • JNS非符号跳转(非负)
  • JPO/JNP奇偶校验跳转/非奇偶校验跳转
  • JPE/JP奇偶校验跳转/奇偶校验跳转
x86条件分支只识别8种类型的条件(及其逆项,总共16种)。你使用哪种助记符(同义词)取决于具体情况,通常你会使用更有意义的词。如果您反汇编代码,那么反汇编程序可能不够聪明,无法选择最有意义的选择。注意,在上面的列表中,Intel列出了18个条件跳转,而不是16个,这是因为

  • JB/JNAE/JC都按照相同的指令进行组装
  • JAE/JNB/JNC全部汇编到同一条指令
同义词组合在一起

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

cmp dh,dl
jb loc_123456      ; jump if DH is below DL
如果设置了进位标志,“JB”分支。如前所述,您还可以使用JNAE“如果不高于或等于跳转”,执行相同的条件分支

或者用“JC”

在您的情况下,使用“JC”可能是一个更好的选择,如果进位设置为jump,则使用“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 rotate指令将DL向左旋转一位,将EFLAGS进位标志设置为旋转的最后一位。INC指令将DH增加1,保留EFLAGS进位标志,在EFLAGS中设置其他算术标志。JNBE是一种“不低于或等于时跳转”,如果EFLAGS进位标志为零且EFLAGS零标志清除,则该跳转将分支。如果在增加DH后DH寄存器不为零,则清除零标志(除非DH为0xFF并在增加DH后包装为0x00,否则为真)。进位标志被设置为匹配左旋转的最后一位,换句话说,左旋转后DL的最低有效位(以前的最高有效位)。如果你认为JNBE是“不低于或等于时跳转”,那么JNBE就没有什么意义,但是如果你认为它只是测试进位标志和零位标志是否都为零,那么JNBE就可能有意义。

IIRC,在x86上,“JB”表示“借用时跳转”,如果进位标志按照Simon指出的那样设置,就会出现这种情况。@stix:No,语义是“低于时跳转”(无符号)。但是,是的,它是
jc
的同义词,测试CF,是的x86的进位标志确实作为sub/cmp的“借用”输出工作(与ARM不同,例如,在ARM中它是反向的)。请澄清一下。为什么顶部的注释说它意味着“借用时跳转”,例如出现溢出?@KevinBurke评论说IIRC“(如果我没记错的话)-但这是不正确的。我在上面的回答中添加了更多信息和对英特尔文档的引用。
add dh, dl            ; These are both unsigned integers.
jc loc_123456         ; Jump if carry set
rol   dl,1
inc   dh
jnbe  loc_123456