ARM`CSET`条件编码(与vscu一样)

时间:2019-06-10 00:05:12

标签: assembly encoding arm opcode

汇编程序生成的

TL; DR cset代码与ARM手册使用的条件代码不同。


我不了解cset指令的条件编码方式。

我很难理解为什么汇编器生成的二进制代码与查看ARM Architecture Reference Manual - ARMv8之后的代码不同。

我的pi3上的GNU汇编器为不同的cset检查生成了以下代码(我确认该代码可以正常工作):

9a 9f 17 e0        cset    x0, eq  // eq = none
9a 9f 07 e0        cset    x0, ne  // ne = any
9a 9f b7 e0        cset    x0, ge  // ge = tcont
9a 9f a7 e0        cset    x0, lt  // lt = tstop
9a 9f d7 e0        cset    x0, gt
9a 9f c7 e0        cset    x0, le

这里有趣的部分是第12-15位(左侧第5个半字节),它对条件( cond )进行编码,如手册中所示:

CSET documentation from the ARM Architecture manual

使用cset文档和汇编输出可以提取下表:

+------+----------+
| cond | mnemonic |
|------+----------|
| 0001 | EQ       |
| 0000 | NE       |
| 1011 | GE       |
| 1010 | LT       |
| 1101 | GT       |
| 1100 | LE       |
+------+----------+

现在,当人们查看ARM手册中的条件代码时,混乱就开始了:

Condition encoding as stated in the ARM Architecture manual

它们是相反的

+-----------------+----------+
|    ASSEMBLER    |  MANUAL  |
+------+----------+----------+
| cond | mnemonic | mnemonic |
|------+----------+----------|
| 0001 | EQ       | NE       |
| 0000 | NE       | EQ       |
| 1011 | GE       | LT       |
| 1010 | LT       | GE       |
| 1101 | GT       | LE       |
| 1100 | LE       | GT       |
+------+----------+----------+

有人可以向我指出我所犯的“明显”错误吗?

0 个答案:

没有答案