繁体   English   中英

汇编到二进制机器语言

[英]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位的第一位(最高位,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 类型指令具有三个感兴趣的字段: compdestjump

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

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

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

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

对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 类型指令旨在使用正常流控制,则使用000 jump字段编码。

(正常的控制流是指指令按顺序依次执行,因为它们出现在内存中的内存地址按顺序增加。这是很常见的,因为通常需要多条指令,一个接一个地执行任何重要的操作。有时,但是,我们需要在机器码程序中让机器向前跳转(做if-then/else),而其他时候我们需要在机器码程序中让机器向后跳转(做循环)。

D=A ,C 类型指令, compY in X = Y )必须简单地计算A ,因此表中的指令字段为0110000 dest ( X ) 必须以D为目标,因此dest表值为010

因此,我们有一个 C 类型指令 ( 1 ), comp0110000 ,dest 为010jump000 (请注意,C 类型指令有两个被忽略的位,如下所示为 ZZ。这些 Z 可以是 0 或 1 — 随你喜欢,因为这无关紧要。有些作者似乎选择了 1。)

一起展示:

A/C ZZ  comp   dest jump
 1  11 0110000  010  000

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM