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
文档和汇编输出可以提取下表:
+------+----------+
| cond | mnemonic |
|------+----------|
| 0001 | EQ |
| 0000 | NE |
| 1011 | GE |
| 1010 | LT |
| 1101 | GT |
| 1100 | LE |
+------+----------+
现在,当人们查看ARM手册中的条件代码时,混乱就开始了:
它们是相反的!
+-----------------+----------+
| ASSEMBLER | MANUAL |
+------+----------+----------+
| cond | mnemonic | mnemonic |
|------+----------+----------|
| 0001 | EQ | NE |
| 0000 | NE | EQ |
| 1011 | GE | LT |
| 1010 | LT | GE |
| 1101 | GT | LE |
| 1100 | LE | GT |
+------+----------+----------+
有人可以向我指出我所犯的“明显”错误吗?