我只知道x86 AT& T语法中的je,jnl等指令。
jcc究竟是什么意思?所有跳转说明?
答案 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条件:SETcc和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"
clobber。与一些架构(例如ARM)不同,大多数x86指令都会修改标志,所以当gcc移植到x86时,设计师决定使用它不太可能帮助制作更好的代码,当人们忘记在clobber部分写"cc"
时,更有可能成为错误的来源。)