assembly 当z = a*b*c时,如何纠正玛丽模拟器汇编代码以正确输出z

hjqgdpho  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(101)
ORG 100                     

Input,      Input           / Read input value
            Store  A        / Store input value in A
            Input           / Read input value
            Store  B        / Store input value in B
            Input           / Read input value
            Store  C        / Store input value in C

            Load B       / Load value of B
            Store Count  / Set count for B 

LoopA,      Load A       / Load value of A
            Add Z       / Add value of Z 
            Store Z      / Store new value of Z

            Subt ONE     / Decrement count by 1
            Store Count  / Store new value 

            Skipcond 400 / Check if Count is negative or zero
            Jump LoopA   / If Count is positive, repeat loop

            Load C       / Load value of C
            Store Count  / Set count for C times

LoopC,      Load Z       / Load value of Z
            Add B       / Add value of B 
            Store Z      / Store new value of Z

            Subt ONE     / Decrement count by 1
            Store Count  / Store new value of Count

            Skipcond 400 / Check if Count is negative or zero
            Jump LoopC   / Repeat loop if count is positive

Output,     Load Z       / Load value of Z
            Output          / Output value of Z
            Halt         / End program

A, DEC 0          / Variable A
B, DEC 0          / Variable B
C, DEC 0          / Variable C
Z, DEC 0          / Result variable
Count, DEC 0      / Loop counter
ONE, DEC 1        / Constant value 1

END

字符串
我一直被困在循环A中,无法得到z的正确输出。如果你能帮忙的话,我将不胜感激。

kb5ga3dv

kb5ga3dv1#

这一点:

Subt ONE     / Decrement count by 1
        Store Count  / Store new value

字符串
递减累加器中的任何值,在两个循环中都是Z的最新值,因此不是您想要递减的值(并存储在Count中)
相反,只需加载计数来替换累加器值:

Load Count   / ... 
        Subt ONE     / Decrement count by 1
        Store Count  / Store new value


第一个循环计算Z = A × B。但是,第二个循环计算Z += B × C,所以实际上是乘以B两次,计算Z = (A × B) + (B × C)而不是Z = A × B × C
您需要查看第二次乘法(A × B) * × * C,作为第一次循环计算的中间结果A × B乘以C
第二个循环需要的是Z = Z × C,但是当Z本身发生变化时,这将很难计算,因此建议执行Z2 = Z × C-换句话说,使用一个新的变量作为第二个循环乘法答案,同时将Z固定为(A × B的)中间结果。
如果是我,我会在代码中将Z(和Z2)清零,而不是依赖于DEC 0初始化-这将允许每个程序运行乘法段不止一次,即如果你愿意的话
您使用的是do ... while (--Count > 0)循环结构。使用do..while循环形式在乘以零时会有问题,特别是对于变量BC-如果其中任何一个为零,那么它们将循环65535次。有两种方法可以解决

  • do .. while周围加上一个保护if语句
if (Count > 0) {
        do ... while (--Count > 0);
    }


因此,如果Count从零开始,只需跳过do,而将Z保留为0。

  • 将循环构造更改为while () {...}形式
while (Count > 0) {
        ...
        --Count;
    }


因此,在Count第一次递减之前测试它。

相关问题