提问人:waxworm 提问时间:11/18/2023 最后编辑:Peter Cordeswaxworm 更新时间:11/18/2023 访问量:47
如何在Little Man Computer中实现指数?
How can I implement exponentation into Little Man Computer?
问:
我和我的朋友已经为此工作了几个小时,但似乎无法弄清楚。我们正在尝试在 LMC 汇编中编写一个程序,该程序接受两个输入:一个用于整数,另一个用于另一个用作指数的整数。
// inputs
INP
STA sum
STA n
STA mCount
ADD one
STA j
INP
STA exponent
STA i
// loop 1 (mult)
mult LDA j
BRZ exloop
SUB one
STA j
LDA sum
ADD n
STA sum
LDA mCount
SUB one
STA mCount
BRA mult
// loop 2 (exp)
exloop LDA i
BRZ end
SUB one
STA i
BRA mult
// end
end LDA sum
OUT
HLT
// variables
sum DAT
mCount DAT
n DAT
j DAT
exponent DAT
i DAT
one DAT 1
这是我为它准备的最新代码。它似乎只适用于平方数。在这里,我实现了一个“嵌套循环”,其中数字乘以自身等于指数的次数。
我觉得我只是遇到了这么多麻烦,因为我们两天前才开始使用 LMC x-D。不过这很有趣。感谢你们能提供的任何帮助!
答:
1赞
trincot
11/18/2023
#1
您的尝试存在以下几个问题:
sum
从第一个输入的值开始,即幂的基数。但是,如果功率(第二个输入)为零,则该功率已经太大了,因为结果应该是 1。所以 的起始值不正确sum
sum
j
被初始化为另一个作为基础(第一个输入),这意味着内部循环会迭代很多次。这是不正确的。例如,如果第一个输入是 3,那么如果它需要与自身相乘,那么迭代次数应该是 3(将总和从 0 移动到 3,然后从 3 移动到 6,最后从 6 移动到 9),而不是 4。当外部循环重复时,某些变量不会重置为其原始值。例如,仍将为零(外层循环第一次迭代的结果),因此内层循环将不再迭代。
j
这不是问题,但减少没有明显的目的。它的值永远不会被测试或以后使用。mCount
为了正确,首先用一些伪代码编写算法会有所帮助。例如,以下是如何在一个简单的 JavaScript 函数中完成它,该函数采用两个输入:
function power(base, exp) {
let result = 1;
while (exp > 0) {
exp--;
// Here we multiply base with result and store in product:
let product = 0;
let countdown = base;
while (countdown > 0) {
countdown--;
product += result;
}
result = product;
}
return result;
}
现在添加 LMC 代码以匹配它:
function power(base, exp) {
let result = 1;
// LDA one
// STA result
while (exp > 0) {
// outerloop LDA exp
// BRZ output
exp--;
// SUB one
// STA exp
let product = 0;
// LDA zero
// STA product
let countdown = base;
// LDA base
while (countdown > 0) {
// innerloop BRZ exloop
countdown--;
// SUB one
// STA countdown
product += result;
// LDA product
// ADD result
// STA product
}
// LDA countdown
// BRA innerloop
result = product;
// exloop LDA product
// STA result
}
// BRA outerloop
return result;
}
因此,我们最终得出:
#input: 3 4
LDA one
STA result
INP
STA base
INP
STA exponent
outerloop LDA exponent
BRZ end
SUB one
STA exponent
LDA zero
STA product
LDA base
innerloop BRZ exloop
SUB one
STA countdown
LDA product
ADD result
STA product
LDA countdown
BRA innerloop
exloop LDA product
STA result
BRA outerloop
end LDA result
OUT
HLT
// variables
base DAT
exponent DAT
countdown DAT
result DAT
product DAT
// constants
one DAT 1
zero DAT 0
<script src="https://cdn.jsdelivr.net/gh/trincot/[email protected]/lmc.js"></script>
您可以在现场使用一个小的 LMC 模拟器运行此程序。
评论
0赞
trincot
11/19/2023
对这个答案有什么反馈吗?这对你有用吗?
评论
j
j