x86中的JCC指令是什么

What is the JCC instruction in x86

我只知道 x86 AT&T 语法中的 je、jnl 等指令。

jcc 究竟是什么意思?所有跳转指令?

cc代表condition code

Jcc不是一条指令,它只是描述了跳转前检查条件码的jump mnemonics

JNE例如跳转前检查条件码

典型的情况是做一个比较(设置CC),然后使用其中一个跳转助记符。

条件码也可以用ANDORXOR、加法、减法(当然也可以是CMP)来设置。

CC 表示条件代码。通常这意味着 FLAGS 的状态,但 JECXZ 除外,英特尔将其与 Jcc insn set ref manual entry.

中的其他 Jcc 指令组合在一起

其他手册,如 Agner Fog's instruction tables,通常将 JECXZ 与基于标志的跳转分开,因为它们的表现不同。

All jump instructions?

不,绝对不是。

x86还有一条条件跳转指令:LOOP/LOOPcc. LOOPE LOOPNE are the only conditions available, not the full set of flag states. (Don't use LOOP, it's slow)

Jcc 也不包括 JMP 或任何其他无条件 跳转,甚至是间接跳转(例如 AT&T 语法中的 jmp *rax)。总是采用间接跳转,但可以有一个可变的目的地。 CALL和RET也是跳转。

甚至 XBEGIN operates as a jump if a transactional memory operation 在到达 XEND 指令之前中止,因此它是事务提交或中止的条件分支。


还有其他 "cc" 指令使用与条件跳转相同的 FLAGS 条件:SETcc and CMOVcc。就像 Jcc 一样,FLAGS 是这些指令的数据输入,它们的数据输出取决于它。所以你可以在没有跳转的情况下做基于标志的事情。


术语不仅限于 x86:

GNU C 内联汇编语法也 uses "cc" to declare that an inline-asm statement clobbers the machine's condition codes。 (这在 x86 和 x86-64 上是隐含的:你永远不需要显式的 "cc" 破坏。与某些架构(例如 ARM)不同,大多数 x86 指令修改标志,因此当 gcc 移植到 x86 时,设计者决定它不太可能有助于编写更好的代码,而且当人们忘记在 clobber 部分编写 "cc" 时,更有可能成为错误的来源。)