如何解决汇编到二进制机器语言
如何将汇编 Hack 转换为二进制机器语言?
例如,下面的hack程序集,我将如何手动将其转换为机器代码(二进制)。我只需要知道参考资料或在哪里可以学习如何手动翻译。
计算 R0 = 2 + 3
@2
D=A
@3
D=D+A
@0
M=D
解决方法
只有几种汇编语言行形式,以下是其中一些:
- A 类指令
- C 类指令
- 标签
- 注释和空行
正如您想象的那样,标签和注释 (3&4) 不会生成任何机器代码指令,虽然注释被忽略,但标签会通知 A 类型指令有关偏移量的信息——但是,您的样本两者都没有,因此不必担心
A 类和 C 类指令均为 16 位宽。
A 类指令很简单,占机器码的 16 位,其中 16 位的第一位(最高位,MSB,最高有效位)为 0,表示 A 类指令,其他 15-位是数值(例如在@2 中)或标签位置(例如在@loop 中)。
所以,@2 编码如下:
+-- A type indicator,top bit is zero for A-type
|
v
0000000000000010 <-- 16-bit machine code instruction
|-------------| range of immediate value field for A-type
(0000000000111111)
(0123456789012345) bit position (MSB at pos 0,LSB at 15)
A 型的最高位为 0。对于该指令的其余部分 (@2),低 15 位对值“2”进行编码。
C 类指令也是 16 位宽,并以值 1 的 MSB 开头,这将它们与 A 类指令区分开来(因为那些以 0 开头)。 C 类型指令具有三个感兴趣的字段:comp
、dest
、jump
。
comp
代表要计算的内容,是一个 6 位字段
dest
代表计算的存储位置,是一个 3 位字段
jump
代表改变机器代码程序控制流的条件,是一个 3 位字段
C 类指令通常写为 X = Y
,其中 X
只是 =
左侧的任何内容,Y
类似地是任何内容位于 =
的右侧。 X
对应于 dest
,Y
对应于 comp
。
请参阅 this 以获取 C 类型指令和这些字段的图片,转载于此处:
C 类指令具有以下编码:
size (in bits): 1 2 7 3 3
+-----+----+------+------+------+
field | A/C | ZZ | comp | dest | jump |
+-----+----+------+------+------+
在某些文本中,7 位 comp
字段进一步分解为 a
(1 位)和 c
(6 位):
size (in bits): 1 2 1 6 3 3
+-----+----+---+------+------+------+
field | A/C | ZZ | a | c | dest | jump |
+-----+----+---+------+------+------+
| comp |
7 bits
ZZ
位在 C 类型指令中未使用,因此它们可以是任何值,但常见文本倾向于使用 1(我不知道为什么,我会使用 0)。
为了找到这些字段的值,您可以使用表格来查找它们。表格可以在上述链接引用的视频中找到,也可以在 https://zhongchuyun.gitbooks.io/nand2tetris/content/chapter_4.html
例如,如果 C 类型指令旨在使用普通流控制,则使用 jump
的 000
字段编码。
(正常的控制流是指指令按顺序依次执行,因为它们出现在内存中的内存地址按顺序增加。这很常见,因为通常需要多条指令,一个接一个地执行然而,有时我们需要让机器在机器代码程序中向前跳转(执行 if-then/else),而其他时候我们需要让机器在机器代码程序中向后跳转(执行循环).
在D=A
中,C类型指令,comp
(Y
中的X = Y
)必须简单地计算A
,所以指令字段是0110000
由表。 dest
(X
) 必须以 D
为目标,因此 dest
表值为 010
。
因此,我们有一个 C 类型指令 (1
),其 comp
为 0110000
,dest 为 010
,以及 {{1} jump
的}。 (请注意,C 类型指令有两个被忽略的位,如下所示为 ZZ。这些 Z 可以是 0 或 1 — 随你喜欢,因为这无关紧要。有些作者似乎选择了 1。)
一起显示:
000
-或- 11101100000100002 = EC1016 = 60,43210
来源:http://dragonwins.com/domains/getteched/csm/CSCI410/references/hack.htm
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。