0

私はこのリトルマンコンピュータの問題を見ています:

  1. ユーザーは最初にデータのサイズを入力し、次に個々の数値を入力します。

  2. 入力されたものを( OUT) 正確に出力し、その後にデータ値の最大値と最小値を出力する必要があります

例:

  • 最初の入力: 2 // DATA の数
  • 2 番目の入力: 5 // 最初の DATA
  • 3 番目の入力: 7 // 2 番目の DATA
  • 出力: 2、5、7、5(最小)、7(最大)

最後にすべてを印刷する必要があります(ユーザーがすべての入力を入力し終わったとき)

私の試み:

        IN         # Acc = number of values to read (N)
        STO M
LOOP    BRZ PRG     
        SUB ONE
        STO N      # N=N-1
        IN         # values                                                      
ST      STO PRG    # Store it in the program starting at PRG 
        LDA ST     # Get current store command (ST)
        ADD ONE    # add one to store command to increment memory location
        STO ST     # Update store command (ST)
        LDA N      # Put current value of N in accumulator
        BRZ PRINT
        BRP LOOP    # Continue loop - 12

#My problem is here 
PRINT   LDA M
        OUT
        LDA PRG    
        OUT
    
FIN     HLT

M       DAT 0
N       DAT 0      # Number of values to read
ONE     DAT 1      # Value 1
PRG     DAT 0      # We will store all of the values from this point onward

質問

これを解決しようとしましたが、ご覧のとおり、最初の値しか出力できませんでした。入力もメモリに保存しましたが、アドレスをループして出力用の値を取得するにはどうすればよいですか?

4

1 に答える 1

0

入力を格納するために使用した自己変更コード パターンは、出力にも使用できます。STO PRG動的命令を変更する代わりに、動的命令を作成しますLDA PRG

あなたの試みは、最小値と最大値を決定するためのコードを示していません。この情報は、入力ループ中または出力ループ中に収集できます。

次の追加の注意事項を考慮してください。

  • 変数 (定数ではない) をコードで初期化して、LMC が (完全な再アセンブリなしで) リセットされた場合でも正しく動作するようにします。
  • よりわかりやすいラベルと変数名を使用してください。STかなりあいまいなPRG名前です...

したがって、以下のように機能する可能性があります。このコードは、Wikipediaで説明されている LMC ニーモニックを使用しています。したがって、STA = STO および INP = IN です。ここでプログラムを実行できます:

#input: 5 3 9 6 2 4
           INP # data size
           BRZ halt # nothing to do
; initialise (so program still runs correctly when reset)
           STA size
           LDA halt # =zero
           STA max
           LDA big
           STA min
           LDA staArray
           STA store
           LDA ldaArray
           STA load

; input loop
           LDA size
           SUB one
nextInput  STA counter
           INP # get data value
store      STA array # self-modified
           STA value
           SUB min
           BRP checkmax
           LDA value
           STA min
checkmax   LDA max
           SUB value
           BRP incInput
           LDA value
           STA max
incInput   LDA store
           ADD one
           STA store # modify code
           LDA counter
           SUB one
           BRP nextInput

           LDA size
           OUT # output input size
           SUB one
outputLoop STA counter
load       LDA array # self-modified
           OUT # output data value
           LDA load
           ADD one
           STA load # modify code
           LDA counter
           SUB one
           BRP outputLoop

           LDA min
           OUT
           LDA max
           OUT

halt       HLT

# constants
one        DAT 1
big        DAT 999
staArray   STA array
ldaArray   LDA array

# variables
size       DAT
counter    DAT
min        DAT
max        DAT
value      DAT
array      DAT

<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.812/lmc.js"></script>

述べる:

すべての入力が終了した後にのみ出力が生成されるという要件がない場合は、自己変更コードは必要ありません。入力の処理中に出力が生成されるこの回答を参照してください。

于 2020-11-25T17:58:09.137 に答える