这是家庭作业,所以我宁愿被推向正确的方向而不是用勺子喂答案。
任务:为以下指令提供二进制和十六进制编码
SBC R0, R12, R6
使用教授的一些指示,我已经能够将其中的一部分分解为我认为正确的二进制格式:
Cond 000 Op S Rn Rd 00000000 Rm
---- --- ---- - ---- ---- -------- ----
1110 000 0110 0 1100 0000 00000000 0110
以下是我的问题:
1)什么时候是S标志1
而不是0
?如何根据给定的汇编代码判断标志应该是1
还是0
?
2)如何仅根据给定的汇编代码确定它是I型还是R型?
3)为什么3位000
和8位00000000
字段不变?
编辑:处理器是ARMv7
答案 0 :(得分:2)
使用此PDF作为参考,可以在4.5节中找到数据处理说明的格式
请注意,sbc
<opcode>{cond}{S} Rd,Rn,<Op2>
和<Op2>
等指示的汇编语法为Rm{,<shift>}
或,<#expression>
比特31 - 28
这四位是预测指令的条件代码
如果指令中未指定条件代码后缀,则隐含AL
(始终)
AL
编码为1110。
比特27 - 25
数据处理指令的前两位始终为0
如果立即数用作第二个操作数,则最低位为1;如果使用寄存器,则最低位为0
由于r6
是第二个操作数,因此这三个位都为零。
比特24 - 21
这是sbc
的操作码0110。
第20位
这对应于汇编语法的 S 后缀
如果设置,则指令设置标志,否则它们不变。
比特19 - 16
这是第一个操作数寄存器 Rn ,它是r12
,因此该字段值为1100.
第15-12位
这是目标操作数寄存器 Rd ,它是r0
,因此必须将0000用于此字段。
第11 - 0位
该字段根据位25(位 I )的值进行解释
当I = 0时,此字段为
第11 - 4位
转移金额
由于汇编指令中未指定移位,因此这些位为0.
比特3 - 0
第二个操作数寄存器 Rm ,这是r6
所以0110是正确的值。
您需要记住每条指令使用的格式类型 有很多结构,模式出现,一般类别(如“数据处理指令”)可以定义,但最终还有一个助记符(例如操作码值,位字段等...)