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