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 

いくつかのテストの後、上下に示されている 2 つの行がないことに気付きました。

        SUB ANSWER - This line
        STA ANSWER - And this one

... プログラムが正しい結果を出力していないようです。より具体的には、生成される結果は、シミュレーターを複数回実行した後、非常に自発的です。

I ask this question out of curiosity since I don't seem to understand the point/reasoning of the lines I have added above to make the program work. I got it working purely out of luck.

4

1 に答える 1

1

これは、[リセット] ボタンを押してマシンをリセットし、別の実行に別の入力を提供するときに、以前の計算からの答えがまだ RAM にあるためです。[リセット] ボタンは、メモリをクリアしたり、コンパイル直後の状態にリセットしたりしないため、次の実行は、前の実行で残されたメモリをそのまま実行します。

あなたが指摘したコードは、アルゴリズムの次の反復の前にメモリ内の ANSWER の内容をゼロにする以外は、実行自体に対して何もしません。これは、アキュムレータ (現時点では ANSWER を含み、ゼロを与える) から ANSWER の値を減算し、アキュムレータをアドレス ANSWER に格納し、そこに実質的にゼロを書き込むことによって行います。

プログラムを実行してこれを実証するには、次のシーケンスを試してください。

  • これらの 2 行を使用せずにプログラムをメモリにアセンブルします。
  • 最後まで10番で実行してください
  • リセットを押します
  • 二乗を知っているあなたの選択した少数でそれを実行してください
  • 結果は予想よりも 100 大きくなるはずです
  • プログラムを再度組み立てます
  • 最後まで5番で実行してください
  • リセットを押します
  • 二乗を知っているあなたの選択した少数でそれを実行してください
  • 結果は予想よりも 25 大きくなるはずです
于 2016-10-29T17:42:35.367 に答える