如何在Little Man Computer中实现指数?

How can I implement exponentation into Little Man Computer?

提问人:waxworm 提问时间:11/18/2023 最后编辑:Peter Cordeswaxworm 更新时间:11/18/2023 访问量:47

问:

我和我的朋友已经为此工作了几个小时,但似乎无法弄清楚。我们正在尝试在 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。不过这很有趣。感谢你们能提供的任何帮助!

汇编 指数幂 Little-Man-Computer

评论

1赞 Erik Eidt 11/18/2023
您是否有有效的 C 或伪代码版本,并且您正在尝试遵循?如果是这样,也请发布它。我想说你错过了内部循环变量的重新初始化。循环 1 在为零时结束,循环 2 返回到循环 1,但已经为零,因此在第二次运行时循环 1 立即退出,而不执行任何有价值的操作。仅供参考,不要只是猜测,使用逻辑和推理;使用调试器进行单步调试,而且,在调试过程中,您可以与工作的 C 版本进行比较,非常有帮助!该算法的工作 C 版本大约有 3-4 行代码,非常值得一试。jj
0赞 waxworm 11/18/2023
谢谢!我还没有得到它的伪代码版本,但这绝对是有帮助的。不知道为什么我以前没有尝试过!
0赞 Erik Eidt 11/19/2023
好的,很高兴你玩得很开心,尽管它不仅可以作为一种汇编学习体验,还可以加深你对你已经知道的语言和伪代码的理解!尝试在高级语言的工作方式和在汇编中做同样的事情之间建立一些关联。

答:

1赞 trincot 11/18/2023 #1

您的尝试存在以下几个问题:

  • sum从第一个输入的值开始,即幂的基数。但是,如果功率(第二个输入)为零,则该功率已经太大了,因为结果应该是 1。所以 的起始值不正确sumsum

  • 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
对这个答案有什么反馈吗?这对你有用吗?