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

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

Комментарии

спасибо я поняла как это

спасибо я поняла как это делается))))

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;

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

пробел убери

пробел убери

А где ссылка на тест? я

А где ссылка на тест? я что-то не могу найти

да, где тут можно найти эти

да, где тут можно найти эти задачи, уже 22:00?

LD 1; OUT; HALT;

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

все ждете? или я один не

все ждете? или я один не пойму куда зайти?

Кто нашел задачи ?

Кто нашел задачи ?

Ребята без панике.

Скорее всего задачки скоро будут, ждем)

ты не один))

ты не один))

ждем)

ждем)

я нашла

я нашла

Терпение

Все ждут:) задач ещё по видимому нет:)

ВНИМАНИЕ!

Задачи в рубрике "Статьи". СТАРТ!

учитель я вам все задания

учитель я вам все задания пресылаю на почту) посмотрите их

программа находит остаток от деления

Программа находит остаток от деления

  1. In; // вводим делимое
  2. St x; // сохраняем введенное число
  3. In; // вводим делитель
  4. St y; // сохраняем введенное число
  5. L1: Ld x; // загружаем делимое в сумматор
  6. Sub y; // отнимаем делитель
  7. St x; // сохраняем полученный результат
  8. Cmp y; // сравниваем полученный результат с делителем
  9. Jm L2; // если делитель больше чем полученный результат
  10. Jmp L1; // если делитель меньше чем полученный результат, то повторяет цикл с L1
  11. L2:Ld x; // загрузка остатка в сумматор
  12. Out; // вывод остатка
  13. Halt; // конец программы

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

Здравствуйте! В.Шахамболетович посмотрите, есть ли замечания по оформлению задачи "а(в кубе) +b(в кв.)+с"

  1. Program Summa;
  2. Var a,b,c,s,w,q: Integer;
  3. Begin
  4.  write ('a='); // вводим переменную "а" с клавиатуры
  5.  readln (a); // считываем "а"
  6.  write ('b='); // вводим переменную "b" с клавиатуры
  7.  readln (b); // считываем "b"
  8.  write ('c='); // вводим переменную "c" с клавиатуры
  9.  readln (c); // считываем "c"
  10.  s:= a*a*a; // в "s"  записываем значения умножения (имитируем возведения в куб)
  11.  w:= b*b; // в "w" записываем значения умножения (имитируем возведения в квадрат)
  12.  q:= s+w+c; // в "q" записываем значения суммы переменных
  13.  write (s,'+',w,'+',c,'=',q); // выводим на экран результат
  14.  readln; // считываем результат
  15. End.

УДАЛЕНО БЕЗ ПРОЧТЕНИЯ, НЕ

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

Рустэм

В целом верно, но есть пару замечаний:
1. Write- оператор вывода !Поэтому вместо конструкции:

  1.  ...
  2.  write ('a='); // вводим переменную "а" с клавиатуры
  3.  readln (a); // считываем "а"
  4.  ...

Правильней было бы написать так:
  1.  ...
  2.  write ('a=');
  3.  readln (a); // ввод а
  4.  ...

2. Последний Readln явно лишний

Если использовать 3 переменные то , получится следующий код:

  1. Program Summa;
  2.  Var a,b,c:Integer;
  3. Begin
  4.  write ('a=');
  5.  readln (a); // ввод a
  6.  write ('b=');
  7.  readln (b); // ввод b
  8.  write ('c=');
  9.  readln (c); //ввод с
  10.  write (a*a*a,' + ',b*b,' + ',c,' = ',a*a*a+b*b+c); // вывод результата
  11. End.

Спасибо.

Я тут конечно раскидался переменными, в следующий раз буду писать компактнее)

Тимур

нужно научится отправлять 'красивый' код
< pre>
код
< /pre>
после знака < пробел не нужен !!!

Попробуй отправить код, следующего содержания:

  1. program exmpl;
  2. begin
  3.  Writeln('Hello World');
  4. end.

Здравствуйте Валерий Шахамболетович

Здравствуйте Валерий Шахамболетович, проверьте пожалуйста пример а^3+b^2+c

  1. program Sum;  // заголовок программы
  2.     var a,b,c,s: Integer;    // описание переменных
  3. begin
  4.     write('a=');  // вводим с клавиатуры  "a"
  5.     readln(a);   //  считает a
  6.     write('b=');  // вводим с клавиатуры  "b"
  7.     reabln(b);  // считает b
  8.     write('c=');  // вводим с клавиатуры  "c"
  9.     readln(c);   // считает с
  10.     a:=a*a*a; // присваиваем а^3  а
  11.     b:=b*b    // присваиваем b^2  b
  12.     s:=a+b+c; //  сумма переменных
  13.     writeln(a,'+',b,'+',c'='s); // вывод на экран
  14.     readln;  // считает результат
  15. end.

Тимур

1.Прочти замечания , адресованные Рустэму;
2. В строке 11 пропущен знак ';';
3.В строке 13 пропущены знаки ','
Правильно вот так:

  1.  writeln(a,'+',b,'+',c,'=',s); // вывод на экран

Спасибо.Следующий раз буду

Спасибо.Следующий раз буду писать внимательнее.

Вопросы по Паскалю задаем

Вопросы по Паскалю задаем здесь

Задача 1

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

Программа выводит у=2х.

Задача 2

  1. 200) 01 // Х
  2. 201) 22 0100 // сохраняем Х
  3. 204) 10 0100 //Х+Х (2Х)
  4. 207) 22 0103 // сохраняем 2Х
  5. 210) 10 0100 // 2Х+Х=3Х
  6. 213) 22 0106 //сохраняем 3Х
  7. 216) 23 0001 // создаём число 1
  8. 219) 22 0109 // сохраняем его
  9. 222) 21 0106 // загружаем 3Х
  10. 225) 11 0103 // 3Х-2Х
  11. 228) 11 0100 // 3Х-2Х-Х
  12. 231) 11 0109 // 3Х-2Х-Х-1
  13. 234) 02 // вывод
  14. 235) 99 //стоп

Исправил. Опечатался в третьей строчке вместо 0100 было 0103

Задача 3

  1. in; // Х
  2. st x; // сохраняем Х
  3. add x; //Х+Х (2Х)
  4. st y; // сохраняем 2Х
  5. add x; // 2Х+Х=3Х
  6. st z; //сохраняем 3Х
  7. la 1; // создаём число 1
  8. st d; // сохраняем его
  9. ld z; // загружаем 3Х
  10. sub y; // 3Х-2Х
  11. sub x; // 3Х-2Х-Х
  12. sub d; // 3Х-2Х-Х-1
  13. out; // вывод
  14. halt; // стоп

Задача 4

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

Задача 4

Если число отрицательное, либо равно нулю, программа выведет его без изменения. Если же число положительное, программа выведет это число с минусом.
Код ASM

  1. IN;
  2. ST X;
  3. LA 0;
  4. SUB X;
  5. JM TO_OUT;
  6. LD X;
  7. TO_OUT:OUT;
  8. HALT;

На машинном:

  1. 00) ? // reserve 16bit for X
  2. 02) 01     //AX:=X;
  3. 03) 22 0   //X:=S;
  4. 06) 23 0  //AX:=0;
  5. 09) 11 0  //AX:=AX-X;
  6. 12) 34 0018  //if W=-1 then jump to out
  7. 15) 21 0   //AX:=X;
  8. 18) 02    //out AX;
  9. 19) 99    //halt;

Да, Юрий!

Задача 4 - её можно записать математически:
Y= -|X|

Задача 1

23 0023 - команда 23(la) записывает в сумматор число равное адресу ( в нашем случае 23)
22 0023 - команда 22(st) записывает в ячейку с адресом 0023 содержимое сумматора
10 0023 - команда 10(add) добавляет к содержимому сумматора число находящееся по адресу 0023
02 - команда 02(out) выводит на дисплей содержимое сумматора
99 - команда 99(halt) останавливает программу

Эдуард!

1. Программа не верно записана:
A) Не указано (не повторено) условие задачи;
B) Не указаны адреса команд;
C) Код не оформлен "красиво"

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

"КРАСИВЫЙ КОД"

Решение публикуемых здесь задач и вообще любая активность на сайте может вознаграждаться дополнительными бонусными баллами.
Но при этом необходимо соблюдать ряд ОБЯЗАТЕЛЬНЫХ правил (которые не выполнил в предыдущем посте Эдуард (наверное по их незнанию)).

Если Вы публикуете программный код, то:

1) Укажите УСЛОВИЕ решаемой задачи, чтобы все могли, не лазая по сайту легко понять о чём, собственно идёт речь.
Если задача была где-то опубликована, то проще всего это сделать копированием условия

2) Научитесь оформлять "КРАСИВЫЙ КОД".
Это совсем несложно. Просто заключите Ваш код между двумя тегами указав < code> - в самом начале перед оформляемым кодом
и указав < /code> - в самом конце, после кода.

При этом пробелы внутри тегов не ставить ! (у меня они есть, чтобы теги не сработали и Вы бы смогли их сейчас увидеть).
Вот пример, который я прошу вас повторить.
Запишите и пришлите мне в качестве поста буквально следующее:

Это первая строчка, она не оформлена как "красивый код"
< code>
А здесь уже пошла первая строка с кодовым оформлением
И вторая строка
И третья ...
< /code>
Здесь мы уже за пределами кодового блока.

Кстати, вместо cлова code в тегах можно использовать слово pre. Копируйте и присылайте, не забыв удалить пробелы после открывающей угловой скобки в записанных мною тегах. Результат вам понравится!

задача номер 2

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

  1. 100)23001 //вводим константу;
  2. 103)22098 //выгружаем в ячейку 0098;
  3. 106)01 //вводим х;
  4. 107)220094 //выгружаем в ячейку 0094;
  5. 110)100094 //добавляем х для получения 2х;
  6. 113)22096 //выгружаем 2х в ячейку 0096;
  7. 116)100094 //добавляем х для получения 3х;
  8. 119)110096 //вычитаем 2х;
  9. 122)110094  //вычитаем х;
  10. 125)110098 //вычитаем 1;
  11. 128)02 //выводим значение сумматора;
  12. 129)99 //конец программы;

вот вроде и все.

задача номер 1

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

  1. 100)2300232200231000230299

решение:
230023 - загружается в сумматор число 23
220023 - в ячейку 23 выгружается выгружается значение сумматора( то есть чсило 23)
100023 - к сумматору прибавляется значение ячейки 23(получается 23+23)
02 - выводится значение сумматора (46)
99 - конец программы

задача номер 3

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

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

задача номер 4

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

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

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

Д/з

Задача: Дано n [1..19]. Вывести последнюю цифру числа

ASM

  1. IN;
  2. ST BX;
  3. LA 10;
  4. SUB BX;
  5. JM if_neg;
  6. LD BX;
  7. to_end:OUT;
  8. halt;
  9. if_neg:ST BX;
  10. LA 0;
  11. SUB BX;
  12. JMP to_end;

МЯ

  1. 0)  //reserve for BX;
  2. 2) 01;
  3. 3) 22 0;   // BX:=S;
  4. 6) 23 10; // S:=10;
  5. 9) 11 0;  // S:=S-BX;
  6. 12) JM 20; //if_neg then go to 20;
  7. 15) 21 0;  //S:=BX;
  8. 18) 02;   //label finish...
  9. 19) 99;
  10. 20) 22 0;  //if_neg then begin BX:=S; S:=0; S:=S-BX; goto finish end;
  11. 23) 23 0;  //S:=0;
  12. 26) 11 0;  //S:=S-BX;  i.e.-BX
  13. 29) 30 18; //goto finish

И оптимизированный вариант - через сравнение (cmp)
ASM

  1. LA 10;
  2. ST BX;
  3. IN;
  4. CMP BX;
  5. JM if_neg;
  6. sub BX;
  7. if_neg:out;
  8. halt;

МЯ

  1. 00)   //reserved for BX;
  2. 02) 23 10; //S:=10;
  3. 05) 22 0; //BX:=S;
  4. 08) 01;
  5. 09) 12 0; //ПР:=BX-10;
  6. 12) 34 18; //if пр=-1 then goto to_out;
  7. 15) 11 0; //S:=S-10;
  8. 18) 02; //to_out;
  9. 19) 99; //end.

Асфар, Юрий

Практически без вопросов, молодцы.
И два варианта (неоптимальный/оптимальный), Юрий, тоже в точку. Маленькое замечание - считается плохим тоном останавливать программу не в её конце.
За активность и результативность, получите оба по 2 балла!

И, Юрий. Давайте уже вернёмся к Вашему настоящему имени. Пошлите заявку повторно. Сделайте это быстро, предстоит работа.

ВНИМАНИЕ! Чтобы освободить Ваш почтовый ящик, ваш текущий аккаунт я сейчас удаляю!

Задача 1 Задача1. Что

Задача 1

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

  1. 100)2300232200231000230299

1)230023: в сумматор записывается число 23
2)220023: в ячейку 23 выгружается значение сумматора (число 23)
3)100023: значение сумматора складывается со значением ячейки 23 т.е S:=S+23;
4)02: выводим значение сумматора (число 46)
5)99: останавливаем программу

Задача 1

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

  1. 100)2300232200231000230299

23 0023 - загружаем число 23 в сумматор;
22 0023 - в ячейку по адресу 0023 выгружаем значение сумматора;
10 0023 - прибавляем к сумматору значение ячейки 0023 (то есть 23+23);
02 - выводится на дисплей значение сумматора (46);
99 - остановка программы.

Задача2

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

  1. 100)23 001 // в сумматор копируется число 1;
  2. 103)22 094 // записываем значение сумматора (1) в ячейку 094;
  3. 106)01 // вводим x;
  4. 107)22 098 // записываем значение х по адресу 098;
  5. 110)10 098 // добавляем х, получаем 2х в сумматоре;
  6. 113)22 096 // записываем значение 2х в ячейку 096;
  7. 119)10 098 // добавляем х, получаем 3х в сумматоре;
  8. 122)11 096 // вычитаем 2х;
  9. 125)11 094 // вычитаем 1;
  10. 128)02 // выводим на дисплей значение сумматора;
  11. 129) 99 // останавливаем программу;

Задача 2

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

Решение:

  1. 0006)230001 // Создаем число 1;
  2. 0009)220000 // Число 1 выгружается в ячейку 0000;
  3. 0012)01 // Вводится наше число X;
  4. 0015)220002 // Выгружаем в ячейку 0002;
  5. 0018)100002 // Складываем с сумматором,чтобы получить 2X;
  6. 0021)220004 // Выгружаем 2X в ячейку 0004;
  7. 0024)100002 // Прибавляем к сумматору число X и получаем 3X;
  8. 0027)110004 // Из сумматора вычитаем 2X;
  9. 0030)110002  // Из сумматора вычитаем X ;
  10. 0033)110000 // Из сумматора вычитаем 1;
  11. 0036)02 // Выводим значение сумматора;
  12. 0037)99 // Останавливаем программу;

А вообще можно было бы привести подобные, а в программе просто выводить число -1

Задача3

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

  1. la 1;
  2. st x1;
  3. in;
  4. st x;
  5. add x;
  6. st x2;
  7. add x;
  8. sub x2;
  9. sub x;
  10. sub x1;
  11. out;
  12. halt;

Задача 3

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

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

Задача4. Объясните, какую

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

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

Решение. Данная программа преобразует число X в (-X) если оно положительно, или оставит X если оно отрицательно или 0.
Подробнее:

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

Задача 4

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

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

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