首先对您提供的代码进行一些评论:
- 该代码不会在您链接到的模拟器上解析。这是因为您将助记符(3 个字母代码)与指令代码(3 位数字)结合在一起。你应该只使用助记符。例如, write
INP
, not INP 901
。
- 使用标签。因此,例如,不要写
STA 318
,前一点确实应该是STA 18
,而是写STA num1
,并在相应的DAT
行定义该标签:num1 DAT
。请注意,您链接到的模拟器甚至不接受DAT
无标签。
- 在评论的开头使用分隔符(如
#
或)。;
虽然有些模拟器不会介意你只写评论而没有这样的分隔符,但使用它是更好的做法。此外,您链接到的模拟器似乎不支持评论。
- 当您发表评论时,请做出超出指令描述的评论。例如,
Stop program
作为评论放在 . 旁边是没有用的HLT
。这应该是显而易见的。相反,请发表评论来解释算法中指令的更高目的。例如“num3 是否大于 num2?” 一开始会是很好的评论BRP
。
因此,将上述更改应用于您的代码,您将得到:
#input: 3 2 1
INP
STA num1
INP
STA num2
INP
STA num3
comp23 LDA num3 # is num2 <= num3?
SUB num2
BRP sorted23 # yes
LDA num2 # no: copy it to num3
STA num3
sorted23 LDA num3 # is num1 <= num3?
SUB num1
BRP output # yes: we're done
LDA num1 # no: copy it to num3
STA num3
output LDA num3 # output the greatest
OUT
HLT
num1 DAT
num2 DAT
num3 DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.815/lmc.js"></script>
这将打印输入中的最大值。现在要对输入进行排序,您需要交换成对的值。对于交换,您可以使用第四个变量 ( temp
)。例如,要与 交换num2
,num3
您可以编写:
LDA num3
STA temp # temporary save num3 here
LDA num2
STA num3 # now both are the same value
LDA temp # but we still have a copy...
STA num2
您可以对最多三个交换的 3 个数字进行排序。如果涉及第三次交换,它将与第一次交换相同。
这是如何工作的:
#input:3 2 1
INP
STA num1
INP
STA num2
INP
STA num3
comp23 LDA num3 # is num2 <= num3?
SUB num2
BRP sorted23 # yes
LDA num3 # no: swap num2 and num3
STA temp
LDA num2
STA num3
LDA temp
STA num2
sorted23 LDA num2 # is num1 <= num2
SUB num1
BRP sorted123 # yes: we're done
LDA num2 # no: swap num1 and num2
STA temp
LDA num1
STA num2
LDA temp
STA num1
BRA comp23 # repeat once
sorted123 LDA num1 # output the sorted list
OUT
LDA num2
OUT
LDA num3
OUT
HLT
num1 DAT
num2 DAT
num3 DAT
temp DAT # used for swapping
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.815/lmc.js"></script>
在我看来,您所指的模拟器并不是最好的。我在这个答案中使用的可以在这里找到——我是它的作者。