assembly - 与 0 (x86) 比较后的 JNB

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

关于assembly - 与 0 (x86) 比较后的 JNB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15052894/

相关文章:

gcc - 更改 GCC 的输出以进行 0-set(清除)操作

gcc - 是否可以找到 GCC 可以生成的所有汇编指令的列表?

c++ - Microsoft Visual C++ 是否不使用带有 float 的 C/C++ 调用约定?

c - "Trace/breakpoint trap (core dumped)"在汇编中除以负值时出错

macos - 为什么我的 x86 链表函数会抛出段错误?

从 C 调用汇编函数

assembly - 为什么这段代码在调用函数后两次弹出到同一个寄存器?

assembly - EAX 寄存器的反转字节顺序

linux - 使用 waitid 系统调用在汇编中等待克隆的 child

c - 缓冲区溢出缓冲区长度