我想知道如何计算计算机系统中给定虚拟机命令的跳转指令

问题描述

@H_404_0@我正在学习Hack汇编语言和跳转说明。谁能给我详尽的解释,说明如何计算给定虚拟机代码跳转指令。我想了解如果拥有虚拟机命令(例如,将常量0推送)的情况下如何找到跳转指令。

@H_404_0@请给我详细的解释,以便我学习!

@H_404_0@示例:虚拟机命令为'push constant 0'。

@H_404_0@如何从该命令转到以下书面跳跃说明:

@SP

A = M

M = 0

@SP

M=M+1
@H_404_0@上面的跳转指令只是一个例子,而不是答案。

解决方法

跳转使用C型指令编码。

C型指令具有以下编码:

size (in bits):     1    2     7      3      3
                 +-----+----+------+------+------+
field            | A/C | XX | comp | dest | jump |
                 +-----+----+------+------+------+

要区分A型和C型,对于A型,A/C0,对于C型,A/C1

如果C型指令的jump字段具有二进制值000,则不会编码任何跳转。

否则,jump字段中的任何其他二进制值都会编码某种分支。如果分支的条件为真,它将把控制权转移到A寄存器中的值(有效地执行pc := A),因此通常,分支指令之前是@指令用标签的地址加载A寄存器,但是其他方法也是可行的。如果分支条件为假,它将简单地前进到下一个顺序指令(pc := pc + 1而不是pc := A


有关C型指令编码的表,请参见以下演示文稿:https://www.coursera.org/lecture/nand2tetris2/unit-0-4-hack-language-specification-MXyAQ,在时间7:57。