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

Напоминаю, что умение программировать в системе команд МиК (в машинном языке и на ассемблере) включено в аттестационный тест модуля 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.588235
Your rating: Нет Average: 4.6 (17 votes)

Комментарии

А здесь всё ломается

А здесь всё ломается с 7-й строчки (объясните, что там у Вас записано по мистическому адресу 800?). Задача 1 решена верно.
По-прежнему отказываетесь приводить условия задач, радость их поиска предоставляя мне (ну, разве трудно условие задачи скопировать себе в пост?)

Джанчатова Зарина аватар

0000) 01 0001) 22 0600 0004)

  1. 0000) 01
  2. 0001) 22 0600
  3. 0004) 10 0600
  4. 0007) 10 0600
  5. 0010) 22 0700
  6. 0013) 21 0600
  7. 0016) 10 0600
  8. 0019) 22 0800
  9. 0022) 23 0001
  10. 0025) 22 0900
  11. 0028) 21 0700
  12. 0031) 11 0800
  13. 0034) 11 0600
  14. 0037) 11 0900
  15. 0040) 02
  16. 0043) 99

Задача2

Добрый вечер!
Задача2.

0) 01
1) 22 0100
4) 10 0100
7) 22 0150
10) 10 0100
13) 22 0200
16) 23 0001
19) 22 0250
22) 21 0200
25) 11 0150
28) 11 0100
31) 11 0250
34) 02
35) 99

Дважды за вечер

Ср, 26/09/2012 - 19:24 — Джанчатова Зарина. Дважды за вечер повторённая просьба-замечание приводить условие, в очередной оставлено без внимания.
Ну, что-ж, "решения" неизвестно чего не буду замечать и я ...

Да, Батыр, но можно

Да, Батыр, но можно значительно проще!

Домашняя работа. y= 8x - 1

  1. 0)  01
  2. 1)  22 0100
  3. 4)  10 0100
  4. 7)  10 0100
  5. 10) 10 0100
  6. 13) 10 0100
  7. 16) 10 0100
  8. 19) 10 0100
  9. 22) 10 0100
  10. 25) 22 0105
  11. 28) 23 0001
  12. 31) 22 0110
  13. 34) 21 0105
  14. 37) 11 0110
  15. 40) 02
  16. 41) 99

На Ассемблере

  1. In;
  2. st x;
  3. add x;
  4. add x;
  5. add x;
  6. add x;
  7. add x;
  8. add x;
  9. add x;
  10. st x;
  11. La 1;
  12. st  y;
  13. Ld x;
  14. sub y;
  15. out;
  16. halt;

Верно, Батыр

Но и здесь, подумайте как укоротить.
Давайте решения только на ассемблере.

ЕЩЁ ЗАДАЧА

Не вижу решений задач с условными передачами управления!

Вот к домашним ещё одна: Введённые значения двух переменных X и Y вывести в порядке неубывания. (Ассемблер).

Джанчатова Зарина аватар

Задача2. Запишите на МЯ

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

  1. 0000) 01
  2. 0001) 22 0600
  3. 0004) 10 0600
  4. 0007) 10 0600
  5. 0010) 22 0700
  6. 0013) 21 0600
  7. 0016) 10 0600
  8. 0019) 22 0800
  9. 0022) 23 0001
  10. 0025) 22 0900
  11. 0028) 21 0700
  12. 0031) 11 0800
  13. 0034) 11 0600
  14. 0037) 11 0900
  15. 0040) 02
  16. 0043) 99

Искренне извиняюсь,не первый, но последний раз...

Упрощение задания

А можно ли упростить функцию, если она всегда выдает одно и тоже значение?
Например, в задаче 2 функция 3X -2X -X -1 при любых значениях Х выдаст "-1"
Можно ли вместо решения:
IN;
ST X;
ADD X;
ST 2X;
ADD X;
ST 3X;
LA 1;
ST ONE;
LD 3X;
SUB 2X;
SUB X;
SUB ONE;
OUT;
HALT;
Просто написать:
LA 2;
ST X;
LA 1;
SUB X;
OUT;
HALT;
Ведь результат будет один и тот же при любых условиях

Может быть так? In; st x;

Может быть так?

  1. In;
  2. st x;
  3. add x;
  4. st j;
  5. add j;
  6. st k;
  7. add k;
  8. st p;
  9. La 1;
  10. st 1;
  11. ld p;
  12. sub 1;
  13. out;
  14. halt;

Карбанёва Александра аватар

Домашнее задание. Задача 2. У=А+В-3С

Решение на МиК.

  1. 0) 01
  2. 1) 220200
  3. 4) 100200
  4. 7) 100200
  5. 10) 220300
  6. 13) 01
  7. 14) 220350
  8. 17) 01
  9. 18) 220400
  10. 21) 100350
  11. 24) 220450
  12. 27) 110300
  13. 30) 02
  14. 31) 99

Решение на ассемблере.

  1. In;
  2. St C;
  3. Add C;
  4. Add C;
  5. St Z;
  6. In;
  7. St A;
  8. In;
  9. St B;
  10. Add A;
  11. St Y;
  12. Sub Z;
  13. Out;
  14. Halt;

Зарина, принимается и

Зарина, принимается и извинение и решение.
Дмитрий, Вы на правильном пути, но:
Научитесь "красивому коду", иначе перестану замечать и Вас.

Да, Батыр, да Александра.

Но одну команду, Саша, можно выбросить. Какую?

Карбанёва Александра аватар

11 строку (сохранение y)?

11 строку (сохранение y)?

Подскажите

Подскажите, каким тегом открывается и закрывается форма для ввода кода? (для красивого кода :) )

Дима, Александра.

Дима, каюсь. Короче нельзя.
Саша. Молодец!

Зуева Виктория аватар

Дмитрий

< pre> текст программы < /pre> (без пробелов внутри <>)

Домашняя работа. y=271) 27

Домашняя работа. y=27

  1. 1) 23 0027 // загрузка адреса 27
  2. 4) 02 // вывод
  3. 5) 99 // остановка

На Ассемблере

  1. La 27;
  2. out;
  3. halt;

Карбанёва Александра аватар

аааа

я старалась;))

A+B-3C

Самое маленькое решение

  1. in;
  2. st c;
  3. in a;
  4. st a;
  5. in;
  6. add a;
  7. sub c;
  8. sub c;
  9. sub c;
  10. out;
  11. halt;

Сравнивание Х и У и вывод в порядке неубывания

  1. IN;
  2. ST X;
  3. IN;
  4. ST Y;
  5. CMP X;
  6. JM K;
  7. LD X;
  8. OUT;
  9. LD Y;
  10. JMP E;
  11. K: OUT;
  12. LD X;
  13. JMP E;
  14. E: OUT;
  15. HALT;

P.S. В мое ДЗ это не входит, решил ради интересаSmile

Поправка

Можно убрать одну лишнюю строку (JMP E;)

  1. IN;
  2. ST X;
  3. IN;
  4. ST Y;
  5. CMP X;
  6. JM K;
  7. LD X;
  8. OUT;
  9. LD Y;
  10. JMP E;
  11. K: OUT;
  12. LD X;
  13. E: OUT;
  14. HALT;

Верно, Дмитрий. Но

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

P.S. Пока писал коммент, Вы и сами всё заметили!

Переход...

Я думал, что если оператор задан для перехода (как в данном случае Е), то обычное выполнение эту команду пропускает. Но потом увидел Вашу задачу 4, а там как раз все сразу понятно.

Бельчич Николай аватар

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

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

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

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

Задача М*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.

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

Позволю себе поправить

Позволю себе поправить преподавателя. Приведённый код не работает.

  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;  // забыли загрузить значение Y,  т.к. последнее, что загружено —  это М = 0, что и выдаётся на выходе.
  18. Out;
  19. Halt;  

И, кстати, по необъяснимым причинам скопированный код вываливается в ошибку на команде JMP, пишет: НЕТ ТАКОЙ КОМАНДЫ. Если переписать всё вручную, то работает.

Ну, программный код,

Ну, программный код, составленный "преподавателем" в описанной Вами ситуации непричём (хотя команда LD Y; в конце действительно была пропущена).

А вот компилятор с языка ассемблера (кстати сказать, запрограммированный одним из наших студентов), действительно сработал на этой программе некорректно, переведя адресную часть (точнее, третий байт) команды Jmp (имеющей в МЯ адрес 41) в число 62, а не в число 20, как того требует логика.

Самый простой путь всё же проверить приведённую мною программу - это скопировать её в режиме ASM в окошко редактора МиК, убрать нумерацию команд и комментарии, после чего скомпилировать.
Далее, подправив в машинном коде выше указанный байт (с адресом 43, в который вместо 62 должно быть занесено число 20), запустить на выполнение (не забыв в RA установить 0 -стартовый адрес).

Cпасибо за внимательное прочтение и практическую отработку кода! Два балла - Ваши.

Вам спасибо, за пищу для ума.

Вам спасибо, за пищу для ума. У меня такой вопрос, почему для обучения не используется обычный ассемблер? На мой взгляд это было бы гораздо лучше. Так же постепенно изучать существующие команды. Тот же flat assembler (fasm), бесплатный и кроссплатформенный.

Реализация 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 (переход по не плюсу)?

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

jp (переход по плюсу)

0)
...
n-6)modul: sub x;
n-3)sub x;
n)CMP X;
n+1)jm modul;
...

Jnz (Переход не по нулю).

...
in 0;
st 0;
...
nol:ld x;
add y;
...
in x;
Jz nol;

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

Валерий Шахамболетович, поясните пожалуйста переход "не по нулю"...

попытка:-)

  1. 1. In;
  2. 2. st x;
  3. 3. jp M;   // если число положительно, то переход на M
  4. 4. jnp N;   // если число <=0, то переход на N
  5. 5. M:  add x;
  6. 6. N:  add x;
  7.          add x;
  8.          add x;
  9. 7. out;
  10. 8. halt;

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

Решений пока нет.Не должно

Решений пока нет.
Не должно быть никаких конкретно решаемых задач (с вводом X, вычитаниями и т.п.)! Отвечая на вопрос Виктории, поясню на примере реализации команды Jnz.

1. Пусть необходимо перейти на команду, помеченную меткой M, если в сумматоре оказался 0. Тогда очевидно, пишем (cуществует готовая команда):

  1. ...
  2. Jz   M;
  3. ...

2. Пусть необходимо перейти на команду, помеченную меткой M, если в сумматоре оказался не 0. Тогда пишем (не cуществует готовой команды):

  1. //реализация логики несуществующей команды Jnz  M;
  2. ...
  3. Jz   Cont;
  4. Jmp  M;
  5. Cont: ...
  6. ...

Думаю, существенно облегчил рассмотрение остальных случаев.

Добавлю, Вика

"Команды" jp M; или jnp N; в МиК-программах встречаться НЕ МОГУТ, т.к. таких команд (повторюсь) в МиК попросту НЕТ.

Поняла свою ошибку. Буду

Поняла свою ошибку. Буду думать

Джанчатова Зарина аватар

............Jp M;......M:

  1. ......
  2. ......
  3. Jp M;
  4. ......
  5. M: OUT;
  6. HALT.

Надеюсь я поняла смысл вашего вопроса,жду вердикта)

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

Валерий Шахамболетович, почему в первом вашем комментарии введено Jm, ведь число равно нулю, а значит и переход должен быть по нулю (jz)?

Зарина, ВНИМАТЕЛЬНО прочтите

Зарина, ВНИМАТЕЛЬНО прочтите Сб, 29/09/2012 - 22:33.
Вика, Вы правы - описка (уже исправил)

Переход по плюсу

необходимо перейти в А если содержимое сумматора больше 0

  1. .......
  2. jz b;
  3. jm c;
  4. jmp А;
  5. ....

Не по минусу

перейти на А если содержимое сумматора >=0

  1. .......
  2. jm B;
  3. jmp A;
  4. B:......
  5. .......

Анатолий, b,c (?)

Анатолий, b,c (?)

Переход не по плюсу

перейти в А если содержимое сумматора <=0

  1. ........
  2. jz A;
  3. jm A;
  4. ......

b,c (?)

какие либо команды помеченные соответствующими метками b,c....или вопрос в том что они с маленькой буквы?или дописать их в дальнейшем коде?

Или я ничего не понял)))

Или я ничего не понял)))

Джанчатова Зарина аватар

... Jp   Cont; Jmp  M; Cont:

  1. ...
  2. Jp   Cont;
  3. Jmp  M;
  4. Cont: ...
  5. ...

???