0

我正在尝试编写一个程序,输入一个小于 10 的正数并输出第一个数字的总和。例如 5 将是 5+4+3+2+1。这些命令是停止、加载、存储、加、求和、乘、除、输入、输出、分支、如果为 0 则为分支,如果不是 0 则为分支。任何人都可以在这里帮助我。我有点卡住了。好吧,我写的是:

      IN    n
      LD    n
      ADD   sum
      STO   sum
      LD    n
      SUB   one
      ADD   sum
      STO   sum
      BRGT  haw
      LD    n
      BR    done
haw:  OUT   sum
done: STOP
      DC    n   4
      DC    sum 0
      DC    one 1  

好吧,我认为它的工作方式是加载一些数字 n 并添加一个总和 0,然后将该总和存储为 n+sum。然后你再次加载 n 并减去 1 并将其存储为新的总和。但是我需要它重复这个直到 n 达到 0。那么我该怎么做呢?

好的,所以我需要做的是如果为 0 则使用分支,如果不是 0 则使用分支。我想我有吗?所以:

     IN    n
     LD    n
     ADD   sum
     STO   sum  
     BR    CAW
CAW: LD    n  
     SUB   ONE  
     STO   n
     BRGT  HAW
     BZ    TAW
HAW: ADD   SUM  
     STO   SUM  
     BR    CAW  
TAW: OUT   SUM
     DC    SUM 0
     DC    ONE 1

DC =指定常数,但我需要重复的是减一并加上总和直到n达到0。如果不为零,则分支是BRGT,如果零是BZ并且分支是BR,则分支,LD是负载。我知道我需要重复什么,但我不知道你是如何用汇编语言做到这一点的。

4

3 回答 3

5

因为这听起来像家庭作业,我将从一些作品开始。

  1. 你有没有弄清楚这个问题的逻辑?“有点卡住”可能意味着您不知道这需要如何完成,或者您不确定如何使用可用的说明来实现它。如果您还没有弄清楚逻辑,请考虑一下 - 您如何提出这些术语,如何将它们加在一起,以及您如何处理结果?

  2. 如果您已经制定了逻辑,那么哪些命令将执行每个部分?

如果您有更具体的问题,请随时更新,我会回复,但通常关于 SO 的政策是提供指导,而不仅仅是为(可能?)家庭作业问题编写代码。

编辑:好的,很好,你有一些代码,看起来你在正确的轨道上,但还没有。我要问你的第一件事是你是否尝试过在纸上执行代码。选择一个任意输入(比如 5,如您的示例)并一次执行一条指令,查看程序执行的逻辑是否遵循您在步骤 1 中提出的逻辑。现在我相信该程序不像书面的那样工作;看看你能不能找出原因,如果不能,我会给你一个提示。

编辑 2:太棒了,你已经很接近了,你已经有了答案,只需要编码它。您说过要重复直到 n 达到 0。那么,根据 n 是否为 0,哪个命令可以让您选择两个分支之一?

编辑 3:假设如果 0 / 分支不是 0 则需要使用分支是正确的,但我在您的最新代码中看不到任何这些。我错过了什么?另外,在这种情况下,DC 是什么?如果您发布密钥可能会有所帮助,以便我确切知道您正在使用哪些说明。正如我之前所说,尝试手动执行你的程序——这将告诉你错误在哪里。我现在给您的提示是确定需要重复执行的代码部分,并确定它是否确实重复执行。

于 2010-01-08T03:50:56.860 回答
2

首先尝试用高级伪代码写出问题。

然后将其翻译成您的汇编语言。

您可以在此处找到有关汇编语言编程的帮助

http://www.laynetworks.com/assembly%20tutorials.htm

这闻起来像学校作业,所以我认为这足以让你继续前进。

于 2010-01-08T03:51:18.170 回答
0

在 C 中考虑它(假设你知道它)

int sumnumbers(int input)
{
    int output = 0;

    input = max(input, 10);

    switch (input)
    {
        case 5:
            output += 5;
        case 4:
            output += 4;
        case 3:
            output += 3;
        case 2:
            output += 2;
        case 1:
            output += 1;
        case 0:
            output += 0;
            break;
    }

    return input;
}

请注意缺少 break 语句(第 0 种情况除外)。

这有帮助吗?

于 2010-01-10T20:51:19.787 回答