我有这个 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
当进位标志为零时指令跳转。该指令根据从操作数中减去操作数cmp
的结果更新标志。操作数是 Intel 表示法中的第一个操作数,因此,标志将根据. 当等于零时,进位标志将在零时清除,否则设置。总而言之,分支将在等于 0 时发生。src
dst
dst
[ebp+var_8]-eax
[ebp+var_8]
eax
eax
jnb
(实际上是 的别名jnc
)使用“无符号谓词”之一,因此对于jnb
,值永远不会低于零。
但是零是比较的第一个参数,所以它实际上是在计算 0 - eax
(然后它只保留标志,而不是结果),然后如果没有进位,它就会跳转。所以归结为:如果Str_len
为零则跳转。