Mult.asm 比较失败

Posted

技术标签:

【中文标题】Mult.asm 比较失败【英文标题】:Mult.asm Comparison Failure 【发布时间】:2019-03-25 07:11:16 【问题描述】:

我需要回答的问题是,为什么在第 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】:

如果没记错的话,该错误消息的意思是您没有通过 Mult.cmp 的第 9 行中的测试。

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

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

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

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

祝你好运!

【讨论】:

谢谢。我该如何修复它以支持负数的乘法? @DavidShatzkamer,任何人都不适合为您编写代码。 Nand2Tetris 的全部意义在于让你学习东西。您可能想问班上的其他学生,或者自己研究“有符号乘法”。

以上是关于Mult.asm 比较失败的主要内容,如果未能解决你的问题,请参考以下文章

比较 unicode 字符时,Javascript 字符串比较失败

逐元素比较失败;返回标量,但将来将执行元素比较

比较总是以 char 和常量失败

NSDecimalNumber 比较失败

不使用 numpy:FutureWarning:元素比较失败;而是返回标量,但将来将执行元素比较[关闭]

numpy:FutureWarning:元素比较失败