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

cod*_*er3 1 assembly machine-code nand2tetris

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

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

计算 R0 = 2 + 3

@2
D=A
@3
D=D+A
@0
M=D
Run Code Online (Sandbox Code Playgroud)

Eri*_*idt 5

汇编语言行形式只有几种类型,以下是其中一些:

\n
    \n
  1. A型指令
  2. \n
  3. C型指令
  4. \n
  5. 标签
  6. \n
  7. 注释和空行
  8. \n
\n

正如您可能想象的那样,标签和注释(3&4)不会生成任何机器代码指令,虽然注释被忽略,但标签会通知有关偏移量 \xe2\x80\x94 的 A 类型指令,但是,您的示例两者都没有,所以不会关心他们。

\n

A 和 C 类型指令均为 16 位宽。

\n

A型指令非常简单,占用16位机器码,其中16位的第一位(最高位,MSB,最高位)为0,表示A型指令,其余15位为数值(例如在@2 中)或标签位置(例如在@loop 中)。

\n

所以,@2编码如下:

\n
 +-- A type indicator, top bit is zero for A-type\n |\n v\n 0000000000000010   <-- 16-bit machine code instruction\n  |-------------|   range of immediate value field for A-type\n(0000000000111111)  \n(0123456789012345)  bit position (MSB at pos 0, LSB at 15)\n
Run Code Online (Sandbox Code Playgroud)\n

对于 A 类型,最高位为 0。\xc2\xa0 对于该指令的其余部分 (@2),较低 15 位编码值“2”。

\n

C 类型指令也是 16 位宽,并且以值 1 的 MSB 开头,这将它们与 A 类型指令区分开来(因为 A 类型指令以 0 开头)。\xc2\xa0 C 类型指令具有三个感兴趣的字段:comp, dest, jump.

\n

comp代表要计算的内容,是一个6位字段

\n

dest代表存储计算的位置,是一个 3 位字段

\n

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

\n

C 类型指令通常写为X = Y,其中X就是 左侧的任何内容=,而Y类似地是 右侧的任何内容=。\xc2\xa0 TheX对应于destY对应于comp

\n

有关 C 类型指令和这些字段的图片,请参阅此处,复制如下:

\n

C 类型指令具有以下编码:

\n
size (in bits):     1    2     7      3      3\n                 +-----+----+------+------+------+\nfield            | A/C | ZZ | comp | dest | jump |\n                 +-----+----+------+------+------+\n
Run Code Online (Sandbox Code Playgroud)\n

在某些文本中,7 位comp字段进一步细分为a(1 位)和c(6 位):

\n
size (in bits):     1    2    1    6       3      3\n                 +-----+----+---+------+------+------+\nfield            | A/C | ZZ | a |   c  | dest | jump |\n                 +-----+----+---+------+------+------+\n                            |   comp   |\n                                 7 bits\n
Run Code Online (Sandbox Code Playgroud)\n

这些ZZ位在 C 类型指令中未使用,因此它们可以是任何值,但常见文本倾向于使用 1(我不知道为什么,我会使用 0)。

\n

为了找到这些字段的值,您可以使用表格来查找它们。 \xc2\xa0 表格可以在上面链接引用的视频中找到,也可以在https://zhongchuyun.gitbooks.io/nand2tetris/中找到内容/chapter_4.html

\n

例如,如果 C 类型指令打算使用正常流控制,则使用jump的字段编码000

\n

(正常的控制流是指指令按照顺序依次执行,因为它们出现在内存中连续递增的内存地址中。\xc2\xa0 这很常见,因为它经常需要多个指令一个接一个地执行任何重要的操作.\xc2\xa0 然而,有时我们需要在机器代码程序中让机器向前跳转(做 if-then/else),而另一些时候我们需要让机器在机器代码程序中向后跳转(做进行循环)。

\n

D=AC 类型指令中,comp( Yin X = Y) 必须进行简单计算A,因此指令字段0110000由表组成。\xc2\xa0 dest( X) 必须以 为目标D,因此这是dest的表值010

\n

因此,我们有一个 C 类型指令 ( 1),其 acomp0110000,dest 为010,ajump000.\xc2\xa0 (请注意,C 类型指令有两个被忽略的位,如下所示 ZZ.\xc2\ xa0 这些 Z 可以是 0 或 1 \xe2\x80\x94,因为这并不重要。\xc2\xa0 有些作者似乎选择 1\'s。)

\n

一起显示:

\n
A/C ZZ  comp   dest jump\n 1  11 0110000  010  000\n
Run Code Online (Sandbox Code Playgroud)\n

-或- 1110110000010000 2 = EC10 16 = 60,432 10

\n
\n

资料来源:http ://dragonwins.com/domains/getteched/csm/CSCI410/references/hack.htm

\n