我只知道 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部分写代码时,更有可能成为错误的来源。)