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 模拟器都支持标签,它使代码更具可读性。
这里是你如何做到的。我没有在代码中添加注释,因为您使用的模拟器不支持注释(遗憾!),但它是这样工作的:
- 将输入命名为
a
、b
和 c
(请参阅末尾的 DAT
行)
- 比较
a
与 b
- 如果
a > b
则使用 temp
变量交换它们的值
- 在
continue
比较 b
与 c
- 如果
b > c
那么:
- 忘记
b
中的内容并将 c
的值放在那里
- 将该值(
b
也是 c
)与 a
进行比较
- 如果
b < a
则在 c
的帮助下交换 a
和 b
(b
的副本)
- 最后进行计算
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>
所以我的任务是创建一个小型人机程序,它将接受 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 模拟器都支持标签,它使代码更具可读性。
这里是你如何做到的。我没有在代码中添加注释,因为您使用的模拟器不支持注释(遗憾!),但它是这样工作的:
- 将输入命名为
a
、b
和c
(请参阅末尾的DAT
行) - 比较
a
与b
- 如果
a > b
则使用temp
变量交换它们的值 - 在
continue
比较b
与c
- 如果
b > c
那么:- 忘记
b
中的内容并将c
的值放在那里 - 将该值(
b
也是c
)与a
进行比较
- 如果
b < a
则在c
的帮助下交换a
和b
(b
的副本)
- 忘记
- 最后进行计算
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>