我正在阅读和研究计算系统的元素,但我被困在某一点上。示例章节跳过接下来的 5 条指令可以在这里找到。
无论如何,我正在尝试实现一个虚拟机(或一个字节码到汇编翻译器),但我被困在跳过接下来的 5 条指令。
您可以在此处找到汇编符号。
目标是实现一个翻译器,将特定的字节码翻译成这个汇编代码。
我成功完成的一个例子是字节码
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)返回布尔值。VM 将真假分别表示为 -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 码?)