汇编语言编程

时间:2010-01-08 03:46:24

标签: compiler-construction assembly pseudocode

我正在尝试编写一个输入小于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 =指定常数,但我需要重复的是减去1并加上总和直到n达到0.如果不为零,则为BRGT和分支,如果零为BZ且分支为BR,则LD为负载。我知道我需要重复什么,但我不知道你是如何用汇编语言做的。

3 个答案:

答案 0 :(得分:5)

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

  1. 你有解决这个问题的逻辑吗? “有点卡住”可能意味着你不知道如何做到这一点,或者你不确定如何用可用的指令来实现它。如果你还没有弄清楚这个逻辑,那么考虑一下 - 你如何提出这些条款,如何将它们加在一起,以及你如何处理结果?

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

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

    编辑:好的,你有一些代码,看起来你已经走上正轨但还没有。我要问你的第一件事是你是否试图在纸上执行代码。选择一个任意输入(比如5,如你的例子中所示)并一次一步地执行代码,看看程序执行的逻辑是否遵循你在步骤1中提出的逻辑。现在我相信程序不起作用;看看你能否找出原因,如果没有,我会给你一个提示。

    编辑2 :太棒了,你太接近了,你已经有了答案,只需要编码就可以了。你说你要重复,直到n达到0.那么,哪个命令会让你取两个分支中的一个取决于n是否为0?

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

答案 1 :(得分:2)

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

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

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

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

这种气味就像是一项学校任务,所以我认为这应该足以让你去。

答案 2 :(得分: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个案例除外)。

这有帮助吗?

相关问题