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

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

Комментарии

Бойко Валерия аватар

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

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

Путилин Максим аватар

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

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

  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; // останавливаем программу;

Киржинов Довлет аватар

Решение задач 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