我只知道 x86 AT&T 语法中的 je、jnl 等指令。
jcc 实际上是什么意思?所有跳转指令?
cc
代表condition code
。
Jcc
不是一条指令,它只是描述了在跳转前检查条件码的跳转助记符。
JNE
例如,在跳转前检查条件代码。
典型情况是进行比较(设置 CC),然后使用其中一个跳转助记符。
条件代码也可以用AND
, OR
, XOR
, 加法,减法(CMP
当然,或者)这样的指令来设置。
CC 表示条件代码。通常这意味着 FLAGS 的状态,除了 JECXZ,英特尔将其与Jcc insn set ref manual entry中的其他 Jcc 指令组合在一起。
其他手册,如Agner Fog 的指令表,通常将 JECXZ 与基于标志的跳转分开,因为它们的执行方式不同。
所有跳转指令?
不,绝对不是。
x86 还有另一个条件跳转指令:LOOP/LOOPcc。LOOPE LOOPNE 是唯一可用的条件,而不是完整的标志状态集。(不要使用 LOOP,它很慢)
Jcc 也不包括 JMP 或任何其他无条件跳转,甚至是间接跳转(例如jmp *rax
在 AT&T 语法中)。总是采取间接跳转,但可以有一个可变的目的地。CALL 和 RET 也是跳转。
如果事务内存操作在到达 XEND 指令之前中止,即使XBEGIN也作为跳转操作,因此它是事务提交或中止的条件分支。
还有其他“cc”指令使用与条件跳转相同的 FLAGS 条件:SETcc和CMOVcc。就像 Jcc 一样,FLAGS 是这些指令的数据输入,它们的数据输出取决于它。所以你可以在没有跳跃的情况下做基于标志的事情。
术语不仅限于 x86:
GNU C 内联汇编语法也用于"cc"
声明 inline-asm 语句破坏了机器的条件代码。(这在 x86 和 x86-64 上是隐含的:你永远不需要显式的"cc"
clobber。与某些架构(例如 ARM)不同,大多数 x86 指令会修改标志,因此当 gcc 被移植到 x86 时,设计人员认为它不太可能帮助更好的代码,当人们忘记"cc"
在clobber部分写代码时,更有可能成为错误的来源。)