首页 > 解决方案 > 如何打印值列表 + 最大值/最小值

问题描述

我在看这个小人电脑问题:

  1. 用户将首先输入数据的大小,然后输入单个数字。

  2. 我必须打印 ( OUT) excatcly 输入的内容,然后是数据值的最大值和最小值

例子:

我必须在最后打印所有内容(当用户完成输入所有输入时)

我的尝试:

        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

问题

我试图解决这个问题,但如您所见,我只成功打印了第一个值。我还将输入保存在内存中,但是如何循环地址以获取输出值?

标签: assemblylittle-man-computer

解决方案


您用于存储输入的自修改代码模式也可用于输出它。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>

评论:

如果不要求仅在所有输入完成后才产生输出,则不需要自修改代码。请参阅此答案,其中在处理输入时生成输出。


推荐阅读