Assembly 将汇编指令转换为十六进制格式?

Assembly 将汇编指令转换为十六进制格式?,assembly,arm,armv7,machine-code,Assembly,Arm,Armv7,Machine Code,这是家庭作业,所以我宁愿被推到正确的方向,也不愿被填鸭式地给出答案 任务:为以下指令提供二进制和十六进制编码 SBC R0, R12, R6 根据教授的一些指示,我已经能够将其中的一些内容分解为我认为正确的二进制格式: Cond 000 Op S Rn Rd 00000000 Rm ---- --- ---- - ---- ---- -------- ---- 1110 000 0110 0 1100 0000 00000000 0110

这是家庭作业,所以我宁愿被推到正确的方向,也不愿被填鸭式地给出答案

任务:为以下指令提供二进制和十六进制编码

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

使用它作为参考,可以在第4.5节中找到数据处理指令的格式

点击图片放大

请记住,像
sbc
这样的指令的汇编语法是
{cond}{S}Rd,Rn,
Rm{,}

位31-28

这四位是断言指令的条件代码。
如果指令中未指定条件代码后缀,则暗示
AL
(始终)。
AL
编码为1110

位27-25

数据处理指令的前两位始终为0。
如果将立即数用作第二个操作数,则最低位为1;如果使用寄存器,则最低位为0。
因为
r6
是第二个操作数,所以这三位都是零

位24-21
这是操作码0110,用于
sbc

位20
这对应于程序集语法的S后缀。
如果set指令设置标志,否则它们将保持不变

位19-16
这是第一个操作数寄存器Rn,它是r12,因此该字段的值为1100

位15-12
这是目标操作数寄存器Rd,它是
r0
,因此此字段必须使用0000

位11-0
该字段根据第25位(第I位)的值进行解释。
当I=0时,此字段为

位11-4
移位量。
由于汇编指令中未指定移位,因此这些位为0

位3-0
第二个操作数寄存器Rm,这是
r6
so 0110是正确的值


您需要记住每个指令使用的格式类型。
有很多结构、模式和一般类别(如“数据处理指令”)可以定义,但最终也有助于记忆(如操作码值、位字段等)。

将此作为参考,可以在第4.5节中找到数据处理指令的格式

点击图片放大

请记住,像
sbc
这样的指令的汇编语法是
{cond}{S}Rd,Rn,
Rm{,}

位31-28

这四位是断言指令的条件代码。
如果指令中未指定条件代码后缀,则暗示
AL
(始终)。
AL
编码为1110

位27-25

数据处理指令的前两位始终为0。
如果将立即数用作第二个操作数,则最低位为1;如果使用寄存器,则最低位为0。
因为
r6
是第二个操作数,所以这三位都是零

位24-21
这是操作码0110,用于
sbc

位20
这对应于程序集语法的S后缀。
如果set指令设置标志,否则它们将保持不变

位19-16
这是第一个操作数寄存器Rn,它是r12,因此该字段的值为1100

位15-12
这是目标操作数寄存器Rd,它是
r0
,因此此字段必须使用0000

位11-0
该字段根据第25位(第I位)的值进行解释。
当I=0时,此字段为

位11-4
移位量。
由于汇编指令中未指定移位,因此这些位为0

位3-0
第二个操作数寄存器Rm,这是
r6
so 0110是正确的值


您需要记住每个指令使用的格式类型。

有很多结构、模式,可以定义一般类别(如“数据处理指令”),但最终还需要助记功能(如操作码值、位字段等)

这是什么类型的处理器?应该是ARM7,将问题编辑为包含在第10页:)您是指ARMv7(该体系结构的最后32位版本)还是ARM7(非常旧的CPU)?我标记了ARMv7,虽然这可能并不重要,因为我猜所有的ARM CPU都有带进位的子处理器。这是什么类型的处理器?应该是ARM7,编辑了这个问题,让它包括进来看看这篇文章的第10页:)你是指ARMv7(架构的最后32位版本)还是ARM7(非常旧的CPU)?我标记了ARMv7,虽然这可能并不重要,因为我猜所有ARM CPU都有带进位的sub。