如何将汇编代码转换为二进制机器语言?
例如,下面的黑客汇编,我如何手动将其转换为机器码(二进制)。我只需要知道一个参考或在哪里我可以学习如何手动翻译这个。
计算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
。
查看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),而有时我们需要在机器码程序中使机器向后跳转(执行循环)。
在c型指令D=A
中,comp
(X = Y
中的Y
)必须简单地计算A
,因此指令字段在表中是0110000
。dest
(X
)必须以D
为目标,因此dest
表的值为010
。
1
),comp
为0110000
,010
为dest,jump
为000
。(请注意,c类型指令有两个被忽略的位,如下所示为ZZ。这些Z可以是0或1 -随你喜欢,因为这无关紧要。有些作者似乎选择了1。
所示:
A/C ZZ comp dest jump
1 11 0110000 010 000
——- 1110110000010000<子>2子> 16子>子>
来源:http://dragonwins.com/domains/getteched/csm/CSCI410/references/hack.htm