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

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

Комментарии

ВНИМАНИЕ!

Важная информация в последнем моём посте рубрики "Статьи"!

Просьба.

Более одного решения задачи за один раз (в течение, скажем вечера) не выкладывать. Дайте возможность увидеть задания и поучаствовать остальным. Но при этом, можно участвовать в разборе и обсуждении решений, предлагаемых другими.

задача 2

  1. 200) 01  \\вводим X
  2. 201)220100  \\запоминаем х в ячейке
  3. 204)100100  \\   утраиваем
  4. 207)100100    \\   число
  5. 210)220101  \\запоминаем 3х в ячейке
  6. 213)210100   \\заполняем сумматор числом х
  7. 216)100100    \\удваиваем
  8. 219)220102    \\запоминаем 2х
  9. 222)230001    \\записываем в сумматор единицу
  10. 225)220103    \\ запоминаем единицу в ячейке
  11. 228)210101   \\загружаем в сумматор 3х
  12. 231)110102   \\вычитаем 2х
  13. 234)110100    \\вычитаем х
  14. 237)110103    \\вычитаем единицу
  15. 240)02            \\выводим результат
  16. 241) 99            \\стоп
  17.   <\pre>

слеш не в ту сторону(((

слеш не в ту сторону(((

задача 1

командой 230023 в сумматор загрузит число 23
далее 220023 загрузит в ячейку 220023 значение сумматора 23
100023 прибавит значение ячейки 0023 к содержимому сумматора т.е 23+23=46
02 - выведет значение сумматора на дисплей и 99 - остановится
не знаю будет ли считаться то, что я расписал объяснением)

задача 3

мне кажется решение задачи 2 у меня не правильное)с горяча написал. Так что особого смысла писать решения на задачу 3 пока нет. Хотя если будет оцениваться старание то не по ленюсь )

  1.  in;
  2.  st A;
  3.  add A;
  4.  st B;
  5.  add A;
  6.  st C;
  7.  ida 0001 ; уже пошла какая то чушь)что доказывает что решена задача не правильно( но я попытался. извините, Валерий Шахамболетович, если зря отнял у вас время

Киселева Анастасия аватар

Задача 4

  1. Ввод данных;
  2. Команда анализирует содержимое Z и передает управление в F если содержимое Z<0;
  3. Записывает содержимое в память F;
  4. S:=S-X, где S- содержимое сумматора, а X- адрес указанный в адресной части команды, формируется знак Z;
  5. S:=S-X, где S- содержимое сумматора, а X- адрес указанный в адресной части команды, формируется знак Z;
  6. Вывод содержимого F;
  7. Программа останавливается.

Анатолий/Задача2.Поздравляю!

Анатолий/Задача2.Поздравляю!
Есть только тонкий момент. Каждое число занимает ДВА рядом расположенных байта (я назвал это словом). Поэтому, например, команда 22 02 00 запишет информацию в сдвоенную ячейку (слово), образованную адресами 200 и 201 (в этом слове число всегда выравнено по правому краю). Очевидно, следующая СВОБОДНАЯ для записи ячейка, имеет адрес не 201, а 200. В этом у Вас ошибки. Но Вы молодец, задача закрыта, 2 балла Ваши.

Задачу3 Вы почему-то бросили.
Но там не существующая команда ida. Ну, да оставьте её другим.

Киселева Анастасия аватар

Задача 1

командой 230023 в сумматор загрузит число содержащееся в ячейке 23;
командой 220023 в ОП в ячейку 23 копируется содержимое сумматора;
командой 100023 в сумматор записывается значение суммы содержимого ячейки 23 и сумматора;
командой 02 на экран выводится содержимое сумматора;
командой 99 программа останавливается.
Значит МиК напечатает содержимое сумматора после выполнения операции суммы, то есть удвоенное значение содержимого ячейки 23.

Анастасия! В задаче 4

Анастасия! В задаче 4 вычисляется вполне определённая функция. Вы, к сожалению, её не нашли. Да и слова о записи в ячейку F, а затем о выводе из F cомнительны...

В задаче1 у Вас всего 1 досадная неточность, перечёркивающая всё. Найдите её!
В любом случае, как минимум, балл за активность Вы уже заслужили!

Задача1

Задача1 так же закрыта Анатолием.
Анастасия, сравните Ваши решения. Доброй ночи!

Киселева Анастасия аватар

Задача 1 (2 попытка)

командой 230023 в сумматор загрузит число 23 содержащееся в оперативной памяти ;
командой 220023 в ОП копируется содержимое сумматора т. е. число 23;
командой 100023 в сумматор записывается значение суммы 23 и сумматора в котором хранится число 23;
командой 02 на экран выводится содержимое сумматора равное 23+23=46;
командой 99 программа останавливается.
Значит МиК напечатает содержимое сумматора число 46.

задача 2

мне кажется что он ане правильна, потому что для отрицательного числа она не сработает. сначало нужно проверить знак числа и потом если оно отрицательно то для 3Х нужно вычитать, а не прибавлять число)хотя я могу ошибаться. Просто мне не очень понятен момент с регистром Z в этом случае)..а задачу 3 я могу сейчас дописать, если запись ida 0001 возможно. мы же ячейкам даём имена. значит вначале ячейке 0001 нужно обозначить буквой , чтобы к ней обратится. А как это сделать не знаю)

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

А у нас будут лекции по ассемблеру? или мы будем работать только по статьям? прост некоторые моменты в статье непонятны

Настя,Анатолий

По задаче1. Настя, Вы всё же не разобрались с сутью команд загрузки. Первая строка вашего решения (попытка 2) звучит совершенно не верно. Почитайте внимательней описание команд LD и LA
(которую на лекции я обозначил как LDA)

По задаче 2. Редчайший случай, Анатолий, когда студент пытается усомнить преподавателя в правильности своего решения. Настаиваю, Вы решили задачу верно! С учётом, конечно, моего замечания об адресах данных (поняли ли Вы его?).
Теперь по сути. Формула 3X -2X -X -1 должна работать вне зависимости от того, отриц. или полож. число Вы вводите - это вопрос исходных данных, а не программы. Например, при Х=-2, получиться должно -1. Так у Вас всё и работает!

Правда, в задаче ПОДВОХ - она может быть решена значительно проще!

Насчёт Ассемблера. Это - материал для самостоятельного изучения. Ссылки я дал (+ рекомендованный для скачки help-файл ). Я отвечу на Ваш любой вопрос.

Наконец, о команде Lda (Вы упрямо пишите ida), которая (повторюсь!) в МиК интерпретаторе реализована как LA. Используем её так (было не раз показано в примерах на сайте):

  1. ...
  2. LA   1;
  3. ST   ONE;
  4. ...

задача4

1. in(ждем ввода с клавиатуры, введенное переходит в сумматор);
2. jm F(команда анализирует содержимое Z и передает управление по указанной в ней адресом если Z<0);
3. st X(содержимое сумматора копируется в ОП с указанным адресом);
4. sub X(S:= S-A, где А адрес операнда);
5. sub X(S:= S-A, где А адрес операнда);
6. F: out(выводит значение сумматора);
7. halt(stop)(останавливает программу).

задача 2

Тогда ответ всегда будет -1?...вот в этом у меня и появились сомнения)))

Ошибку с адресами я понял))я

Ошибку с адресами я понял))я с самого начала сомневался что пишу их правильно)

LA

спасибо)теперь я понял как решить. Значит я не внимательно читал статьи. Отсавим задачу другим на решение) ведь своё решение я уже предложил. Теперь ведь у всех одна попытка

Олег, Анатолий

Олег, Вы расписали команды, но не ответили на вопрос - какую всё-таки задачу решает программа?
(видите деревья, но не лес!)

Да, Анатолий. Посмотрите дополнения в моём предыдущем посте.

Олег

И где ответ на вопрос какую фунцию выполняет программа?))просто скажи что она выпоняет

ну задача решает пример

ну задача решает пример вычитания

OK, Анатолий.

Вы хорошо поработали. Попробуйте освоить условные команды МиК и их их использование в МЯ и в ассемблере.

Олег, запишите

Запишите формулу, вычисляемую программой.

вопрос

это из какой ячейки берется и какие значения?

освоение условных команд МИК

Освоение будет заключаться в тщательном изучении статьи?

формула sub S:S-A ответ будет

формула sub S:S-A
ответ будет давать(-1)-если результат отрицателен (0)-если результат равен нулю и (1)-если результат положителен

Никаких ячеек и команд, Олег.

Никаких ячеек и команд, Олег. Обычная алгебраическая формула, задающая вычисляемую функцию!

Уметь пограммировать, Анатолий. Почитайте многочисленные обсуждения на этом сайте (форумы, комменты к статьям) и задачи с решениями как в МЯ, так и на Ассемблере.

Бедненко Сергей аватар

ЗАДАЧА 3 (ассемблер Mik)

  1. IN;
  2. ST 100;
  3. ADD 100;
  4. ADD 100;
  5. ST 101;
  6. LD 100;
  7. ADD 100;
  8. ST 102;
  9. LA 1;
  10. ST ONE;
  11. LD 101;
  12. SUB 102;
  13. SUB 100;
  14. SUB ONE;
  15. OUT;
  16. HALT;

По логике так, Сергей.

Пара замечаний.
1. Ошибка распределения памяти. Посмотрите мой комментарий от Сб, 22/09/2012 - 23:37.
2. В Ассемблере используются не только символические КОП, но и символические (не числовые) адреса. Поэтому вместо st 200 следует писать, например, st X;.
Компилятор Ассемблера МиК сам берёт на себя труд распределения памяти под используемые имена (символические адреса). Т.е. в нашем примере, переменной (имени) X будет автоматически назначен конкретный адрес ОП. Читали статью об ассемблере Вы не внимательно.

Бедненко Сергей аватар

Задача 3 (исправление ошибок)

  1. Прошу прощения за ошибки, статью перечитал, ошибки постарался исправить..
  2. IN;
  3. ST A;
  4. ADD A;
  5. ADD A;
  6. ST B;
  7. LD A;
  8. ADD A;
  9. ST C;
  10. LA 1;
  11. ST ONE;
  12. LD B;
  13. SUB C;
  14. SUB A;
  15. SUB ONE;
  16. OUT;
  17. HALT;

Сергей, теперь верно.

Сергей, теперь верно. Осваивайте условные команды (задача4 и другие на этом сайте с применением jmp, jz, jm).

Бовкун Владислав аватар

Добрый вечер Валерий

Добрый вечер Валерий Шахамболетович , у меня есть к вам не большая просьба, пожалуйста , не могли бы вы объяснить по потробней ЯП МИП, или дать ссылку где можно было бы ознакомиться с ним по подробней , заранее спасибо =)

Владислав, я напомнил 3

Владислав, я напомнил 3 основные ссылки в начале этой страницы. И несколько ниже этих ссылок показал где можно скачать интерпретатор МиК и хелп к нему. Там же, в комментариях к названным статьям, а так же на форуме "МиК" масса примеров и обсуждений. Удачи.

1 задача

  1. 23 00 23   загрузка в s числа 23                                
  2. 22 00 23    в 23 ячейке сохранится содержимое S  
  3. 10 00 23   S:=S+Содержимое23 ячейки    
  4. 02             вывод S
  5. 99             Стоп

Задача 2

01 //ввод х
22 //запись х в ячейке 0100
10 //х*2
22 //запись 2х в ячейке 0110
10 //х*3
22 // запись 3х в ячейке 0111
21 // загрузка 0111
11 //0111-0110 или 3х-2х
22 //запись 3х-2х
21 //загрузка 3х-2х
11 //3х-2х-х(0100)
22 //запись 3х-2х-х в ячейке 0201
01 //ввод 1
22 //запись 1 в ячейке 0202
21 //загрузка 0201 (3х-2х-х)
11 //0202 (3х-2х-х-1)
02 //вывод результата
99 // stop

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

Пронумеровала, объясните

Пронумеровала, объясните пожалуйста где ошибка и в смысле красивый код?

1. In;
2. St X;
3. Add X; //2x
4. Add X; //3x
5. St Y;
6. Add Y; //2x
7. St Z;
8. La 1;
9. St one;
10. Ld Y;
11. Sub Z;
12. Sub X;
13. Sub one;
14. OUT;
15. HALT;
end.

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

Задача №4. 1. In; (Ввод) 2.

Задача №4.
1. In; (Ввод)
2. Jm F; (переход по минусу,т.е. передается управление,Z=-1)
3. St X; (содержимое S копируется в ячейку S с указанным адресом)
4. Sub X; (S:=S-A)
5. Sub X; (S:=S-A)
6. F: OUT; (отображение сумматора на дисплей)
7. HALT. (программа останавливается).

Пояснение: если рассматриваемое число отрицательное, то автоматически из пункта 2 перескакиваем в пункт 6 и в конечном итоге заканчиваем программу. А если число неотрицательное, то мы проходим все пункты по списку.
end.

Я не понял вопроса,

Я не понял вопроса, Дмитрий.

Зарина.
Задача2:
1) Требовалось решение на МЯ (машинном языке), а не на Ассемблере.
2) Программа ошибочна. Указать ошибку затруднительно, так как строки не пронумерованы - Вы так и не научились оформлять "красивый код"!
Задача4.
1) Настаиваю, чтобы была указана ФОРМУЛА, значение которой вычисляется. Без этого, решения нет.
2) Опять же, проблема "красивого кода"ю

Зарина...

Зарина, посмотрите здесь то, что Вы упустили.

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

Если не ошибаюсь, случайно не

Если не ошибаюсь, случайно не У=А-2Х? "общая формула"

Ошибаетесь. И что с "красивым

Ошибаетесь.
И что с "красивым кодом", т.е. с умением вместо:
in;
out;
halt;
писать:

  1.     in;
  2.     out;
  3.     halt;

Зарина, Виктория!

Доброй ночи! Утро вечера мудренее!

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

Cпасибо,освою обязательно! .

  1. Cпасибо,освою обязательно!
.

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

Благодарю и вам спокойной

Благодарю и вам спокойной ночи!

задача 4

неужели задачу 4 до сих пор никто не решил))самому интересен ответ. выскажу свои мысли по этому поводу))поскольку программа всегда выводит отрицательное число , то это функция обратная модулю)что то вроде у= -|x| ну или что то близкое к этому

Задача №4

  1.     in;           // Ввод числа с клавиатуры в сумматор.
  2.     jm   F;     // Если число меньше 0, то перейдем на команду с адресом F.
  3.     st   X;      // Значений сумматора записываем в переменную X.
  4.     sub  X;    // Вычитаем. Значение сумматора минус значение переменной X.
  5.     sub  X;    // Вычитаем. Значение сумматора минус значение переменной X.
  6. F:  out;       // Команда с адресом F. Выводит значение сумматора на экран.
  7.     halt;       // Остановка программы.

Только не понятно какую задачу он выполняет. Ясно, что пока число не будет меньше 0 программа не выведет результат на экран. Получается мы из положительного числа делаем отрицательное. Введем 6 получим -6. А если введем отрицательное число, то программа пропустит все операции и сразу выведет его на экран.

Денис, Анатолий

Всё так, Денис, но постом выше, Анатолий сформулирол предельно чётко (в виде формулы, т.е. аналитически) задачу, решаемую данной программой.

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

Задача №1. Командой 23 0023 в

Задача №1.

  1. Командой 23 0023 в S копируется число,указанное в качестве адресной части данной команды, т.е. 23.
  2. Команда 22 0023 записывает в ОП содержимое S.
  3. Командой 10 0023 добавляется к содержимому S само же число 23. Получается в итоге 46.
  4. Командой 02 происходит отображение содержимого S на дисплей.
  5. Команда 99 останавливает программу.

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

Задача №2. 0000) 01 0001) 22

Задача №2.

  1. 0000) 01
  2. 0001) 22 0600
  3. 0004) 10 0600
  4. 0007) 10 0600
  5. 0010) 22 0700
  6. 0013) 21 0800
  7. 0016) 10 0800
  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. 0041) 99