x86中的JCC指令是什么?

6

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

jcc指什么?所有跳转指令吗?


通常文档可以在一瞥之间回答这样的问题... - arkascha
4
我认为这只是一种通用形式,其中“j”表示“跳转”,而“cc”表示条件码,可以是任何常规条件码,如“z”、“nz”等。 - Paul R
2
CC代表条件,而不是条件本身。http://x86.renejeschke.de/html/file_module_x86_id_146.html https://en.wikipedia.org/wiki/JCC#Programming - phuclv
2个回答

8

cc 代表条件码。

Jcc 不是单一指令,它只描述在跳转之前检查条件码的跳转助记符

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

典型情况下是进行比较(设置 CC),然后在使用跳转助记符之一。

条件码也可以通过指令如 ANDORXOR、加法、减法(或者当然也可以用 CMP)来设置。


3

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也属于跳转。
即使XBEGIN在到达XEND指令之前事务内存操作中止,它仍然作为跳转操作。因此,它是对事务提交或中止的条件分支。事务性内存操作

有其他使用与条件跳转相同FLAGS条件的“cc”指令:SETccCMOVcc。就像Jcc一样,FLAGS是这些指令的数据输入,并且它们的数据输出取决于它。因此,您可以在没有跳转的情况下执行基于标志的操作。


这个术语不仅限于x86:

GNU C内联汇编语法也使用"cc"来声明一个内联汇编语句破坏了机器的条件码。(这在x86和x86-64上是隐含的:你不需要明确地写出"cc" clobber。与一些体系结构(例如ARM)不同,大多数x86指令修改标志,因此当gcc被移植到x86时,设计者们认为它不太可能帮助生成更好的代码,而且很可能成为人们忘记在clobber部分中写入"cc"的错误来源。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接