多重比较失败

时间:2019-03-25 07:11:17

标签: assembly nand2tetris

我需要回答的问题是,为什么在第9行而不是在第8行出现比较失败?我是Hack汇编语言的新手,仍然在学习基础知识,但是对于为什么CPU仿真器将通过第8行而不通过第9行感到困惑。

第二个问题:

如何解决此问题以支持负值的乘法?

程序将R0和R1相乘并将结果存储在R2中。 (R0,R1,R2分别代表RAM [0],RAM [1]和RAM [2]。)

Mult.asm:

0   @2
1   M=0
2   @0
3   D=M
4   @8
5   D;JNE
6   @19
7   0;JMP
8   @2
9   D=M
10  @1
11  D=D+M
12  @2
13  M=D
14  @0
15  D=M-1
16  M=D
17  @8
18  D;JGT
19  @19
20  0;JMP

Mult.cmp:

|  RAM[0]  |  RAM[1]  |  RAM[2]  |
|       0  |       0  |       0  |
|       1  |       0  |       0  |
|       0  |       2  |       0  |
|       3  |       1  |       3  |
|       2  |       4  |       8  |
|       6  |       7  |      42  |
|       6  |      -7  |     -42  |
|      -6  |       7  |     -42  |

1 个答案:

答案 0 :(得分:0)

如果有内存可用,则该错误消息表示您未通过Mult.cmp的第9行中的测试。

因此,假设Mult.tst中的测试脚本正确,那么问题是当第一个数字(R0)最初为负数时,您的程序将失败。

在第14-18行中,将R0递减,如果> 0,则跳回到第8行。这将立即失败,因为R0开始为负!

您需要在开始时添加一些额外的代码以检查这种情况并进行适当的调整。

还有一个风格建议。引用内存位置时,请使用符号表示法,即:@ R1而不是@ 1,尤其是使用(LABEL)表示法指定跳转目标。这将使您的代码更易于阅读和修改。

祝你好运!