LMC 程序将生成中位数和 3 个输入中最小值的两倍的总和

LMC program that will produce the sum of the median and twice the smallest of 3 inputs

所以我的任务是创建一个小型人机程序,它将接受 3 个不同的输入并产生中位数 + 2 * 最小数字的结果。

到目前为止,我已经设法生成了 3 个输入中数量最少的输出。我将如何找到中位数,然后将它添加到 2 * 最小的数字?

00  INP
01  STA 99  
02  INP 
03  STA 98
04  INP 
05  STA 97

06  LDA 99
07  SUB 98
08  BRP 12

09  LDA 99  
10  STA 98
11  BRP 14

12  LDA 98  
13  STA 99
14  LDA 99
15  SUB 97  
16  BRP 20

17  LDA 98
18  STA 97
19  BRP 22

20  LDA 97
21  STA 99
22  LDA 99
23  SUB 98
24  BRA 28

25  LDA 98
26  STA 99
27  BRA 30

28  LDA 99  
29  STA 98
30  OUT
31  HLT

您的代码正确输出了最小值,但是:

  • 它会破坏您仍然需要的其他输入值
  • 有些代码永远不会执行(第 25-27 行)
  • 第23行的减法结果未使用
  • 第29行的STA没用

我建议首先对三个输入值进行排序,然后很容易应用要求的“公式”。

此外:在您的程序中使用标签并使用 DAT 代码定义变量的地址。大多数 LMC 模拟器都支持标签,它使代码更具可读性。

这里是你如何做到的。我没有在代码中添加注释,因为您使用的模拟器不支持注释(遗憾!),但它是这样工作的:

  • 将输入命名为 abc(请参阅末尾的 DAT 行)
  • 比较 ab
  • 如果 a > b 则使用 temp 变量交换它们的值
  • continue 比较 bc
  • 如果b > c那么:
    • 忘记 b 中的内容并将 c 的值放在那里
    • 将该值(b 也是 c)与 a
    • 进行比较
    • 如果 b < a 则在 c 的帮助下交换 abb 的副本)
  • 最后进行计算a+a+b并输出

这是代码片段——单击 运行 代码片段 激活内联 LMC 模拟器并使用 input-box 和将出现的按钮控制它:

start    INP
         STA a
         INP
         STA b
         INP
         STA c

         LDA b
         SUB a
         BRP continue

         LDA b
         STA temp
         LDA a
         STA b
         LDA temp
         STA a

continue LDA c
         SUB b
         BRP output

         LDA c 
         STA b
         SUB a
         BRP output

         LDA a
         STA b
         LDA c
         STA a

output   LDA a
         ADD a
         ADD b
         OUT
         HLT

a        DAT
b        DAT
c        DAT
temp     DAT


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