【问题标题】:How to print a list of values + max/min如何打印值列表 + 最大值/最小值
【发布时间】:2020-11-26 02:05:10
【问题描述】:

我正在研究这个小人电脑问题:

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

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

示例:

  • 第一个输入:2 //数据的数量
  • 第二个输入:5 // 第一个数据
  • 第三个输入:7 // 第二个数据
  • 输出: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

问题

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

【问题讨论】:

  • 如果您不知道用户将输入多少个输入,您怎么知道何时结束并且您必须打印“所有内容”?基本上有两种方法可以做到这一点:或者用户应该首先输入将跟随多少输入(所以你确实知道),或者用户必须输入一个特殊的、商定的值来标记结束输入(如零)。你还没有澄清这一点。其次,你写下你的尝试。请编辑您的问题并添加您尝试使用的代码。
  • 是的,对不起,用户必须首先输入输入的数量,这个数字是第一个被打印的。
  • 哦,输入也应该在输出中?最小值/最大值应该在哪里输出?完全回显输入大小和输入数据之后?你能举一个输入和输出的具体例子吗?
  • 没错,示例:第一个输入:2 // 数据数量第二个输入:5 // 第一个数据第三个输入:7 // 第二个数据------- 输出:2,5, 7,5(最小),7(最大)

标签: assembly little-man-computer


【解决方案1】:

用于存储输入的自修改代码模式也可用于输出它。无需修改动态STO PRG 指令,您将拥有动态LDA PRG 指令。

您的尝试没有显示用于确定最小值和最大值的代码。您可以在输入循环期间或在输出循环期间收集此信息。

请考虑这些附加说明:

  • 用代码初始化变量(不是常量),这样如果 LMC 被重置(没有完全重新组装),它仍然可以正常工作。
  • 使用更具描述性的标签和变量名。 STPRG 是相当不起眼的名字...

所以它可以像下面这样工作。此代码使用 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>

备注:

如果不要求仅在所有输入完成后生成输出,则不需要自修改代码。请参阅this answer,其中在处理输入的同时生成输出。

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 2020-09-19
    • 2018-09-05
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2017-10-10
    • 2021-07-09
    相关资源
    最近更新 更多