【发布时间】:2016-09-19 07:50:41
【问题描述】:
我只知道 x86 AT&T 语法中的 je、jnl 等指令。
jcc 究竟是什么意思?所有跳转指令?
【问题讨论】:
-
通常文档一眼就能回答这样的问题...
-
我认为这只是通用形式,其中
j表示“跳跃”,cc表示条件代码,可以是任何常用的,z、nz等.
标签: assembly x86 intel opcode mnemonics
我只知道 x86 AT&T 语法中的 je、jnl 等指令。
jcc 究竟是什么意思?所有跳转指令?
【问题讨论】:
j 表示“跳跃”,cc 表示条件代码,可以是任何常用的,z、nz 等.
标签: assembly x86 intel opcode mnemonics
cc 代表condition code。
Jcc不是一条指令,它只是描述了在跳转前检查条件码的jump mnemonics。
例如JNE,在跳转前检查条件码。
典型的情况是进行比较(设置CC),然后使用其中一个跳转助记符。
条件码也可以用AND、OR、XOR、加法、减法(当然也可以是CMP)等指令设置。
【讨论】:
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 也是跳转。
如果 transactional memory operation 在到达 XEND 指令之前中止,即使 XBEGIN 也作为跳转操作,因此它是事务提交或中止的条件分支。
还有其他“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"时更有可能成为错误的来源。)
【讨论】: