与0(x86)比较后的JNB

时间:2013-02-24 14:50:06

标签: assembly x86

我有这个x86汇编代码:

mov     [ebp+var_8], 0

mov     eax, Str_len

cmp     [ebp+var_8], eax

jnb     short loc_4018C4

如果Str_len总是与0不同,那么这个JNB会执行什么?我的理由是,如果Str_len变量永远不会低于0,则跳转永远不会执行,对吧?

顺便说一句,在x86的二进制表示中,寄存器如何具有低于零的值?

2 个答案:

答案 0 :(得分:4)

当进位标志为零时,

jnb指令跳转。 cmp指令根据src操作数中dst操作数的减法结果更新标志。 dst操作数是Intel表示法中的第一个操作数,因此,将根据[ebp+var_8]-eax的结果更新标志。当[ebp+var_8]等于零时,当eax为零时,进位标志将被清除,否则将被设置。总而言之,当eax等于零时,分支将发生。

答案 1 :(得分:3)

jnb(实际上是jnc的别名)使用其中一个“无符号谓词”,因此对于jnb,值永远不会低于零。

但是零的东西是比较的第一个参数,所以它实际上是计算0 - eax(然后它只保留标志,而不是结果),然后如果没有进位则跳转。所以它归结为:如果Str_len为零,则跳转。