我有这个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的二进制表示中,寄存器如何具有低于零的值?
答案 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
为零,则跳转。