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

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

Комментарии

Решение задач 1.2.3.4.

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

  1. 100) 23 0023 // в сумматор записывается константа 23
  2. 103) 22 0023 // в ячейку номер 23 выгружается из сумматора число 23
  3. 106) 10 0023 // к числу в сумматоре (это 23) добавляется число находящееся в ячейке 0023 (это тоже 23), т.е. мы удвоили число 23, и в сумматоре теперь число 46
  4. 109) 02 // выводит содержимое сумматора на экран, выведется 46
  5. 110) 99 // останавливает выполнение программы

Ответ: 46
Задача2. Запишите на МЯ МиК-программу, которая по заданному X вычисляет функцию 3X -2X -X -1.
Решение:
  1. 100) 01 // запрос на ввод числа X
  2. 101) 22 0002 // выгрузка числа X из сумматора в ячейку 2
  3. 104) 10 0002 // к числу X в сумматоре добавляем число X находящееся в ячейке 2, теперь в сумматоре 2X
  4. 107) 22 0008 // выгружаем число 2X из сумматора в ячейку 8
  5. 110) 10 0002 // к числу 2X в сумматоре добавляем число X находящееся в ячейке 2, теперь в сумматоре 3X
  6. 113) 22 0012 // выгружаем число 3X из сумматора в ячейку 12
  7. 116) 23 0001 // записываем константу 1 в сумматор
  8. 119) 22 0015 // выгружаем число 1 в ячейку 15
  9. 122) 21 0012 // загружаем число 3X из ячейки 12 в сумматор
  10. 125) 11 0008 // вычитаем из 3X(которое находится в сумматоре) число 2X находящееся в ячейке 8
  11. 128) 11 0002 // вычитаем из 3X-2X(которое находится в сумматоре) число X находящееся в ячейке 2
  12. 131) 11 0015 // вычитаем из 3X-2X-X(которое находится в сумматоре) число 1 находящееся в ячейке 2
  13. 134) 02 // выводим результат на экран (не трудно догадаться, что при любом X будет выводиться 1 :) )
  14. 135) 99 // останавливаем выполнение программы

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

РЕШЕНИЕ ЗАДАЧИ 3:
  1. IN; // запрос на ввод числа X
  2. ST X; // выгрузка числа X из сумматора
  3. ADD X; // к числу X в сумматоре добавляем число X, теперь в сумматоре 2X
  4. ST 2X; // выгружаем число 2X из сумматора
  5. ADD X; // к числу 2X в сумматоре добавляем число X , теперь в сумматоре 3X
  6. ST 3X; // выгружаем число 3X из сумматора
  7. LA 1; // записываем константу 1 в сумматор
  8. ST ONE; // выгружаем число 1
  9. LD 3X; // загружаем число 3X в сумматор
  10. SUB 2X; // вычитаем из 3X(которое находится в сумматоре) число 2X
  11. SUB X; // вычитаем из 3X-2X(которое находится в сумматоре) число X
  12. SUB ONE; // вычитаем из 3X-2X-X(которое находится в сумматоре) число 1
  13. OUT; // выводим результат на экран (не трудно догадаться, что при любом X будет выводиться 1 :) )
  14. HALT; // останавливаем выполнение программы

Задача4. Объясните, какую задачу и как решает следующая программа на Ассемблере:
  1.     in;
  2.     jm   F;
  3.     st   X;
  4.     sub  X;
  5.     sub  X;
  6.  F:  out;
  7.     halt;

Решение:
  1.     in; //запрос на ввод некоторого числа X которое будет загружено в сумматор
  2.     jm   F; // если введенное число отрицательное, то будет произведен условный переход по минусу к строке с меткой F
  3.     st   X; //введённое число (X) выгружается из сумматора
  4.     sub  X; // вычитается из числа в сумматоре (это X) число X (теперь в сумматоре 0)
  5.     sub  X; // вычитается из числа в сумматоре (это 0) число X (теперь в сумматоре -X)
  6. F:  out; // выводится число находящееся в сумматоре
  7.     halt; // останавливается выполнение программы

Таким образом можно сделать вывод, что программа выводит на экран само число если оно отрицательно, либо выводит противоположное число если оно положительно, другими словами выводит только отрицательные числа и ноль

Эдуард, Артём, Довлет

К сожалению, решения этих задач уже были показаны до вас. Но активность и умение оформлять код я учту.
Готовьтесь, через несколько минут для вас появится работа.

Задача1

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

  1. 100)2300232200231000230299

Решение:
  1. 100)23 0023 // загружаем в сумматор число 23
  2. 103)22 0023 // выгружаем содержимое сумматора по адресу 23
  3. 106)10 0023 // прибавляем к сумматору число с адресом 23
  4. 109)02 // выводим содержимое сумматора на экран
  5. 110)99 // остановка

Задача 2

Что выведет МиК-программа на Ассемблере (решение объяснить):

  1. LA 2; //загрузим в сумматор 2 (AX:=2)
  2. ST A; //Запишем значение сумматора в 2-байтовую ячейку "A"
  3. K: SUB A; //Вычтем из суматора 2;
  4. JZ K; //Условный переход по нулю.. Т.к. 2-2 => РП = 0; AX=0; Следующего перехода не будет т.к. 0-2 сформирует -1 в РП.
  5. OUT; //Вывод
  6. HALT; //Остановка

Результаты теста.

Ввести массив, содержащий 10 элементов и вывести в обратном порядке.

  1. 07:12:15 Старт ВМ...
  2. 23 (LA): Загрузка "адреса" в сумматор: 10
  3. 22 (ST): Сохранение из сумматора в адрес 0048
  4. 23 (LA): Загрузка "адреса" в сумматор: 2
  5. 22 (ST): Сохранение из сумматора в адрес 0046
  6. 23 (LA): Загрузка "адреса" в сумматор: 1
  7. 22 (ST): Сохранение из сумматора в адрес 0044
  8. 21 (LD): Загрузка в сумматор 10
  9. 22 (ST): Сохранение из сумматора в адрес 0042
  10. 01 (IN):  Введено значение 1
  11. 22 (ST): Сохранение из сумматора в адрес 0050
  12. 21 (LD): Загрузка в сумматор 50
  13. 10 (ADD): Сложение 50 и 2 | RS= 52
  14. 22 (ST): Сохранение из сумматора в адрес 0126
  15. 21 (LD): Загрузка в сумматор 10
  16. 11 (SUB): Вычитание 10 и 1 | RS= 9
  17. 22 (ST): Сохранение из сумматора в адрес 0048
  18. 30 (JMP): Безусловный переход в адрес 0124
  19. 01 (IN):  Введено значение 2
  20. 22 (ST): Сохранение из сумматора в адрес 0052
  21. 21 (LD): Загрузка в сумматор 52
  22. 10 (ADD): Сложение 52 и 2 | RS= 54
  23. 22 (ST): Сохранение из сумматора в адрес 0126
  24. 21 (LD): Загрузка в сумматор 9
  25. 11 (SUB): Вычитание 9 и 1 | RS= 8
  26. 22 (ST): Сохранение из сумматора в адрес 0048
  27. 30 (JMP): Безусловный переход в адрес 0124
  28. 01 (IN):  Введено значение 3
  29. 22 (ST): Сохранение из сумматора в адрес 0054
  30. 21 (LD): Загрузка в сумматор 54
  31. 10 (ADD): Сложение 54 и 2 | RS= 56
  32. 22 (ST): Сохранение из сумматора в адрес 0126
  33. 21 (LD): Загрузка в сумматор 8
  34. 11 (SUB): Вычитание 8 и 1 | RS= 7
  35. 22 (ST): Сохранение из сумматора в адрес 0048
  36. 30 (JMP): Безусловный переход в адрес 0124
  37. 01 (IN):  Введено значение 4
  38. 22 (ST): Сохранение из сумматора в адрес 0056
  39. 21 (LD): Загрузка в сумматор 56
  40. 10 (ADD): Сложение 56 и 2 | RS= 58
  41. 22 (ST): Сохранение из сумматора в адрес 0126
  42. 21 (LD): Загрузка в сумматор 7
  43. 11 (SUB): Вычитание 7 и 1 | RS= 6
  44. 22 (ST): Сохранение из сумматора в адрес 0048
  45. 30 (JMP): Безусловный переход в адрес 0124
  46. 01 (IN):  Введено значение 5
  47. 22 (ST): Сохранение из сумматора в адрес 0058
  48. 21 (LD): Загрузка в сумматор 58
  49. 10 (ADD): Сложение 58 и 2 | RS= 60
  50. 22 (ST): Сохранение из сумматора в адрес 0126
  51. 21 (LD): Загрузка в сумматор 6
  52. 11 (SUB): Вычитание 6 и 1 | RS= 5
  53. 22 (ST): Сохранение из сумматора в адрес 0048
  54. 30 (JMP): Безусловный переход в адрес 0124
  55. 01 (IN):  Введено значение 6
  56. 22 (ST): Сохранение из сумматора в адрес 0060
  57. 21 (LD): Загрузка в сумматор 60
  58. 10 (ADD): Сложение 60 и 2 | RS= 62
  59. 22 (ST): Сохранение из сумматора в адрес 0126
  60. 21 (LD): Загрузка в сумматор 5
  61. 11 (SUB): Вычитание 5 и 1 | RS= 4
  62. 22 (ST): Сохранение из сумматора в адрес 0048
  63. 30 (JMP): Безусловный переход в адрес 0124
  64. 01 (IN):  Введено значение 7
  65. 22 (ST): Сохранение из сумматора в адрес 0062
  66. 21 (LD): Загрузка в сумматор 62
  67. 10 (ADD): Сложение 62 и 2 | RS= 64
  68. 22 (ST): Сохранение из сумматора в адрес 0126
  69. 21 (LD): Загрузка в сумматор 4
  70. 11 (SUB): Вычитание 4 и 1 | RS= 3
  71. 22 (ST): Сохранение из сумматора в адрес 0048
  72. 30 (JMP): Безусловный переход в адрес 0124
  73. 01 (IN):  Введено значение 8
  74. 22 (ST): Сохранение из сумматора в адрес 0064
  75. 21 (LD): Загрузка в сумматор 64
  76. 10 (ADD): Сложение 64 и 2 | RS= 66
  77. 22 (ST): Сохранение из сумматора в адрес 0126
  78. 21 (LD): Загрузка в сумматор 3
  79. 11 (SUB): Вычитание 3 и 1 | RS= 2
  80. 22 (ST): Сохранение из сумматора в адрес 0048
  81. 30 (JMP): Безусловный переход в адрес 0124
  82. 01 (IN):  Введено значение 9
  83. 22 (ST): Сохранение из сумматора в адрес 0066
  84. 21 (LD): Загрузка в сумматор 66
  85. 10 (ADD): Сложение 66 и 2 | RS= 68
  86. 22 (ST): Сохранение из сумматора в адрес 0126
  87. 21 (LD): Загрузка в сумматор 2
  88. 11 (SUB): Вычитание 2 и 1 | RS= 1
  89. 22 (ST): Сохранение из сумматора в адрес 0048
  90. 30 (JMP): Безусловный переход в адрес 0124
  91. 01 (IN):  Введено значение 10
  92. 22 (ST): Сохранение из сумматора в адрес 0068
  93. 21 (LD): Загрузка в сумматор 68
  94. 10 (ADD): Сложение 68 и 2 | RS= 70
  95. 22 (ST): Сохранение из сумматора в адрес 0126
  96. 21 (LD): Загрузка в сумматор 1
  97. 11 (SUB): Вычитание 1 и 1 | RS= 0
  98. 22 (ST): Сохранение из сумматора в адрес 0048
  99. 33 (JZ): Переход "по нулю" в адрес 0152
  100. 21 (LD): Загрузка в сумматор 70
  101. 11 (SUB): Вычитание 70 и 2 | RS= 68
  102. 22 (ST): Сохранение из сумматора в адрес 0162
  103. 21 (LD): Загрузка в сумматор 10
  104.  
  105. 02 (OUT): Вывод: 10
  106. 21 (LD): Загрузка в сумматор 68
  107. 11 (SUB): Вычитание 68 и 2 | RS= 66
  108. 22 (ST): Сохранение из сумматора в адрес 0162
  109. 21 (LD): Загрузка в сумматор 10
  110. 11 (SUB): Вычитание 10 и 1 | RS= 9
  111. 22 (ST): Сохранение из сумматора в адрес 0042
  112. 30 (JMP): Безусловный переход в адрес 0164
  113. 02 (OUT): Вывод: 9
  114. 21 (LD): Загрузка в сумматор 66
  115. 11 (SUB): Вычитание 66 и 2 | RS= 64
  116. 22 (ST): Сохранение из сумматора в адрес 0162
  117. 21 (LD): Загрузка в сумматор 9
  118. 11 (SUB): Вычитание 9 и 1 | RS= 8
  119. 22 (ST): Сохранение из сумматора в адрес 0042
  120. 30 (JMP): Безусловный переход в адрес 0164
  121. 02 (OUT): Вывод: 8
  122. 21 (LD): Загрузка в сумматор 64
  123. 11 (SUB): Вычитание 64 и 2 | RS= 62
  124. 22 (ST): Сохранение из сумматора в адрес 0162
  125. 21 (LD): Загрузка в сумматор 8
  126. 11 (SUB): Вычитание 8 и 1 | RS= 7
  127. 22 (ST): Сохранение из сумматора в адрес 0042
  128. 30 (JMP): Безусловный переход в адрес 0164
  129. 02 (OUT): Вывод: 7
  130. 21 (LD): Загрузка в сумматор 62
  131. 11 (SUB): Вычитание 62 и 2 | RS= 60
  132. 22 (ST): Сохранение из сумматора в адрес 0162
  133. 21 (LD): Загрузка в сумматор 7
  134. 11 (SUB): Вычитание 7 и 1 | RS= 6
  135. 22 (ST): Сохранение из сумматора в адрес 0042
  136. 30 (JMP): Безусловный переход в адрес 0164
  137. 02 (OUT): Вывод: 6
  138. 21 (LD): Загрузка в сумматор 60
  139. 11 (SUB): Вычитание 60 и 2 | RS= 58
  140. 22 (ST): Сохранение из сумматора в адрес 0162
  141. 21 (LD): Загрузка в сумматор 6
  142. 11 (SUB): Вычитание 6 и 1 | RS= 5
  143. 22 (ST): Сохранение из сумматора в адрес 0042
  144. 30 (JMP): Безусловный переход в адрес 0164
  145. 02 (OUT): Вывод: 5
  146. 21 (LD): Загрузка в сумматор 58
  147. 11 (SUB): Вычитание 58 и 2 | RS= 56
  148. 22 (ST): Сохранение из сумматора в адрес 0162
  149. 21 (LD): Загрузка в сумматор 5
  150. 11 (SUB): Вычитание 5 и 1 | RS= 4
  151. 22 (ST): Сохранение из сумматора в адрес 0042
  152. 30 (JMP): Безусловный переход в адрес 0164
  153. 02 (OUT): Вывод: 4
  154. 21 (LD): Загрузка в сумматор 56
  155. 11 (SUB): Вычитание 56 и 2 | RS= 54
  156. 22 (ST): Сохранение из сумматора в адрес 0162
  157. 21 (LD): Загрузка в сумматор 4
  158. 11 (SUB): Вычитание 4 и 1 | RS= 3
  159. 22 (ST): Сохранение из сумматора в адрес 0042
  160. 30 (JMP): Безусловный переход в адрес 0164
  161. 02 (OUT): Вывод: 3
  162. 21 (LD): Загрузка в сумматор 54
  163. 11 (SUB): Вычитание 54 и 2 | RS= 52
  164. 22 (ST): Сохранение из сумматора в адрес 0162
  165. 21 (LD): Загрузка в сумматор 3
  166. 11 (SUB): Вычитание 3 и 1 | RS= 2
  167. 22 (ST): Сохранение из сумматора в адрес 0042
  168. 30 (JMP): Безусловный переход в адрес 0164
  169. 02 (OUT): Вывод: 2
  170. 21 (LD): Загрузка в сумматор 52
  171. 11 (SUB): Вычитание 52 и 2 | RS= 50
  172. 22 (ST): Сохранение из сумматора в адрес 0162
  173. 21 (LD): Загрузка в сумматор 2
  174. 11 (SUB): Вычитание 2 и 1 | RS= 1
  175. 22 (ST): Сохранение из сумматора в адрес 0042
  176. 30 (JMP): Безусловный переход в адрес 0164
  177. 02 (OUT): Вывод: 1
  178. 21 (LD): Загрузка в сумматор 50
  179. 11 (SUB): Вычитание 50 и 2 | RS= 48
  180. 22 (ST): Сохранение из сумматора в адрес 0162
  181. 21 (LD): Загрузка в сумматор 1
  182. 11 (SUB): Вычитание 1 и 1 | RS= 0
  183. 22 (ST): Сохранение из сумматора в адрес 0042
  184. 33 (JZ): Переход "по нулю" в адрес 0189
  185. 99 (HALT): Остановка ВМ.

ЮРА-тест

Честно говоря, в этой задаче характеризующейся обилием ввода/вывода, разобраться на пользовательском уровне, в том, что вводится и что выводится, весьма затруднительно. Это пример недружественного пользовательского интерфейса (хотя для программиста на стадии отладки, этот формат наверное полезен).
Необходим режим отключения столь безудержного красноречия программы. Если говорить о данной программе реверса, естественно было бы видеть, например:

ВВОД: 1 2 3 4 5 6 7 8 9 10
ВЫВОД: 10 9 8 7 6 5 4 3 2 1

Ну, а по сути - тест пройден с чем Вас, безусловно, можно поздравить.

Поправки в GUI

  1. ВВОД: 1 2 3 4 5 6 7 8 9 10
  2. ВЫВОД: 10 9 8 7 6 5 4 3 2 1

Для этих целей будет уместна эмуляция терминала - как пользователю.
как программисту. - в тесте представлен базовый лог, то есть необходимый минимум для отладки.

..а в подробный лог пишется еще и состояние регистров на шаг... (но это по желанию).

Теперь "cупер"!

Ну,что тут, Юра, скажешь - теперь супер!
Поистине "любой каприз ..."
Если у Вас уже есть Windows-версия, жду на почту для детальной проверки на предмет возможной замены старой версии эмулятора.

Ошибка алгоритма...

Похоже, что в представленном алгоритме имеется ошибка.
В подпрограмме вывода, после безусловного перехода в адрес 0164 начинает выводиться не введенное пользователем значение из адресов [0050...0068], а значение счетчика вывода... (можно заметить так же и по логу)
Результат предыдущего теста оказался верным т.к. введенные значения совпали с значениями "счетчика"

При вводе иных значений
120 121 122 123 124 125 126 127 128 129
выводится
129 9 8 7 6 5 4 3 2 1

--- добавлено позже ---
Решено заменой

  1. 0183 ) 33 0189
  2. 0186 ) 30 0164

на
  1. 0183 ) 33 0189
  2. 0186 ) 30 0161

Хорошо, Юра.

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

Несоответствия

Статья: Основы компьютерной архитектуры пункт Структура памяти МиК

  1. ОП  МиК состоит из 10000 ячеек, пронумерованных  десятичными числами  из диапазона 0000 – 9999......   //10000 опечатка?
  2. .....слово МиК, составляет отрезок  [-7999; 7999].  // Теперь 2 байта [-32768...-32767]

Статья: Программирование в машинном коде

  1. ...в рамках диапазона, составляющего полное адресное пространство  ОП машины  МиК ( 0000 – 9999 );   //несоответствующий действительности диапазон.

По реализации были внесены поправки относительно команд LD, ST (при исполнении команд не генерировалось значение регистра Z)

Юрий

Юрий, в промежутке от 0000-9999 на самом деле 10000 ячеек, так как начиная с 0001-9999 их 9999 а 0000 это 10000-ная ячейка, в других я не понял найденного несоответствия...

Довлет

Речь о МиК -е. Как в официальной реализации = адреса лежат в [0..999] ячеек ОП (никак не 10 000), так и в последующей это не выполняется...

Задание 1

  1. При вводе команды в ассемблер МиК,
  2. МиК считывает ячейку 0023 как число,
  3. после помещает в ячейку 0023 число 0023,
  4. складывает содержимое сумматора с ячейкой  0023,
  5. после выводит число 46
  6. и останавливает программу.

Задача 1

  1. Командой "23" в ячейку 100 загружаем число 0023, после этого командой "22" записываем сумму(с помощью команды "10") двух чисел 0023, затем выводим ответ с помощью команды "02" и останавливаем программу с помощью команды "99"

Задача 2

  1. 200) 22 0100
  2. 204) 10 0100
  3. 207) 22 0103
  4. 210) 10 0100
  5. 213) 22 0106
  6. 216) 23 0001
  7. 219) 22 0109
  8. 222) 21 0106
  9. 225) 11 0103
  10. 228) 11 0100
  11. 231) 11 0109
  12. 234) 02
  13. 235) 99

Ильюхов Александр аватар

Задача №1

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

Объяснение задачи:

  1. 0100) 23 0023  // Запись в сумматор числа 23
  2. 0103) 22 0023  // Пересылка содержимого в сумматоре числа 23 в ячейку с номером 0023
  3. 0106) 10 0023  // Суммирование содержимго сумматора с содержимым в ячейке с номером 0023, в результате будет 46
  4. 0109) 02       // Вывод содержимого сумматора на экран
  5. 0110) 99       // Остановка программы

Ильюхов Александр аватар

Задача №2

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

Запуск программы начинается с адреса 0100:

  1. 094)              // Ячейка для хранения 1
  2. 096)              // Ячейка для хранения X
  3. 098)              // Ячейка для хранения 2X
  4. 100)   23 0001    //S:=1
  5. 103)   22 0094    // СОХРАНЯЕМ 1
  6. 106)   01         //S:=X
  7. 107)   22 0096    // СОХРАНЯЕМ X
  8. 110)   10 0096    //S:=S+X  (S=2X)
  9. 113)   22 0098    // СОХРАНЯЕМ 2X
  10. 116)   10 0096    //S:=S+X  (S=3X)
  11. 119)   11 0098    //S:=S-2X (3X-2X)
  12. 122)   11 0096    //s:=S-X  (3X-2X-X)
  13. 125)   11 0094    //S:=S-1  (3X-2X-X-1)
  14. 128)   02         //ВЫВОД РЕЗУЛЬТАТА
  15. 129)   99         //ОСТАНОВКА

Ильюхов Александр аватар

Задача №3

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

  1. LA 0001;
  2. ST ONE;
  3. IN;
  4. ST X;
  5. ADD X;
  6. ST X2;
  7. ADD X;
  8. SUB X2;
  9. SUB X;
  10. SUB ONE;
  11. OUT;
  12. HALT;

Ильюхов Александр аватар

Задача №4

Задача4. Объясните, какую задачу и как решает следующая программа на Ассемблере:
Программа, после ввода числа, проверяет меньше ли оно нуля. Если введенное число меньше, то программа переходит по метке F к команде вывода этого числа. Если число не меньше нуля, то сохраняет его в ячейку памяти X, и преобразует его в отрицательное (в сумматоре), вычитая его из сумматора дважды, после этого выводит на экран

  1.                  
  2.     in;
  3.     jm   F;  //Переход к метке F, если регистр Z=-1
  4.     st   X;
  5.     sub  X;  //S=0
  6.     sub  X; //S=-X
  7. F:  out;
  8.     halt;

Хорошо, Александр

Единственное но - эти задачи уже решены другими. Но если Вы пропустили их через себя - польза несомненна и можно считать, что к контрольной МиК-тема у Вас отработана.
Тем не менее, одно замечание. Речь о задаче 2. Её не следует решать "в лоб", а можно проще! Подумайте как.

Ильюхов Александр аватар

Другой вариант Задачи №2

Валерий Шахамболетович, вчера, при решении задачи №2, у меня возникло небольшое недопонимание, так как результат функции 3X-2X-X-1 не зависит от X, и поэтому я решил пойти безотказным путем. Спасибо за то, что внесли ясность, написав, что задачу №2 можно решить проще.

Другой вариант решения задачи №2:

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

Выполнение программы начинается с адреса 0100

  1. 098)            // Ячейка для хранения 1
  2. 100)   01       // Ввод в сумматор X (для формальности)
  3. 101)   23 0001  // S:=1
  4. 104)   22 0098  // Сохраняем 1
  5. 107)   11 0098  // S:=S-1  (S=0)
  6. 110)   11 0098  // S:=S-1  (S=-1)
  7. 113)   02       // Вывод результата
  8. 114)   99       // Остановка

Вы дожали!

Вы дожали её, Александр!

Романов Максим аватар

Задача 1

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

  1. Пояснение:
  2. 0100) 23 0023  // Команда записывает число 23 в сумматор
  3. 0103) 22 0023  // Отправление содержимого сумматора в ячейку с номером 0023
  4. 0106) 10 0023  // 23+23=46
  5. 0109) 02       // Вывод сумматора на экран
  6. 0110) 99       // Остановиться

Ильюхов Александр аватар

Спасибо!

Спасибо Валерий Шахамболетович. Рад стараться!