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

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

例如,如果我有:

 CMP al,dl jg label1 

al=101; dl =200 al=101; dl =200

关于我们问什么jg ? 这是在al>dl ? 或al-dl>0

下一个代码也是一样的:

 test al,dl jg label1 

我不明白我们比较什么,以及我们问什么“ jg ”。

换句话说,我不明白我们什么时候会跳到标签1,什么时候我们不会。

谢谢。

当你做一个cmp a,b ,标志被设置,就像你已经计算出a - b

然后jmp -type指令检查这些标志以查看是否应该进行跳转。

换句话说,你有第一块代码(加上我的意见):

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

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

你可能更喜欢把它当作al > dl但是你在那里有两个select在math上是等价的:

 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),前者实际上会更大。 如果这不是你想要的,你应该使用等效的无符号比较。

有关跳选的更多详细信息,请参阅下面的完整性。 首先是签字不合适的签证:

 +--------+------------------------------+-------------+--------------------+ |Instr | Description | signed-ness | Flags | +--------+------------------------------+-------------+--------------------+ | JO | Jump if overflow | | OF = 1 | +--------+------------------------------+-------------+--------------------+ | JNO | Jump if not overflow | | OF = 0 | +--------+------------------------------+-------------+--------------------+ | JS | Jump if sign | | SF = 1 | +--------+------------------------------+-------------+--------------------+ | JNS | Jump if not sign | | SF = 0 | +--------+------------------------------+-------------+--------------------+ | JE/ | Jump if equal | | ZF = 1 | | JZ | Jump if zero | | | +--------+------------------------------+-------------+--------------------+ | JNE/ | Jump if not equal | | ZF = 0 | | JNZ | Jump if not zero | | | +--------+------------------------------+-------------+--------------------+ | JP/ | Jump if parity | | PF = 1 | | JPE | Jump if parity even | | | +--------+------------------------------+-------------+--------------------+ | JNP/ | Jump if no parity | | PF = 0 | | JPO | Jump if parity odd | | | +--------+------------------------------+-------------+--------------------+ | JCXZ/ | Jump if CX is zero | | CX = 0 | | JECXZ | Jump if ECX is zero | | ECX = 0 | +--------+------------------------------+-------------+--------------------+ 

然后是未签名的:

 +--------+------------------------------+-------------+--------------------+ |Instr | Description | signed-ness | Flags | +--------+------------------------------+-------------+--------------------+ | JB/ | Jump if below | unsigned | CF = 1 | | JNAE/ | Jump if not above or equal | | | | JC | Jump if carry | | | +--------+------------------------------+-------------+--------------------+ | JNB/ | Jump if not below | unsigned | CF = 0 | | JAE/ | Jump if above or equal | | | | JNC | Jump if not carry | | | +--------+------------------------------+-------------+--------------------+ | JBE/ | Jump if below or equal | unsigned | CF = 1 or ZF = 1 | | JNA | Jump if not above | | | +--------+------------------------------+-------------+--------------------+ | JA/ | Jump if above | unsigned | CF = 0 and ZF = 0 | | JNBE | Jump if not below or equal | | | +--------+------------------------------+-------------+--------------------+ 

最后,签署的人:

 +--------+------------------------------+-------------+--------------------+ |Instr | Description | signed-ness | Flags | +--------+------------------------------+-------------+--------------------+ | JL/ | Jump if less | signed | SF <> OF | | JNGE | Jump if not greater or equal | | | +--------+------------------------------+-------------+--------------------+ | JGE/ | Jump if greater or equal | signed | SF = OF | | JNL | Jump if not less | | | +--------+------------------------------+-------------+--------------------+ | JLE/ | Jump if less or equal | signed | ZF = 1 or SF <> OF | | JNG | Jump if not greater | | | +--------+------------------------------+-------------+--------------------+ | JG/ | Jump if greater | signed | ZF = 0 and SF = OF | | JNLE | Jump if not less or equal | | | +--------+------------------------------+-------------+--------------------+ 

Wikibooks对跳转指令有一个相当好的总结。 基本上,有两个阶段:

 cmp_instruction op1, op2 

根据结果​​设置各种标志

 jmp_conditional_instruction address 

它将根据这些标志的结果执行跳转。

比较( cmp )将基本上计算减法op1-op2 ,但是,这不被存储; 而是只设置标志结果。 所以如果你做了cmp eax, ebx eax-ebx – 然后根据是否为正值,负值或零来决定要设置哪些标志。

这里更详细的参考。

命令JG仅仅意味着: 如果更大则跳转 。 前面指令的结果存储在某些处理器标志中(在这里它将testingZF = 0和SF = OF),跳转指令根据它们的状态而动作。