汇编破解二进制机器语言



如何将汇编代码转换为二进制机器语言?

例如,下面的黑客汇编,我如何手动将其转换为机器码(二进制)。我只需要知道一个参考或在哪里我可以学习如何手动翻译这个。

计算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型指令有三个感兴趣的域: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类型指令打算使用正常的流控制,那么使用000jump字段编码。

(正常的控制流是指令一个接一个地按顺序执行,因为它们出现在内存中,内存地址顺序递增。这是很常见的,因为它经常需要多个指令,一个接一个,做任何重要的事情。然而,有时我们需要在机器码程序中使机器向前跳转(执行if-then/else),而有时我们需要在机器码程序中使机器向后跳转(执行循环)。

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

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

最新更新