什么是x86中的JCC指令

时间:2016-09-19 07:50:41

标签: assembly x86 intel opcode mnemonics

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

jcc究竟是什么意思?所有跳转说明?

2 个答案:

答案 0 :(得分:6)

cc代表condition code

Jcc不是单个指令,它只描述了在跳转之前检查条件代码的jump mnemonics

例如,

JNE,在跳跃之前检查条件代码。

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

条件代码也可以用AND,OR,XOR,加法,减法(或CMP)等指令设置。

答案 1 :(得分:3)

CC表示条件代码。通常这意味着FLAGS的状态,除了JECXZ,英特尔与Jcc insn set ref manual entry中的其他Jcc指令组合在一起。

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

  

所有跳转说明?

不,绝对不是。

x86还有另一个条件跳转指令:LOOP/LOOPcc。 LOOPE LOOPNE是唯一可用的条件,而不是全套旗帜状态。 (Don't use LOOP, it's slow

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

如果XBEGIN在到达XEND指令之前中止,则偶数transactional memory operation将作为跳转运行,因此它是事务提交或中止的条件分支。

还有其他“cc”指令使用与条件跳转相同的FLAGS条件:SETccCMOVcc。就像Jcc一样,FLAGS是这些指令的数据输入,它们的数据输出取决于它。所以你可以做没有跳跃的基于标志的东西。

术语不仅限于x86:

GNU C内联汇编语法也uses "cc" to declare that an inline-asm statement clobbers the machine's condition codes。 (这在x86和x86-64上是隐含的:你永远不需要一个明确的"cc" clobber。与一些架构(例如ARM)不同,大多数x86指令都会修改标志,所以当gcc移植到x86时,设计师决定使用它不太可能帮助制作更好的代码,当人们忘记在clobber部分写"cc"时,更有可能成为错误的来源。)