问题描述
@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/C
是0
,对于C型,A/C
是1
。
如果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。