Задачи по программированию на машинном языке и на Ассемблере МиК

Напоминаю, что умение программировать в системе команд МиК (в машинном языке и на ассемблере) включено в аттестационный тест модуля 1 и что материалы по МиК лежат здесь (архитектура и система команд МиК), здесь(программирование на МЯ МиК) и здесь (понятие об Ассемблерах и программирование на языке ассемблера МиК).

Материал в основном предназначен для самостоятельного изучения. В указанных выше разделах, помимо теории, вы так же найдёте много задач, их решений и обсуждений. Кроме того, у вас имеется возможность практической проверки ваших решений на МиК-интерпретаторе, который Вы можете скачать в конце этой статьи.

Моя помощь гарантирована по востребованию.

А сейчас, собственно, несколько разминочных задач и вопросов по МиК:

Задача1. Что напечатает МиК, выполнив как программу следующий размещённый в ОП c адреса 100 код (принимаются только решения с объяснением!):

  1. 100)2300232200231000230299

Задача2. Запишите на МЯ МиК-программу, которая по заданному X вычисляет функцию 3X -2X -X -1.

Задача3. Решите задачу2, записав программу на Ассемблере МиК.

Задача4. Объясните, какую задачу и как решает следующая программа на Ассемблере:

  1.     in;
  2.     jm   F;
  3.     st   X;
  4.     sub  X;
  5.     sub  X;
  6. F:  out;
  7.     halt;

Замечание. halt в используемой нами версии интерпретатора - это команда 99 (т.е. stop)

4.61111
Your rating: Нет Average: 4.6 (18 votes)

Комментарии

Валерий Шахамболетович,

Валерий Шахамболетович, извените, можно ли на Мик выполнять умножение и деление числа на число...

Команд таких нет

Команд таких нет, Николай. Но запрограммировать их можно. Например:

Задача М*N. Пусть даны 2 целых неотрицательных числа M и N. Найти их произведение.

Идея решения проста. Y=M*N - это M повторённое в качестве СЛОГАЕМОГО N раз. Поэтому начав с Y=0, будем многократно добавлять к Y число N, после каждого добавления уменьшая M на 1. Процесс завершится, как только M иссякнет, т.е. превратится в 0 (в этот момент и будет получена нужная сумма, равная M*N). На Ассемблере это может выглядеть так:

  1.     In;  
  2.     St    M;
  3.     In;
  4.     St    N;   //ввели числа
  5.     La    1;
  6.     St     One; //получили 1 для вычитания
  7.     La    0;
  8.     St    Y;     // Y:=0
  9. L:  Ld    M;    
  10.     Jz     Fin;  // обнаружив, что M=0, закончим
  11.     Sub   One;
  12.     St     M;    //M:=M-1
  13.     Ld    Y;
  14.     Add  N;    //Y:=Y+N
  15.     St    Y;     //сохраним Y увеличеннон ещё на N
  16.     Jmp  L;    // повторим с проверки M
  17. Fin: Ld   Y;
  18.     Out;
  19.     Halt;  

Аналогично, через многократное вычитание можно выразить связанные с делением операции DIV и MOD.

Надеюсь, увидеть на сайте и эти решения!

Реализация div на МиК.IN;ST

Реализация div на МиК.

  1. IN;
  2. ST X;
  3. IN;
  4. ST Y; //Ввели числа.
  5. LA 1;
  6. ST Z;
  7. LA 0;
  8. ST RESULT;// Здесь будет храниться число вхождений Y в Х.
  9. OP: LD X;
  10.     JZ OFF;// Если Х равен нулю, прыгаем на метку OFF.
  11.     JM OFFM;// Если Х меньше нуля, прыгаем на метку OFFM.
  12.     SUB Y;// Если Х не равен нулю и не меньше нуля, отнимаем от него делитель.
  13.     ST X;// X := X - Y.
  14.     LD RESULT;
  15.     ADD Z; // Добавляем один к результату.
  16.     ST RESULT;
  17.     JMP OP;
  18. OFF: LD RESULT;// Если Х = 0, то загружаем и просто выводим результат.
  19.      OUT;
  20.      HALT;
  21. OFFM: LD RESULT;// Если Х < 0, то загружаем результат и отнимаем от него один, т.к. это уже не вхождение Y в X.
  22.      SUB Z;
  23.      OUT;
  24.      HALT;

Реализация DIV верна.

Реализация DIV верна. Нравится у Андрея мне и культура оформления текста (комментарии, структура).
Что же до его вопроса о реальном ассемблере вместо ассемблера МиК - это из той серии, почему не С++, а Паскаль; не Паскаль, а МиП; не IBM PC, а МиК и т.п.
Похоже, авторы этих вопросов или не слушают, или не слышат, а потому не понимают и не воспринимают, неоднократно декларируемые мною цели и обоснования подобных выборов. Повторять здесь свою аргументацию не буду (оставив за собой право просить Вас это сделать самим, на экзамене).

КОНКУРС!

Как известно, МиК обладает всего лишь двумя условными командами: Jz и Jm. Первая способна реагировать на 0 (т.е. передавать управление туда, куда нам нужно, если в сумматоре был получен 0), а вторая - на отрицательное число.

Сформулируйте явно, как можно было бы в МиК программно выразить смысл следующих физически отсутствуюших в архитектуре данной машины, но иногда необходимых команд типа:
Jp (переход по плюсу), Jnz (переход по не нулю), Jnm (переход по не минусу, т.е. если анализируемое число >= 0), Jnp (переход по не плюсу)?

Оцениваю правильность, наглядность и оперативность предлагаемых решений!

На сегодняшней лекции я

На сегодняшней лекции я услышал ответ на свой некорректный вопрос о том, почему мы не изучаем ассемблер. Мы, как оказалось, вообще не изучаем какой-то конкретный ЯП, а сам принцип программирования, основные алгоритмы и понятия. Впредь постараюсь быть более внимательным.

Да, Андрей.

Да, Андрей. Было бы Вам полезно ещё раз, внимательней посмотреть как наш предмет называется.
Понятно, что учить информатике и программированию, невозможно вне рамок конкретных информационных моделей и систем программирования.
И в частности поэтому, как и во многих университетах мира, нами выбран один из наиболее простых ЯП (Паскаль), который специально создан для целей обучения программированию .

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

МиК - предельно простая модель компьютера фон Неймановской архитектуры. Ассемблер МиК - простейший представитель ассемблеров. МиП даёт концентрированное представление о процедурно ориентированных языках высокого уровня и о том, как они могут быть описаны формальными (такими как БНФ) средствами и т.п.

Задача 2. Ассемблер

Решите задачу2, записав программу на Ассемблере МиК, которая по заданному X вычисляет функцию 3X -2X -X -1.

  1. IN;     // вводим x
  2. ST A;  // сохраняем x
  3. ADD A;  //  в S 2x
  4. ADD A;  //  в S 3x
  5. ST B;     //  сохраняем 3х
  6. LD A;    //   загружаем в S число x
  7. ADD A;   //  в S 2x
  8. ST C;     //  в ОП 2x
  9. LA 1;    //   загружаем в S 1
  10. ST ONE;  //  сохраняем единицу
  11. LD B;     //   загружаем в S 3x
  12. SUB C;   //   вычитаем из 3x-2x
  13. SUB A;   //   вычитаем x
  14. SUB ONE;  // вычитаем 1
  15. OUT;        //   выводим результат
  16. HALT;       //  стоп

Задача 1. Ассемблер.

Задача1. Что напечатает МиК, выполнив как программу следующий размещённый в ОП c адреса 100 код (принимаются только решения с объяснением!):
100)2300232200231000230299.
Решила написать задачу 1. на Ассемблере .Хоть и не было такого задания, но всё же, не ругайтесь, пожалуйста, что за вечер выложила несколько вариантов решения, просто долго молчала (читала статьи и посты, пыталась понять " что такое МиК и с чем его едят"), решила наверстать упущенное. Я готова больше работать, не хочу отставать от остальных:)

  1. LA 23;  // загружаем число 23 в сумматор
  2. ST 23;  // сохраняем 23
  3. ADD 23; // умножаем 23 на 2
  4. OUT;      // выводим результат
  5. HALT;    //  стоп

Валерий Шахамболетович!

Валерий Шахамболетович! Проверьте пожалуйста, правильно ли я оформила домашнюю задачу y=-|x|+99 на ассемблере. (Хочу проверить свои знания, пока вы не выставили вечерние бонусные задачи.)

  1.      in;
  2.      st a;
  3.      jm m;
  4.      jmp n;
  5. m: sub a;
  6.      sub a;
  7. n: st a;
  8.     la 99;
  9.     sub a;
  10.     out;
  11.     halt;

Задача 2

УДАЛЕНО БЕЗ ПРОЧТЕНИЯ, НЕ ОФОРМЛЕНА ВСТАВКА КОДА!

Задача 3

УДАЛЕНО БЕЗ ПРОЧТЕНИЯ, НЕ ОФОРМЛЕНА ВСТАВКА КОДА!

Александр! теги

Александр, заключи свой программный код между тегами < pre> и < / pre>, так будет красивее)) Об этом уже не один раз было сказано. Только пробелы в тегах не нужны

задача 4

1. ввод
2.анализирует содержимое в z, передает управления в F.
3. что находится в сумматоре копируется в Оп с указанным A.
4.s:=s-A
5. s:=s-A
6.вывод
7.стоп

Задача 2. Исправленная

Запишите на МЯ МиК-программу, которая по заданному X вычисляет функцию 3X -2X -X -1. Проверила на МиК работает:) Ура:)

  1. 0100) 01           // вводим x c клавиатуры
  2. 0101) 22 0200  // сохраняем x в ячейку 0200
  3. 0104) 10 0200  // удваиваем x, в S 2x
  4. 0107) 10 0200  // утраиваем x, в S 3x
  5. 0110) 22 0300  //  сохраняем 3x в ячейке 0300
  6. 0113) 21 0200  //  загружаем x в S
  7. 0116) 10 0200  //  удваиваем x, в S 2x
  8. 0119) 22 0400  //  сохраняем  2x в ячейке 0400
  9. 0122) 23 0001  //  загружаем 1
  10. 0125) 22 0500  //  сохраняем 1 в ячейке 0500
  11. 0128) 21 0300  //  загружаем 3x в S
  12. 0131) 11 0400  //  вычитаем 2x
  13. 0134) 11 0200  //  вычитаем x
  14. 0137) 11 0500  //  вычитаем 1
  15. 0140) 02           //  выводим результат
  16. 0141) 99           //  стоп

а что надо делать в 22-00, и

а что надо делать в 22-00, и где тест будет

Валерия

в 22:00 нужно быть на сайте

а если программа будет, как

а если программа будет, как ее выхожить?

Валерия!

О том как выложить программу всё написано в постах:) уже этот момент неоднократно обсуждали:)

Рита!

помоги не где,
не могу найти как это сделать

скоро тест !!!

время все меньше и меньше )))

ага, интересно что там будет

ага, интересно что там будет

Коля:)

Не нагнетай обстановку:)

По "тренировочным задачкам"

Настя К. Всё замечательно, и решения и анализ решения задачи 2. Но смысл задачи 4, я всё же выразил бы как Y= -|X|.
Маргарита. Вы поработали в целом неплохо, но "переработка" Вам в минус. В следующий раз удалю не читая. Это не касается задачи 1, к решению которой которой Вы предложили полезное дополнение. Вижу, что разобрались.
Карина. Решение верное, хоть и не по теме.
Александр. Не выполняете моих правил по оформлению кода. Мне жаль, вопреки моим ожиданиям, Вы не читаете постов и не растёте.
Николай. Повторюсь: Y= -|X|. За деревьями не видно леса.

В 10 часов и посмотрим))

В 10 часов и посмотрим))

Извините, в следующий раз

Извините, в следующий раз учту!

много тут сидят людей

много тут сидят людей молодцы, кому надо тот ждет

Валерия!

После того как Валерий Шахамбалетович выложит задачи, ты во первых их прорешиваешь на бумаге, можно и в МиК проверить для полной уверенности(даже нужно), затем к посту в котором будут задачи, нажимаешь на кнопку "Добавить комментарий" Пишешь обязательно тему, затем условие задачи, затем решение заключённое между тегами < pre > и < / pre>

Просто постов много и за

Просто постов много и за всеми не уследишь))

вроде поняла

вроде поняла

Это так страшно прозвучало.

Это так страшно прозвучало.

)))))))))))

)))))))))))

Валерия

Вроде не устраивает:) что конкретно тебе не понятно из того что я сказала?

Катя, Александр, Валерия и др.

Катя, Александр, Валерия и др., кто хочет, чтобы их программный код читали!
Прошу Вас, прямо сейчас послать на сайт пост БУКВАЛЬНО следующего содержания:

< pre>
LD 1;
OUT;
HALT;
< /pre>

Только пробелов в < pre> и < /pre> не вставлять!
ЖДУ!

LD 1; OUT; HALT;

  1. LD 1;
  2. OUT;
  3. HALT;

LD 1; OUT; HALT;

  1. LD 1;
  2. OUT;
  3. HALT;

LD 1; OUT; HALT;

  1. LD 1;
  2. OUT;
  3. HALT;

Задача 2

  1. 0000)?
  2. 0001)?
  3. 0002)?
  4. 0003)?
  5. 0004)?
  6. 0005) 01 // Ввод X
  7. 0006) 22 0000 // сохраняем X в ячейке 0000
  8. 0009) 10 0000 // Cкладываем и получаем 2X
  9. 0012) 22 0001// Сохраняем 2X в ячейке 0001
  10. 0015) 10 0001// Складываем и получаем 3X
  11. 0018) 22 0002 // Сохраняем в ячейке 0002
  12. 0021) 11 0001 // отнимаем и получаем 3X-2X
  13. 0024) 22 0003 // Сохраняем в ячейке 0003
  14. 0027) 11 0000 // отнимаем X, получаем 3X-2X-X
  15. 0030) 22 0004 // сохраняем в ячейке 0004
  16. 0033) 23 0001 // Вводим в сумматор 1
  17. 0037) 22 0200// Сохраняем 1 в ячейке 0200
  18. 0040) 21 0004 // грузим ячейку 0004 в сумматор
  19. 0043) 11 0200 // отнимаем 1 и получаем 3X-2X-X-1
  20. 0046) 02
  21. 0047) 99

LD 1; OUT; HALT;

  1. LD 1;
  2. OUT;
  3. HALT;

 LD 1;  OUT;  HALT;  

  1.  LD 1;
  2.  OUT;
  3.  HALT;
  4.  

Код

  1. LD 1;
  2. OUT;
  3. HALT;

Добрый вечер.

  1.  LD 1;
  2.  OUT;
  3.  HALT;
  4.  

LD 1; OUT; HALT;

  1. LD 1;
  2. OUT;
  3. HALT;

LD 1;OUT;HALT;

  1. LD 1;
  2. OUT;
  3. HALT;

Тимур

Убери пробелы в начале тегов))

LD 1; OUT; HALT;

LD 1;
OUT;
HALT;

Пробелов не должно быть :)

<пробелpre>
LD 1;
OUT;
HALT;
<пробел/pre>

< pre> LD 1; OUT; HALT; <

< pre>
LD 1;
OUT;
HALT;
< /pre>

Валерия в < pre> и < /pre>

Валерия в < pre> и < /pre> убери пробелы

 LD 1;  OUT;  HALT;  

  1.  LD 1;
  2.  OUT;
  3.  HALT;
  4.