【发布时间】:2015-05-10 17:51:06
【问题描述】:
我正在阅读和学习The Elements of Computing Systems,但我被困在某一点上。示例章节跳过接下来的 5 条指令可以找到here。
无论如何,我正在尝试实现一个虚拟机(或一个字节码到汇编翻译器),但我被困在跳过接下来的 5 条指令。
您可以找到汇编符号here。
我们的目标是实现一个翻译器,将特定的字节码翻译成这个汇编代码。
我成功完成的一个例子是字节码
push constant 5
翻译成:
@5
D=A
@256
M=D
正如我所说,Hack 的汇编语言可以在我提供的链接中找到,但基本上是:
@5 // Load constant 5 to Register A
D=A // Assign the value in Reg A to Reg D
@256// Load constant 256 to Register A
M=D // Store the value found in Register D to Memory Location[A]
嗯,这很简单。根据定义,存储器位置 256 是堆栈的顶部。所以
push constant 5
push constant 98
将被翻译成:
@5
D=A
@256
M=D
@98
D=A
@257
M=D
没关系..
我还想再举一个例子:
push constant 5
push constant 98
add
翻译成:
@5
D=A
@256
M=D
@98
D=A
@257
M=D
@257 // Here starts the translation for 'add' // Load top of stack to A
D=M // D = M[A]
@256 // Load top of stack to A
A=M // A = M[A]
D=D+A
@256
M=D
我觉得很清楚。
但是我不知道如何翻译字节码
eq
到大会。 eq的定义如下:
三个命令(eq、gt、lt)返回布尔值。虚拟机 将真假表示为????-1(减一,0xFFFF)和0(零, 0x0000),分别。
所以我需要分别向寄存器 A 和 D 弹出两个值,这很容易。但是我应该如何创建一个汇编代码来检查值并在结果为真时压入 1,如果结果为假则压入 0?
Hack Computer 支持的汇编代码如下:
我可以这样做:
push constant 5
push constant 6
sub
如果压入堆栈的 2 个值相等,它将保存值 0,如果不相等,则保存 !0 但这有什么帮助?我尝试使用 D&A 或 D&M,但这也无济于事..
我也可以引入条件跳转,但我应该如何知道要跳转到哪条指令?哈克汇编代码没有“跳过接下来的 5 条指令”之类的东西。
[由 Spektre 编辑] 我看到的目标平台摘要
- 16 位冯诺依曼架构(地址为 15 位,16 位字访问)
- 数据存储器 32KW(读/写)
- 指令(程序)内存 32KW(只读)
- 原生 16 位寄存器 A,D
- 通用 16 位寄存器 R0-R15 映射到位于 0x0000 - 0x000F 的数据存储器
- 这些也很可能用于:
SP(R0),LCL(R1),ARG(R2),This(R3),That(R4) - 屏幕在 0x4000-0x5FFF(512x256 B/W 像素 8KW)处映射到数据内存
- 键盘在 0x6000 处映射到数据存储器(如果最后一次按键,则为 ASCII 码?)
【问题讨论】:
-
实际上你似乎有任意跳转,请查看 jmp 指令。您可以使用它来创建两个分支,其中一个将 1 加载到目标寄存器中,另一个将 0 加载到目标寄存器中
-
@NiklasB。谢谢您的答复。但是我怎么知道跳到哪里呢? JMP 指令将跳转到加载到寄存器 A 的步骤。我的意思是,如何创建会显示“跳转 4 条指令”或“跳转 8 条指令”的汇编代码?
-
1.字节码到汇编? ...汇编源代码是程序的文本表示(助记符),它被编译成字节...通常是代码二进制文件。 2. 比较指令在我接触到的所有架构上通过减法和设置标志
Z,C和一些还包括条件分支(主要是MCU)所以cmp a,b通常做a-b但扔掉结果离开只是旗帜。现在进入条件(不管是跳转还是其他指令)equal=(Z), greater=(NC),lower(C) -
...我怎么知道要跳转到什么指令? 将条件分支编码为符号标签。手册中有示例,我在答案中编写了这样的示例。 (如果你正在生成二进制代码,你知道分支指令在哪里;“跳过 5 条指令”的意思是“分支到分支的二进制位置,+5”。)
-
nand2Tetris 网站有一个问答部分。似乎这个问题需要一个非常具体的背景,所以这可能是一个很好的地方。我相信这就是你要找的东西:nand2tetris-questions-and-answers-forum.32033.n3.nabble.com/…
标签: algorithm assembly bytecode interpreter nand2tetris