6

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

jcc 实际上是什么意思?所有跳转指令?

4

2 回答 2

8

cc代表condition code

Jcc不是一条指令,它只是描述了在跳转前检查条件码的跳转助记符。

JNE例如,在跳转前检查条件代码。

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

条件代码也可以用AND, OR, XOR, 加法,减法(CMP当然,或者)这样的指令来设置。

于 2016-09-19T08:02:11.333 回答
3

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 条件:SETccCMOVcc。就像 Jcc 一样,FLAGS 是这些指令的数据输入,它们的数据输出取决于它。所以你可以在没有跳跃的情况下做基于标志的事情。


术语不仅限于 x86:

GNU C 内联汇编语法也用于"cc"声明 inline-asm 语句破坏了机器的条件代码。(这在 x86 和 x86-64 上是隐含的:你永远不需要显式的"cc"clobber。与某些架构(例如 ARM)不同,大多数 x86 指令会修改标志,因此当 gcc 被移植到 x86 时,设计人员认为它不太可能帮助更好的代码,当人们忘记"cc"在clobber部分写代码时,更有可能成为错误的来源。)

于 2016-09-19T16:12:15.133 回答