-3

我需要为以下任务创建一个简单的 LMC 程序:

输入一系列数字并输出:

  1. 其中最大的,并且
  2. 输入了多少个数字。

数字 000 将用于标记输入数字系列的结束(000 不被视为系列的一部分,但如果它是唯一输入的数字,则应输出)。
您的程序必须适用于任意数量的输入值。

我想我需要使用分支(BRZ, BRP, BR),但我不确定我应该使用哪种类型。另外,我尝试过使用在线 LMC 模拟器,但我不确定从哪里开始,因为 LMC 非常混乱。

我该如何解决这个问题?

4

1 回答 1

1

对由 OP 更新的问题给出的答案:

该问题已被编辑为关于分支。分支是学习汇编语言的核心。我们可以谈论那个。

数据段的片段:

counter   DAT 0
max       DAT 0
current   DAT 0

检查当前是否为列表末尾的代码:

         LDA current
         BRZ end
         ;... more code here

简单的。我们检查当前是否为零,如果是则结束循环。如果当前值为零,则 BRZ 分支。

检查当前是否是新的最大值

         LDA current
         SUB max
         BRP positive
         BRA next
positive LDA current
         STA max
         BRA next     ;next is almost certainly back at top
end      HLT          ;the zero check ends up here
                      ;you probably need to insert OUT instructions

这是一个不同的分支。如果 current 中的值不为零且未设置负标志,则 BRP 分支。新概念标志。LMC 有一个标志,负标志。如果先前的操作下溢/溢出,则设置它。如果发生这样的事件,我们希望将值设置为新的最大值。否则,我们继续下一个值。

对问题的原始回答:

抱歉,我可能看错了。我把它解释为给定一个以零结尾的内存数组,找到大小和最大的。这个问题很难,我理解为什么 OP 无法发布尝试。这与间接有关。在 LMC 中进行间接寻址的唯一方法是自修改代码。

首先,我们在 LOAD/STORE 指令中只有两位间接数,总内存大小只有 100 字节,我们需要让我们的程序比这小得多。

从数据段开始(必须在最后):

one      DAT 1
ldazero  LDA 0
largest  DAT 0
count    DAT 0
first    DAT ?

遍历列表以获取计数。

ctr       LDA first
          BRZ  endcount
          LDA ctr
          ADD  one
          STO  ctr
          JMP  ctr
endcount  LDA  ctr
          SUB  ldazero
          STO  count
          HLT

给定间接的方法,应该可以写下如何做max。为了避免两个计数器,将正在比较的值复制到工作槽中。

于 2021-11-07T02:29:10.897 回答