目前我尝试研究指令空间或ARMv7处理器的重新分区,参见文档找到here。目前有一个令我困惑的细节,就是处理器在一些指令对之间消除歧义。
让我们举例说明以下两条THUMB指令:
A8.8.18 B:编码T3
+-+-+-+-+-+-+-------+-----------+-+-+--+-+--+---------------------+
|1|1|1|1|0|S| cond | imm6 |1|0|J1|0|J2| imm11 |
+-+-+-+-+-+-+-------+-----------+-+-+--+-+--+---------------------+
A8.8.32 CLREX:编码T1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+-+--+-+-+-+-+-+-+-+-+-+-+-+
|1|1|1|1|0|0|1|1|1|0|1|1|1|1|1|1|1|0|0 |0|1 |1|1|1|0|0|1|0|1|1|1|1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+-+--+-+-+-+-+-+-+-+-+-+-+-+
要注意的两件事是两条指令的所有固定位都相等,其次第二条指令的cond = 1110,这是一个有效的条件代码(AL)。根据指令语义S是符号位,J2:J1:imm6:imm11是相对跳转目标,因此它们可以有任何值。
这种解码看起来很模糊,但我肯定是错的。我在这里错过了什么?任何关于此的亮点都将受到赞赏。
答案 0 :(得分:1)
在B指令的T3编码下,有伪代码,表示:
if cond<3:1> == '111' then SEE "Related encodings";
你可以看到CLREX
确实有1110
(AL)的“cond”字段。
这是有道理的,因为对于无条件分支,编码较短,因此“分支始终/从不”位模式可以重用于其他指令。有关完整列表,请参阅表A6.3.4 Branches and miscellaneous control
。