输出一个序列
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]
所以简单来说,
- 输入一个数字
- 如果小于零则中止(分支到结束)
- 如果为零则中止(分支到结束)
- 如果大于 14 则中止(分支到结束)
- 加 2
- 打印
- 分支到 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>
对于 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]
所以简单来说,
- 输入一个数字
- 如果小于零则中止(分支到结束)
- 如果为零则中止(分支到结束)
- 如果大于 14 则中止(分支到结束)
- 加 2
- 打印
- 分支到 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>