汇编黑客到二进制机器语言

Assembly Hack to Binary Machine Language

如何将 Assembly Hack 转换为二进制机器语言?

例如,下面的 hack 程序集,我将如何手动将其翻译成机器码(二进制)。我只需要知道一个参考或在哪里可以学习如何手动翻译它。

计算 R0 = 2 + 3

@2
D=A
@3
D=D+A
@0
M=D

汇编语言的行形式只有几种,这里是其中的一些:

  1. A类指令
  2. C类指令
  3. 标签
  4. 评论&空白行

正如您想象的那样,标签和注释 (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 类指令有三个感兴趣的字段:compdestjump.

comp代表要计算什么,是一个6位字段

dest代表计算结果存放在哪里,是一个3位字段

jump代表什么条件改变机器码程序的控制流,是一个3位字段

C 类指令通常写成 X = Y,其中 X 就是 = 左边的任何内容,Y 是类似地,= 右侧的任何内容。 X对应destY对应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类指令,compX = Y中的Y)必须简单地计算A,所以该指令table 字段是 0110000dest (X) 必须以 D 为目标,因此这是 dest table 值 010.

因此,我们有一个 C 型指令 (1),comp0110000,dest 为 010jump000。 (请注意,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