我需要为以下任务创建一个简单的 LMC 程序:
输入一系列数字并输出:
- 其中最大的,并且
- 输入了多少个数字。
数字 000 将用于标记输入数字系列的结束(000 不被视为系列的一部分,但如果它是唯一输入的数字,则应输出)。
您的程序必须适用于任意数量的输入值。
我想我需要使用分支(BRZ
, BRP
, BR
),但我不确定我应该使用哪种类型。另外,我尝试过使用在线 LMC 模拟器,但我不确定从哪里开始,因为 LMC 非常混乱。
我该如何解决这个问题?
我需要为以下任务创建一个简单的 LMC 程序:
输入一系列数字并输出:
- 其中最大的,并且
- 输入了多少个数字。
数字 000 将用于标记输入数字系列的结束(000 不被视为系列的一部分,但如果它是唯一输入的数字,则应输出)。
您的程序必须适用于任意数量的输入值。
我想我需要使用分支(BRZ
, BRP
, BR
),但我不确定我应该使用哪种类型。另外,我尝试过使用在线 LMC 模拟器,但我不确定从哪里开始,因为 LMC 非常混乱。
我该如何解决这个问题?
对由 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。为了避免两个计数器,将正在比较的值复制到工作槽中。