输出一个序列

Output a sequence

对于 Little Man Computer (LMC) 模拟器,我有以下任务:

Your code must accept a number between 1 and 15. It must then add the number 2 (to the submitted number), before displaying the new total. This process must be repeated until the final total reaches either 14 or 15. At this point, the program must end. Note: your final code MUST NOT output any negative numbers.

因此它应该将输出显示为序列 2,4,6,8,10,12,14 或 3,5,7,9,11,13,15。

我面临的问题是,无论我输入 1 到 15 之间的任何数字,它都只是将该数字乘以自身并输出它。

到目前为止,这是我的代码:

INP
STA 11
ADD 11
OUT
ADD 11
OUT
ADD 11
OUT
HLT

2

我做错了什么?

[![LMC图片运行][2]][3]

所以简单来说,

  1. 输入一个数字
  2. 如果小于零则中止(分支到结束)
  3. 如果为零则中止(分支到结束)
  4. 如果大于 14 则中止(分支到结束)
  5. 加 2
  6. 打印
  7. 分支到 4

您的代码正在读取一个数字,然后将其与自身相加三次,每次之后打印(如果操作正确,也应该使用循环)。

因为这是一项作业,所以我将留给您解决如何在实际的 LMC 代码中编写它。定义像 2 这样的常量的操作码是 DAT,使用这个原始指令集,比较两个数字的方法就是将它们相减。然后使用“如果为零或正则分支”操作码来决定是否循环返回。

对您所写内容的一些评论:

So it should display the output as sequence 2,4,6,8,10,12,14 or 3,5,7,9,11,13,15.

该指令无法获得以 2 开头的输出,因为最小输入值据说是 1,程序应在第一个输出前加 2。所以这意味着输出的第一个值将至少为 3。

由于输入可以是更大的值(最多 15),输出序列可能比您指定的更短。例如,如果输入是 10,则输出应该只是 12、14。

这也意味着如果用户输入 14 或 15,程序根本不会产生任何输出。

The problem I am facing is that whatever number I input between 1 and 15 it is just multiplying the number by itself and outputting it.

你的代码中带有2的行没有做任何事情,因为在LMC语言中,常量值需要伴随一个DAT助记符:

DAT 2

如果您这样做了,值 2 将存储在邮箱 10 中。但即便如此,您也永远不会在代码中访问该邮箱,因此在执行期间的任何阶段都不会添加 2。

相反,您将输入存储在邮箱 11(可以),然后将邮箱 11 添加到该邮箱,这确实会导致该数字的两倍。然后再重复 2 次,这样你就可以输出 3 倍和 4 倍的数字。

您应该使用标签而不是对邮箱的数字引用(就像您对 11 所做的那样)。所以你应该有这样的东西:

two DAT 2
sum DAT

然后按如下方式使用这些标签:

    INP
    STA sum ; instead of 11
    ADD two ; this will add 2

Can someone help me with what I am doing wrong?

除上述几点外,您的尝试缺少条件循环。它应该在某个地方验证累加的总和没有达到限制(14 或 15),如果是这样——并且只有那时——它应该继续向总和添加另一个 2 并输出它。

您可以通过执行减法来有条件地重复代码,并使用 BRP 检查结果是否为负。因此,根据减法结果,您可以让代码在循环中继续执行,或者让它退出该循环。如果循环,最终它会再次到达这个点,在那里它会重复减法和检查。在某些时候,减法结果会有不同的符号,BRP 会有不同的反应。这样你就可以摆脱困境。

解决方案

这是一个实现,您可以在此处 运行(运行 到 assemble LMC 代码的片段,然后单击新显示的 运行 按钮实际运行 assembled 代码)。

#input: 1
     INP
     STA sum
loop SUB n14  ; compare sum with 14
     BRP end  ; stop when sum is equal or greater...
     LDA sum
     ADD two
     STA sum
     OUT
     BRA loop ; repeat
end  HLT
two  DAT 2
n14  DAT 14
sum  DAT

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