-2

我正在看这个作业:

编写一个程序,接受三个输入并按升序输出它们。

我使用了以下 LMC 模拟器:https ://www.101computing.net/LMC/#

这就是我到目前为止所做的:

INP 901 Input num1
STA 318 Store num1 in address 18
INP 901 Input num2
STA 319 Store num2 in address 19
INP 901 Input num3
STA 320 Store num3 in address 20
SUB 219 Subtract num2 from num3
BRP 810 Jump to address 10 if it is zero or positive (J1)
LDA 519 Load num2 from address 19
STA 320 Store num3 in address 20
LDA 520 Load num3 from address 20 (J1)
SUB 218 Subtract num1 from num3
BRP 815 Jump to address 18 if it is zero or positive (J2)
LDA 518 Load num1 from address 18
STA 320 Store num3 in address 20
LDA 520 Load num3 from address 20 (J2)
OUT 902 Output result
HLT 000 Stop program
DAT     Data num1
DAT     Data num2
DAT     Data num3

我只实现了找到最大的数字,但我不知道如何按升序排列它们。

我怎样才能以正确的顺序输出其他两个值?

4

1 回答 1

0

首先对您提供的代码进行一些评论:

  • 该代码不会在您链接到的模拟器上解析。这是因为您将助记符(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)。例如,要与 交换num2num3您可以编写:

   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>

在我看来,您所指的模拟器并不是最好的。我在这个答案中使用的可以在这里找到——我是它的作者。

于 2021-02-21T09:25:11.410 回答