【问题标题】:What is the JCC instruction in x86x86中的JCC指令是什么
【发布时间】:2016-09-19 07:50:41
【问题描述】:

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

jcc 究竟是什么意思?所有跳转指令?

【问题讨论】:

标签: assembly x86 intel opcode mnemonics


【解决方案1】:

cc 代表condition code

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

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

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

条件码也可以用ANDORXOR、加法、减法(当然也可以是CMP)等指令设置。

【讨论】:

    【解决方案2】:

    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 条件: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"时更有可能成为错误的来源。)

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 2012-10-05
      • 2013-05-20
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多