Ассемблер Язык программирования

голоса
0

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

Ну, как я вижу его работать вы загружаете некоторое число п и добавить сумму 0, а затем сохранить эту сумму, как п + сумма. Затем вы загружаете п снова и вычесть 1 и сохранить его в качестве нового суммы. Но мне нужно, чтобы повторять это до тех пор, пока не достигнет п 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 = Места Constant, но то, что мне нужно повторить это вычитание по одному и добавляя сумму до п не достигнет 0. Branch, если не нуль BRGT и ветви, если нуль BZ и ветвь BR, LD является нагрузка. Я знаю, что мне нужно повторить, но я не знаю, как вы это делаете на языке ассемблера.

Задан 08/01/2010 в 04:46
источник пользователем
На других языках...                            


3 ответов

голоса
5

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

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

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

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

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

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

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

Ответил 08/01/2010 в 04:50
источник пользователем

голоса
2

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

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

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

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

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

Ответил 08/01/2010 в 04:51
источник пользователем

голоса
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;
}

обратите внимание на отсутствие заявлений излома (за исключением на 0'th случае).

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

Ответил 10/01/2010 в 21:51
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more