2

我有这个 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 的二进制表示中,寄存器的值如何低于零?

4

2 回答 2

5

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

于 2013-02-24T15:11:22.393 回答
3

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

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

于 2013-02-24T15:11:15.167 回答