汇编语言编程

问题描述 投票:0回答:3

我正在尝试编写一个程序,输入一个小于 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为负载。我知道我需要重复什么,但我不知道你如何用汇编语言做到这一点。

assembly pseudocode
3个回答
5
投票

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

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

  2. 如果你已经弄清楚了逻辑,那么哪些命令将执行每个部分?

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

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

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

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


2
投票

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

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

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

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

这闻起来像学校作业,所以我认为这应该足以让你继续下去。


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个情况除外)。

这有帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.