为什么我的程序正常运行需要这几行汇编代码?

Why are these few lines of assembly code necessary for my program to function properly?

我在 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

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

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

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

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

为了通过运行宁你的程序证明这一点,试试这个序列:

  • Assemble你的程序没有这两行进入内存
  • 运行 它以数字 10 结尾
  • 按下重置键
  • 运行它与你选择的小数你知道的平方
  • 结果应该比预期的大 100
  • Assemble又是你的程序
  • 运行 以数字 5 结尾
  • 按下重置键
  • 运行它与你选择的小数你知道的平方
  • 结果应该比预期的大 25