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

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

Комментарии

Сб, 29/09/2012 - 23:14 - это

Сб, 29/09/2012 - 23:14 - это верно, Анатолий. А вот СМЫСЛ меток a,b так до конца не прояснён.
Зарина, ЕЩЁ ВНИМАТЕЛЬНЕЙ ПРОЧИТАЙТЕ УКАЗАННЫЙ МНОЮ ПОСТ.

Зарина, переписал для Вас!

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

СМЫСЛ меток a,b так до конца не прояснён.

Я не пойму что от меня требуется. что нужно исправить?

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

как я поняла,нам надо

как я поняла,нам надо выразить смысл этих команды УЖЕ СУЩЕСТВУЮЩИМИ???

Зарина

Правильно поняла).

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

Переход по плюсу. Вместо

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

пытался получить от Вас что-то типа:
  1. ........
  2. jz Continue;;
  3. jm Continue;
  4. jmp А;
  5. Continue: .....
  6. ...

где смысл и место метки Continue чётко определены. Невнимательно изучили мой пример с Jnz !

Да, Зарина. А Вы упрямо

Да, Зарина. А Вы упрямо вписываете "команду" jp. Перечитайте условие!

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

  //Реализация логики

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

????

Continue

если бы я понимал что это ошибка. я думал думал что главное то что мы переходим в А по заданному условию. а куда ссылаю команды jz и zmp не важно)только сейчас понял что по моему описанию b c могли стоять выше)зато теперь буду знать что это важно

Да, в Сб, 29/09/2012 - 23:45

Да, в Сб, 29/09/2012 - 23:45 дано уже это решение. Правда Вы внесли в него неточность - меткой Сont должен быть помечен оператор, НЕПОСРЕДСТВЕННО следующий за Jmp M; (6-я строчка ошибочна)

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

  //Реализация логики

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

Вот так?

Анатолий...

В решении должен быть только один варьируемый (т.е. свободно выбираемый) параметр - место, куда передаёт управление моделируемая нами команда Jp A. Это место обозначается меткой A и может быть в программном тексте где угодно. Всё остальное должно быть полностью определено. В моём решении метка Continue имеет строго определённую позицию, которую Вы изменять не можете. В таком виде приведённый мною фрагмент я всегда могу вставить в любой программный текст, где требуется команда Jp A.

Спасибо. Я всё понял. В

Спасибо. Я всё понял. В следующих решения не должно быть ошибок. всем спокойной ночи.

Зарина...

Не минус означает плюс или ноль. Поэтому вот так:

  1. ...
  2. Jm Cont; //если минус, то на продолжение ...
  3. Jmp M; // если плюс или ноль, т.е. не минус, перейти на метку M
  4. Cont: ...  //здесь продолжение данного сегмента
  5. ...

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

Все поняла) мое решение-это

Все поняла) мое решение-это скорее переход по плюсу...

Да, Зарина. Ваш последний

Да, Зарина. Ваш последний вариант тянет на переход по плюсу.
Доброй ночи!

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

Кстати,поздравляю всех с днем

Кстати,поздравляю всех с днем великого интернета в России))
И Спокойной ночи)

Теперь все понятно:-) жаль,

Теперь все понятно:-) жаль, что не додумалась до этого раньше. Всех с праздником! Валерий Шахамболетович, ждем следующих ваших заданий:-)

Панова Ксения аватар

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

Валерий Шахамболетович, а если задача в аттестационном тесте будет решена правильно, но не доведенна,не уменьшенна до более краткого вида, вы посчитаете это как ошибку?

ДОБРЫЙ ВЕЧЕР!

Ксения! Не посчитаю, но балл может не быть максимальным.

Попробуем поразрядную целочисленную арифметику.
Задача. Пусть var a: Integer; (в Делфи занимает 32 бита). Что и, главное, почему выведет следующая Делфи Паскаль программа:

  1. ...
  2. a:=1;
  3. Writeln (a shl 31)

Никита Ширшов аватар

Решение...

программа выведет число: 2 в степени 31....

Почему мы должны Вам верить?

Почему мы должны Вам верить? Где обоснование? Вы проверили свой ответ на компьютере?

Никита Ширшов аватар

это из лекции...

Сдвиг влево на n позиций, означает умножение числа на 2 в степени n, то есть: 1*2 в степени 31 <=> 2 в степени 31 (в нашем случае n=31)

Боюсь, всё не так просто,

Боюсь, всё не так просто, Никита...

Никита Ширшов аватар

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

единица определяет знак, (знак будет"-") и тогда программа выведет число: - 2 в степени 31...

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

Так как в Делфи число

Так как в Делфи число занимает 32 бита, то получается число=>31 нулей и 1. При выполнении команды а shl 31 у нас получится =>1 и 31 нулей. А при переводе этого числа в 10-чную
систеу счисления, мы получаем число 2147483648,т.е. 2 в 31 степени.

Всем спать!!!

Всем спать!!!

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

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

Да, Андрей.

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

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

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

Хиштова Карина аватар

ассемблер

Валерий Шахамболетович, скажите пожалуйста, на ассемблере допускается такое оформление команды, как например: st 2x; ?

Нет, Карина, нельзя в

Нет, Карина, нельзя в ассемблере писать st 2x;
Ведь в адресной части команды может стоять только идентификатор (см.лекцию).

Хиштова Карина аватар

спасибо! я в принципе и сама

спасибо! я в принципе и сама так думала, но решила перепроверить.

Петросянц Анастасия аватар

Задача 1

Задача 1

Программа напечатает число 46. Запишем программу в удобном для восприятия виде:

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

Можно ли добавить решение остальных задач? Все равно их никто не решает

Вы правы, Настя, программа

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

Тренировочные задачки.

Задача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;

Станислав Малявкин аватар

жаль. ничего не успел делать...=(

жаль. ничего не успел делать...=( все уже сделали...

Петросянц Анастасия аватар

Всех с праздником!

Поздравляю всех с днем программиста)

Анастасия Кузнецова аватар

Задача 4.

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

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

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

  1. 0300)?            //выделим ячейку для Х
  2. 0302)01           //вводим Х с клавиатуры
  3. 0303)34 0315      //передаем управление ячейке 315, если текущий ПР<0
  4. 0306)22 0300      //сохраняем Х в ячейке ОП под номером 300, при этом Х остается в S
  5. 0309)11 0300      //отнимаем Х, результат сохраняется в S
  6. 0312)11 0300      //отнимаем Х, результат сохраняется в S
  7. 0315)02           //вывод результата из S на дисплей
  8. 0316)99           //остановка

Демченко Маргарита аватар

Задача 2.

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

  1. 0100) ?                //  резервировано для x
  2. 0102) 01             //  вводим x с клавиатуры
  3. 0103) 22 0100  // сохраняем x в ячейке 0100
  4. 0106) 10 0200   //   2x в сумматоре
  5. 0109) 10 0200  //    3x в сумматоре
  6. 0112) 22 0201  //    запоминаем 3x в ячейке 0201
  7. 0115) 21 0200  //    загружаем в сумматор число x
  8. 0118) 10 0200  //    в сумматоре 2x
  9. 0121) 22 0202  //    загружаем в ОП 2x
  10. 0124) 23 0001  //    загружаем в сумматор 1
  11. 0127) 22 0203  //    запоминаем в ячейке 0203 единицу
  12. 0130) 21 0101  //    загружаем в сумматор 3x
  13. 0133) 11 0202  //    вычитаем 2x
  14. 0136) 11 0200  //    вычитаем x
  15. 0139) 11 0203  //    вычитаем единицу
  16. 0140) 02           //    выводим результат
  17. 0141) 99           //    стоп

Демченко Маргарита аватар

Задача 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;    //  стоп

Анастасия Кузнецова аватар

Задача2. Ошибка, Маргарита!

Здравствуйте, Маргарита! У Вас имеются ошибки в написании алгоритма. А именно: вы ввели Х, сохранили его в ячейке 100, и вдруг откуда-то в ячейке 200 у Вас материализовался этот самый Х (4 шаг), и далее вы прибавляете его к ячейке 100 и продолжаете работать с двухсотыми ячейками. Вы ведь не сохраняли Х в ячейку ОП под номером 200, откуда ему там взяться? Так с самого начала появляется ошибка, которая потом цепочкой тянется через весь алгоритм, в итоге он работает совершенно не так, как требуется. Вы не проверяли алгоритм в интерпритаторе МиК? Если бы проверили, заметили бы, что алгоритм выдает неверный ответ. Похожая ошибка имеется, когда вы загружаете в сумматор 3х из 101 ячейки (12 шаг), хотя ранее сохраняли произведение в ячейку 201. Значение переменной мы можем загружать только из той ячейки, в какую "положили" его предыдущими операциями, в других, совершенно "левых" ячейках его просто не будет, и алгоритм будет работать с ошибками, если вообще будет работать.
Так же имеется ошибка на 15-ом шаге. Под команды фомата F1 (в данном случае это 11 0203) отводится три байта памяти, или три ячейки (так как в МиК одна ячейка - один байт), значит следующий шаг должен был начинаться со 142-ой ячейки. Ну тут я думаю просто описка, поскольку похожих ошибок вроде больше нет, Вы наверное торопились, да и судя по всему время уже позднее было)

Хиштова Карина аватар

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

Валерий Шахамболетович! Проверьте пожалуйста, правильно ли я оформила домашнюю задачу 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, и где тест будет