0

我在 LMC 上创建了一个对输入求平方的简单程序。

        INP
        STA X
        LDA X
        STA Y
LOOP    LDA Y
        BRZ END
        LDA ANSWER
        ADD X
        STA ANSWER
        LDA Y
        SUB ONE
        STA Y
        BRA LOOP
END     LDA ANSWER
        OUT
        SUB ANSWER - This line
        STA ANSWER - And this one
        HLT
ONE     DAT 1
ANSWER  DAT 0
X       DAT 
Y       DAT 

经过一些测试,我注意到没有上面和下面指示的两行:

        SUB ANSWER - This line
        STA ANSWER - And this one

...该程序似乎没有输出正确的结果。更具体地说,多次运行模拟器后产生的结果非常自然。

出于好奇,我问这个问题,因为我似乎不明白我在上面添加的使程序运行的行的要点/推理。我让它工作纯粹是出于运气。

4

1 回答 1

1

这是因为当通过按下重置按钮为另一次运行提供另一个输入来重置机器时,之前计算的答案仍然在 RAM 中。重置按钮不会清除内存,也不会在编译后将其重置为状态,因此下一次运行只是在内存中运行,因为它是上一次运行留下的。

您记下的代码对执行本身没有任何作用,除了在算法的下一次迭代之前将内存中 ANSWER 的内容归零。它通过从累加器中减去 ANSWER 的值(此时包含 ANSWER,给出零)并将累加器存储到地址 ANSWER 中,有效地在那里写入零。

要通过运行您的程序来证明这一点,请尝试以下序列:

  • 将没有这两行的程序组装到内存中
  • 以数字 10 运行它到最后
  • 按复位
  • 用你知道平方的少数选择运行它
  • 结果应该比预期的大 100
  • 再次组装你的程序
  • 以数字 5 运行到最后
  • 按复位
  • 用你知道平方的少数选择运行它
  • 结果应该比预期的大 25
于 2016-10-29T17:42:35.367 回答