汇编黑客到二进制机器语言
Assembly Hack to Binary Machine Language
如何将 Assembly 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位的第一位(top bit,MSB,most significant bit)为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)
最高位为0表示A型。对于该指令的其余部分 (@2),低 15 位编码值“2”。
C 类指令也是 16 位宽,以 MSB 的值为 1 开头,这与 A 类指令(因为它们以 0 开头)不同。 C 类指令有三个感兴趣的字段:comp
、dest
、jump
.
comp
代表要计算什么,是一个6位字段
dest
代表计算结果存放在哪里,是一个3位字段
jump
代表什么条件改变机器码程序的控制流,是一个3位字段
C 类指令通常写成 X = Y
,其中 X
就是 =
左边的任何内容,Y
是类似地,=
右侧的任何内容。 X
对应dest
,Y
对应comp
.
有关 C 类型指令和这些字段的图片,请参阅 this,转载于此:
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).
为了查找这些字段的值,您可以使用 tables 来查找它们。表格可以在上面 link 引用的视频中找到,也可以在 https://zhongchuyun.gitbooks.io/nand2tetris/content/chapter_4.html
中找到
例如,如果 C 类指令旨在使用正常的流控制,则使用 jump
字段编码 000
。
(正常的控制流是指指令在内存中出现在顺序递增的内存地址时,按顺序一个接一个地执行。这种情况很常见,因为它通常需要多条指令,一条接一条另一个,做任何重要的事情。然而,有时我们需要让机器在机器码程序中向前跳转(做if-then/else),而其他时候我们需要让机器在机器码程序中向后跳转(做循环)。
在D=A
中,一条C类指令,comp
(X = Y
中的Y
)必须简单地计算A
,所以该指令table 字段是 0110000
。 dest
(X
) 必须以 D
为目标,因此这是 dest
table 值 010
.
因此,我们有一个 C 型指令 (1
),comp
为 0110000
,dest 为 010
,jump
共 000
。 (请注意,C 类指令有两个被忽略的位,如下所示为 ZZ。这些 Z 可以是 0 或 1,随你喜欢,因为这无关紧要。有些作者似乎选择 1。)
一起显示:
A/C ZZ comp dest jump
1 11 0110000 010 000
-或- 11101100000100002 = EC1016 = 60,43210
来源:http://dragonwins.com/domains/getteched/csm/CSCI410/references/hack.htm
如何将 Assembly 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位的第一位(top bit,MSB,most significant bit)为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)
最高位为0表示A型。对于该指令的其余部分 (@2),低 15 位编码值“2”。
C 类指令也是 16 位宽,以 MSB 的值为 1 开头,这与 A 类指令(因为它们以 0 开头)不同。 C 类指令有三个感兴趣的字段:comp
、dest
、jump
.
comp
代表要计算什么,是一个6位字段
dest
代表计算结果存放在哪里,是一个3位字段
jump
代表什么条件改变机器码程序的控制流,是一个3位字段
C 类指令通常写成 X = Y
,其中 X
就是 =
左边的任何内容,Y
是类似地,=
右侧的任何内容。 X
对应dest
,Y
对应comp
.
有关 C 类型指令和这些字段的图片,请参阅 this,转载于此:
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).
为了查找这些字段的值,您可以使用 tables 来查找它们。表格可以在上面 link 引用的视频中找到,也可以在 https://zhongchuyun.gitbooks.io/nand2tetris/content/chapter_4.html
中找到例如,如果 C 类指令旨在使用正常的流控制,则使用 jump
字段编码 000
。
(正常的控制流是指指令在内存中出现在顺序递增的内存地址时,按顺序一个接一个地执行。这种情况很常见,因为它通常需要多条指令,一条接一条另一个,做任何重要的事情。然而,有时我们需要让机器在机器码程序中向前跳转(做if-then/else),而其他时候我们需要让机器在机器码程序中向后跳转(做循环)。
在D=A
中,一条C类指令,comp
(X = Y
中的Y
)必须简单地计算A
,所以该指令table 字段是 0110000
。 dest
(X
) 必须以 D
为目标,因此这是 dest
table 值 010
.
因此,我们有一个 C 型指令 (1
),comp
为 0110000
,dest 为 010
,jump
共 000
。 (请注意,C 类指令有两个被忽略的位,如下所示为 ZZ。这些 Z 可以是 0 或 1,随你喜欢,因为这无关紧要。有些作者似乎选择 1。)
一起显示:
A/C ZZ comp dest jump
1 11 0110000 010 000
-或- 11101100000100002 = EC1016 = 60,43210
来源:http://dragonwins.com/domains/getteched/csm/CSCI410/references/hack.htm