Assembly 与0(x86)比较后的JNB

Assembly 与0(x86)比较后的JNB,assembly,x86,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的二进制表示中,寄存器的值怎么可能低于零呢?jnb(实际上是jnc的别名)使用了一个“无符号谓词”,因此对于jnb,值永远不

我有以下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的二进制表示中,寄存器的值怎么可能低于零呢?

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


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

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