Языковое программирование на ассемблере - PullRequest
0 голосов
/ 08 января 2010

Я пытаюсь написать программу, которая вводит положительное число меньше 10 и выводит сумму первых чисел. Например, 5 будет 5 + 4 + 3 + 2 + 1. Это команды «Стоп», «Загрузить», «Сохранить», «Добавить», «Сумма», «Умножить», «Разделить», «Ввод», «Вывод», «Ветвь», «Ветвь», если 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 - нагрузка. Я знаю, что мне нужно повторить, но я не знаю, как вы делаете это на ассемблере.

Ответы [ 3 ]

5 голосов
/ 08 января 2010

Так как это звучит как домашнее задание, я начну с нескольких частей.

  1. Вы уже разработали логику этой проблемы? «Застрял» может означать, что вы понятия не имеете, как это нужно сделать, или что вы не знаете, как реализовать это с помощью доступных инструкций. Если вы не проработали логику, подумайте об этом - как вы придумываете термины, как складываете их вместе и что вы делаете с результатами?

  2. Если вы разработали логику, то какие команды будут выполнять каждую часть?

Если у вас есть более конкретные вопросы, не стесняйтесь их обновлять, и я отвечу, но, как правило, политика в отношении SO заключается в том, чтобы предлагать рекомендации, а не просто писать код для (возможных?) Домашних заданий.

Редактировать : хорошо, отлично, у вас есть какой-то код, и похоже, что вы на правильном пути, но еще не там. Первое, что я хотел бы спросить вас, пытались ли вы выполнить код на бумаге. Выберите произвольный ввод (скажем, 5, как в вашем примере) и пошагово просматривайте код по одной инструкции за раз, чтобы увидеть, соответствует ли логика, которую выполняет программа, логике, которую вы придумали на шаге 1. Сейчас я считаю, что программа не работает как написано; посмотрим, сможете ли вы выяснить, почему, а если нет, я дам вам подсказку.

Редактировать 2 : офигенно, вы так близки, что у вас уже есть ответ, и вам просто нужно его кодировать. Вы сказали, что хотите повторить, пока n не достигнет 0. Итак, какая команда позволит вам взять одну из двух веток в зависимости от того, равно ли n 0 или нет?

Редактировать 3 : вы правы, полагая, что вам нужно использовать ветвь, если 0 / ветвь не 0, но я не вижу ничего из этого в вашем последнем коде. Я что-то пропустил? Кроме того, для чего нужен DC в этом случае? Это может быть полезно, если вы отправите ключ, чтобы я точно знал, какие инструкции вы используете. Как я уже говорил, попробуйте выполнить вашу программу вручную - это покажет вам, где находятся ошибки. Моя подсказка для вас прямо сейчас - определить ту часть кода, которую необходимо выполнить повторно, и выяснить, выполняется ли она на самом деле повторно.

2 голосов
/ 08 января 2010

Попробуйте сначала записать проблему в псевдокоде высокого уровня.

Затем переведите его на свой язык ассемблера.

Справку по программированию на языке ассемблера можно найти здесь

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

Этот запах похож на школьное задание, поэтому я думаю, что этого должно быть достаточно, чтобы вы пошли.

0 голосов
/ 10 января 2010

подумайте об этом на С (при условии, что вы это знаете)

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;
}

обратите внимание на отсутствие операторов разрыва (кроме 0-го случая).

Помогает ли это?

...