Основы компьютерной архитектуры

Наиболее популярной архитектурной базой  современных компьютеров является, так называемая, фон Неймановская архитектура, суть которой  сводится к следующим трём основным принципам:

  • Принцип программного управления;
  • Принцип адресности;
  • Принцип однородной памяти.

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

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

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

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

Основу аппаратной архитектуры МиК, как показано на схеме, составляют процессор, оперативная память (ОП), состоящая из некоторого числа прямо адресуемых ячеек и периферийные  устройства – клавиатура (Kbd) и дисплей (Dsp).

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

Рассмотрим теперь более подробно структуру процессора и ОП  машины МиК.

Для реализации встроенного аппаратного алгоритма выполнения команд, процессор МиК содержит два подблока: УУ – устройство управления и АЛУ – арифметико-логическое устройство.

УУ выполняет административные функции и имеет в своём составе два регистра сверхбыстрой памятирегистр адресов (РА) и регистр команд (РК).

В ходе выполнения программы, РА всегда содержит адрес (указание на место размещения в ОП)  текущей   команды,  т.е. той команды программы, которая подлежит исполнению в рассматриваемый момент времени. В частности, предполагается, что перед началом выполнения (запуском) программы, адрес первой её команды, возможно, вручную, размещается в РА.

Сама текущая  команда, для её анализа и организации исполнения, предварительно копируется  из  ОП в  РК.

АЛУ предназначено, собственно, для осуществления операций “заказываемых” УУ и включает в себя три регистра сверхбыстрой памяти: рабочий регистр (R1), особый  регистр, называемый сумматором (S)  и специальный регистр признака результата (Z).

Исходные данные  к очередной операции готовятся в регистрах  S и R1, а результат,   записывается в  S.

Помимо этого, основного результата в регистре S, некоторые команды, в регистре Z, формируют признак результата (ПР) – целое число   –1, 0, или 1, выбираемое в зависимости от того, является ли результат выполненной операции отрицательным, нулевым или положительным, соответственно. Анализируя ПР, так называемые, команды условного перехода могут, в некоторых случаях, нарушать естественный порядок выполнения команд программы (т.е. порядок, соответствующий порядку их последовательного размещения в ОП), реализуя, тем самым, разветвления и циклы.

 Структура памяти МиК

ОП  МиК состоит из 10000 ячеек, пронумерованных  десятичными числами  из диапазона 0000 – 9999.  Ячейки называются байтами, а их номера - адресами. Каждый байт в определённый момент времени может находиться в одном из 100 различных состояний, кодируемых двузначными  числами 00, 01, … 99.

Любые два байта с последовательными адресами составляют более крупную единицу памяти – машинное слово. При этом, адресом слова считается адрес первого из этих двух байтов (т.е. меньший адрес).

Например, два байта с адресами  0186 и 0187 образуют машинное слово, имеющее адрес 0186.

Слова используются для хранения единственного вида данных МиК - целых десятичных чисел. Не интересуясь деталями принятого при этом способа кодирования, будем предполагать, что полное множество  целых чисел, любое из которых может быть записано в машинное слово МиК, составляет отрезок  [-7999; 7999].

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

Форматы команд МиК

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

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

В МиК используются два формата машинных команд –  одноадресный и нольадресный, обозначаемых, соответственно, как F1 и F0.

 Команды 1-адресного формата (формата F1) занимают три байта и имеют следующую структуру:

В этой структуре,  “КОП” –  Код ОПерации (двузначное неотрицательное целое число, занимающее первый байт );

А” -  адрес слова ОП (четырёхзначное неотрицательное целое число, которое занимает следующие два байта).

Большая часть команд  данного формата выполняется по схеме  S:=S @ А,  где ":=" имеет смысл присваивания, а  "@" - соответствующая заданному значению “КОП”  произвольная, двуместная операция  МиК (такая, например, как сложение или вычитание).  Т.е., используя в качестве операндов (участников операции) два числа, выбранных, соответственно, из сумматора и из слова ОП с адресом A,  любая команда, отвечающая этой схеме, выполнит операцию @ и запишет полученный результат в  сумматор, замещая его прежнее содержимое.

При этом, значение слова по адресу А непосредственно перед операцией автоматически будет скопировано в R1. Ни содержимое регистра R1, ни содержимое слова с адресом А в результате операции не изменятся.

Например, команда формата F1  “10 0572”  означает: сложить (код операции сложения - 10) содержимое сумматора с числом, выбираемым по  адресу  0572; полученную сумму записать в сумматор на место первого из использованных слагаемых, т.е. в сумматор.

 Команды 0-адресного формата (формата F0)  состоят только  из кода операции и,  занимая в памяти по одному байту,  имеют тривиальную структуру:

Отсутствие адресной части в любой такой  команде означает, что соответствующая операция либо вообще не требует операндов, либо её  операнды представлены регистрами, однозначно фиксированными для этой операции.

Например, команда "02"  означает:  вывести (код операции вывода - 02) число из сумматора на дисплей или, в обозначениях Паскаля, выполнить присваивание RDsp := S (здесь, RDsp понимается как фиксированное имя специальной регистровой переменной, связанной с дисплеем так, что любое присваивание значения этой переменной приводит к отображению присвоенного значения на экране дисплея).

Система команд МиК   

            Рассмотрим теперь полную систему команд  машины МиК. При этом, описывая команды, наряду с числовыми их кодами операций, будем приводить также  мнемонические (cмысловые) обозначения этих кодов.

Начнём с команд формата F0. Их всего три.

 1. Команда ввода (коп - 01, мнемоника – ‘in’)  работает так. В начале её выполнения, выдаётся запрос  на ввод данных с клавиатуры, а именно, в качестве приглашения на выполнение ручных операций, на дисплей, автоматически выводится строка, содержащая в первой своей позиции  мигающий курсор. Далее, выполнение команды приостанавливается в ожидании действий оператора (человека, работающего с программой).

После набора на клавиатуре вводимого числа (по мере набора, оно отображается на экране дисплея ) и нажатия клавиши Enter, набранное число копируется (загружается) в сумматор, и выполнение команды на этом завершается . На основе введённого значения,  в зависимости от его знака  (см. выше)  формируется ПР.

Подобно тому, как информационный обмен между сумматором и дисплеем осуществляется через специальный регистр RDsp   (см. выше), обмен между сумматором и клавиатурой предполагает использование другого специального регистра – RKbd : информация о набираемом на клавиатуре числе попадает в RKbd , а затем, после нажатия “Enter”, - копируется в сумматор.

 2. Команда вывода (коп - 02,  мнемоника – ‘out’). Она двойственна команде ввода и в результате своего выполнения  показывает содержимое сумматора, отображая   его на экран дисплея. На основе выводимого значения здесь также формируется ПР.

 3. Команда останова (коп - 99,  мнемоника -  ‘halt’) просто останавливает процесс выполнения той программы, в которой она была выполнена.

Команд формата F1 - девять. Вот они.

 1. Команда сложения (коп - 10, мнемоника – ‘add’). Добавляет к содержимому сумматора число, выбираемое из слова с указанным в команде адресом А. Сумма записывается в сумматор и на её основе в регистре Z  формируется  ПР.

 2. Команда вычитания (коп - 11, мнемоника – ‘sub’). Вычитает из содержимого сумматора число, выбираемое из слова с указанным в команде адресом А. Разность записывается в сумматор и на её основе в регистре Z  формируется  ПР.

 3. Команда сравнения (коп - 12, мнемоника – ‘сmp’). Выполняется также, как и вычитание, но при этом разность нигде не сохраняется. Команда применяется только для формирования ПР, в зависимости от значения которого, одна из последующих команд условного перехода (см. ниже) может изменить естественный порядок выполнения команд.

 4.  Команда загрузки  (коп - 21, мнемоника – ‘ld’). В сумматор из ОП копируется (загружается)  содержимое слова, имеющего указанный в команде адрес А. На основе загруженного  значения, в регистре Z  формируется  ПР.  Например, если по адресу  0456 хранится число  -55, то в результате выполнения команды “21 0456”, в регистр S будет записано число  -55, а в регистр Z – число  -1.

 5. Команда выгрузки  (коп - 22, мнемоника – ‘st’). Выполняет действие, противоположное загрузке, т.е. записывает (выгружает) в ОП по адресу А содержимое сумматора. На основе выгруженного  значения в регистре Z  формируется  ПР.

 6. Загрузка адреса  (коп - 23, мнемоника – ‘lа’). В сумматор  копируется число, указанное в качестве адресной части А данной команды. Текущее содержимое Z  при этом не меняется. Команда, в частности, полезна для создания неотрицательных числовых констант. Например, после выполнения команды  “23 0001” в сумматор попадёт число 0001, т.е. единица.

7. Безусловный переход   (коп - 30, мнемоника – ‘jmp’). Подобна предыдущей команде, но адрес А копируется не в сумматор, а в регистр РА, явным образом определяя, тем самым,  адрес следующей для выполнения команды. Другими словами, осуществляется безусловная передача управления команде, записанной в ОП по адресу А. Текущее содержимое Z  при этом не меняется.

 8. Условный переход  по нулю  (коп - 33, мнемоника – ‘jz’).  Передаётся управление команде с адресом А, если текущий ПР=0. В противном случае, сохраняется естественный порядок выполнения команд, т.е. выполняется команда, записанная в ОП непосредственно за текущей. Содержимое Z  не меняется.

 9. Безусловный переход  по минусу  (коп - 34, мнемоника – ‘jm’).  Передаётся управление команде с адресом А, если текущий ПР < 0. В противном случае, сохраняется естественный порядок выполнения команд, т.е. выполняется команда, записанная в ОП непосредственно за текущей. Содержимое Z  не меняется.

Алгоритм выполнения команд процессором МиК   

Процессор, выполняя программу на машинном языке (МЯ), следует своему собственному, аппаратно реализованному  алгоритму поведения, который, для команд типа сложения в общих чертах выглядит так:

Шаг_1. УУ считывает из ОП в РК команду, адрес которой содержится в РА;

Шаг_2. К содержимому РА добавляется длина считанной команды (таким образом, в  РА оказывается подготовленным адрес следующей команды);

Шаг_3. Из команды в РК вычленяется КОП (первый байт); если КОП соответствует команде останова (т.е. равен 99), процесс выполнения программы завершается, иначе выполняется следующий шаг;

Шаг_4. КОП посылается в АЛУ, которое настраивается на выполнение соответствующей операции;

Шаг_5. Из команды в РК вычленяется адресная часть (последующие два байта) и происходит обращение по указанному в ней адресу ОП;

Шаг_6. Содержимое  слова по месту обращения к ОП передаётся в регистр R1 АЛУ (теперь уже в АЛУ всё готово для выполнения операции, первый операнд которой должен содержаться к этому моменту в сумматоре S, а второй  - в рабочем регистре R1);

Шаг_7. АЛУ выполняет подготовленную предыдущими шагами операцию и записывает её результат в S;   признак результата при этом записывается  в Z;

Шаг_8. УУ переходит к выполнению шага 1.

 

Конкретные примеры разработки простейших программ на МиК, Мик-эмулятор, на котором Вы сможете реально запускать и выполнять МиК-программы, а так же краткий справочник по МиК находятся здесь.

4.8125
Your rating: Нет Average: 4.8 (16 votes)

Комментарии

Мадина Хамерзокова аватар

Вроде разобралась

Задача 1.
1. 200) ?
2. 202) 01
3. 203) 22 0200
4. 206) 21 0200
5. 209) 10 0200
6. 212) 10 0200
7. 215) 02
8. 216) 99

Задача 2.
1. 300) ?
2. 302) ?
3. 304) 01
4. 305) 22 0300
5. 308) 10 0300
6. 311) 22 0300
7. 314) 01
8. 317) 22 0200
9. 320) 10 0200
10. 323) 22 0200
11. 326) 21 0300
12. 329) 11 0200
13. 332) 02
14. 333) 99

Задача 3.
1. 200) ?
2. 202) ?
3. 204) 01
4. 205) 22 0200
5. 208) 10 0200
6. 211) 22 0300
7. 213) 10 0200
8. 216) 22 0200
9. 219) 01
10. 220) 10 0200
11. 223) 22 0200
12. 226) 23 0001
13. 229) 22 0400
14. 232) 21 0200
15. 235) 11 0400
16. 238) 02
17. 239) 99

Задача 4.
1. 398) ?
2. 400) ?
3. 402) 01
4. 403) 22 0400
5. 406) 23 0015
6. 409) 22 0398
7. 411) 23 0000
8. 414) 11 0398
9. 417) 22 0398
10. 420) 21 0400
11. 423) 10 0400
12. 426) 22 0400
13. 429) 10 0400
14. 432) 22 0400
15. 435) 10 0400
16. 438) 22 0400
17. 441) 23 0000
18. 444) 11 0400
19. 447) 02
20. 448) 99

Тимур, Мадина

Хорошо что пробуете, я это обязательно учту, но есть у меня к вам общее замечание. В своём посте [Вс, 08/09/2013 - 17:46 — VTlyusten] (см. выше на этой страничке) я сформулировал ряд обязательных условий, только при соблюдении которых я буду комментировать решения. Жду от вас правильно оформленный код.

глупый вопрос

1. 22 0777
2. st 0777
эти две строчки одно и тоже? или вторая строчка лишь логически для понимания, а первая строчка для написания фактического кода в МиК?

Илья,

Вопрос вовсе не глупый, а пост самый содержательный, на текущий момент.
С удовольствием отвечаю. Вы совершенно правы. Мнемоническое ("очеловеченное") обозначение st пока только для понимания сути операции (store - запас, послать в запас). Но в дальнейшем, перейдя к ассемблеру мы сможем программы писать и вовсе без числового кодирования, т.е. только на основе мнемонических обозначений, таких как st.

Духу Аминат аватар

Команды МиК.

У меня возникли вопросы по командам перехода. У меня их несколько:
1. безусловный переход - это просто переход от одной команды к другой, в не зависимости от того, в какую часть программы нужно перейти?
2. я не поняла принципа работы условного перехода по нулю и безусловного перехода по минусу.
А так же на данный момент главной загвоздкой является непонимание сути сумматора.

команды перехода

7. Безусловный переход (коп - 30, мнемоника – ‘jmp’),
8. Условный переход по нулю (коп - 33, мнемоника – ‘jz’),
9. Безусловный переход по минусу (коп - 34, мнемоника – ‘jm’)
В качестве А пишется номер строки на которой находится команда или предварительно надо команду это записать в ячейку, если второе то как это сделать?

Аминат, Илья!

В качестве A (например, jmp A) во всех командах перехода используется номер (адрес) строки, на которую переходим. Это может быть числовой (четырёхзначный) адрес любой команды программы.
Например, команда безусловного перехода "30 0220" просто (безусловно) передаст управление той команде, которая находится по адресу 0220. А вот команда "34 0220" передаст управление по тому же адресу 0220 только ПРИ УСЛОВИИ, что в сумматоре ОТРИЦАТЕЛЬНОЕ число (если это не так, она попросту будет пропущена).

А вообще, команды условного

А вообще, команды условного перехода пока можно оставить на потом. Начнём с линейных программок.

Духу Аминат аватар

Спасибо за ответы, Валерий

Спасибо за ответы, Валерий Шахамболетович!

О сумматоре

Это внутренний регистр, который по умолчанию используется в каждой операции. Если операция требует двух операндов (т.е. например, является сложением, или вычитанием), то один из них предварительно подготавливается в сумматоре, а другой указывается адресной частью (A) команды. Результат того же сложения или вычитания, так же автоматически сохраняется в сумматоре, затирая первый операнд.

Рычков Александр аватар

Решение по данным

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

  1. y=4x-3
  2.  
  3. 1  0006 01      // ввод x
  4. 2  0007 22 0100 // выгрузка x на адрес 0100
  5. 3  0010 10 0100 // сумма сумматора и значения адреса 0100
  6. 4  0013 10 0100
  7. 5  0016 10 0100
  8. 6  0019 22 0102 // выгрузка значения 4x на адрес 0102
  9. 7  0022 23 0003 // запись константы 3
  10. 8  0025 21 0102 // загрузка значения 4x в сумматор
  11. 9  0028 11 0023 // вычитание значения константы (внимание на адрес значения константы!)
  12. 10 0031 02
  13. 11 0032 99
  14.  
  15. y=x-a+2z
  16.  
  17. 1  0000 01      // ввод a
  18. 2  0001 22 0100 // выгрузка a на адрес 0100
  19. 3  0004 01      // ввод x
  20. 4  0005 11 0100 // вычитание x-a
  21. 5  0008 22 0102 // выгрузка на адрес 0102
  22. 6  0011 01      // ввод значения z
  23. 7  0012 22 0104 // выгрузка z
  24. 8  0015 10 0104 // сложение z+z
  25. 9  0018 10 0102 // сложение (x-a)+2z
  26. 10 0021 02
  27. 11 0022 99
  28.  
  29. y=min(x,z)
  30.  
  31. 1  0000 01      // ввод x
  32. 2  0001 22 0100 // выгрузка x
  33. 3  0004 01      // загрузка z
  34. 4  0005 12 0100 // сравнение x и z
  35. 5  0008 34 0014 // переход по минусу на адрес 0014 (внимание!)
  36. 6  0011 21 0100 // загрузка значения x
  37. 7  0014 02      // (внимание на шаг 5!)
  38. 8  0015 99

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

P.S. Спасибо за толкование по архитектуре МиК

Александр.

Прежде всего, спасибо за внятный аватар.
По задачам. "Косяк" только в первой - запутались с константой. Кстати, приглашаю желающих найти и исправить ошибку. Начисляя рейтинговые баллы (а процесс этот идёт!) я учитываю любую активность и участие в обсуждениях.
А вообще, чтобы лишний раз не "прокалываться", я рекомендовал бы всем, перед публикацией кода проверять его работоспособность на эмуляторе!

Александр,

Александр, Ошибка в 11 строке общего кода, скажу лишь одно,дав возможность и другим ответить, в ячейке 0023 нет константы, а в какой ячейке она,пусть скажет ещё кто нибудь))

Дубль

Дублирующее сообщение.не знаю как удалить.

Дубль

Дублирующее сообщение.не знаю как удалить.

Дубль

Дублирующее сообщение.не знаю как удалить.

Духу Аминат аватар

Доброго всем вечера!

Доброго вечера, уважаемый преподаватель, и товарищи сокурсники. Сегодня, к моему величайшему сожалению, не было никакой возможности уделить должное внимание проработке задач на МиК. Надеюсь посвятить данной теме все ближайшие выходные. Можно ли будет задавать здесь вопросы по выходным?

Дубль

Дублирующее сообщение.не знаю как удалить.

Дубль

Дублирующее сообщение.не знаю как удалить.

Корниенко Кристина аватар

Ошибка

Ошибка начинается после загрузки адреса константы с 8й строки.
Мы внесли значение 3 в сумматор , но потом ты не выгрузил ее в отдельную ячейку , чтобы так сказать "запомнить константу" .
Для этого выгружаем из сумматора нашу константу в произвольную свободную ячейку,
после этого в сумматор загружаем значение 4х и отнимаем от него нашу сохраненную 3 .

  1. 7  0022 23 0003 // запись константы 3
  2. 8  0025 22 0104 // выгрузка константы 3
  3. 9  0025 22 0102 // загрузка значения 4x в сумматор
  4. 10  0028 11 0104 // вычитание значения константы

Может с кодом намудрила, но думаю понятно) Проверяла на МиК , работает)

Рычков Александр аватар

Программа работает верно

Дело в том, что я столкнулся с проблемой константы, и самым трудным оказался для меня как раз первый пример, НО, при отладке и изучении и проверке всех регистром, я путем умозаключений и 8-ми ошибок пришел к выводу что код программы должен выглядеть именно так, возможно он не оптимизирован, но он работает четко с выдачей достоверного результата.

  1. y=4x-3
  2.  
  3. 1  0006 01      // ввод x
  4. 2  0007 22 0100 // выгрузка x на адрес 0100
  5. 3  0010 10 0100 // сумма сумматора и значения адреса 0100
  6. 4  0013 10 0100
  7. 5  0016 10 0100
  8. 6  0019 22 0102 // выгрузка значения 4x на адрес 0102
  9. 7  0022 23 0003 // запись константы 3
  10. 8  0025 21 0102 // загрузка значения 4x в сумматор
  11. 9  0028 11 0023 // вычитание значения константы (внимание на адрес значения константы!)
  12. 10 0031 02
  13. 11 0032 99

P.S. Занес программу в МиК и проверил еще раз, все работает.

Рычков Александр аватар

50 на 50

Насколько я мог понять из данной команды, то константа сразу прописывается в адрес, и команда 22 для нее не нужна, а вот откуда ее брать, я убедился на методе проб и ошибок, думаю только наш наставник может нам указать верный путь при работе с константой.

Корниенко Кристина аватар

Методом проб и ошибок

Я пыталась вести в МиК твой вариант и вариант, который предложил Илья, чтобы убедиться что будут ошибки и посмотреть в пошаговом исполнении где и как идет сбой . Ваши коды программ выдавали не верные результаты, изменив код, как написала я , добилась желаемого.

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

Корниенко Кристина аватар

Никто не знает

Будем ждать пока нас рассудят)
Мало ли мы оба ошибаемся в своих утверждениях)

Извините, я тут со своими

Извините, я тут со своими делами завозился. Не знал, что здесь такая жаркая и интересная дискуссия.
Рассужу, коль просите - ВСЕ ПРАВЫ! И Илья, и Александр и Кристина!
А как это может быть - оставим на завтра.
Доброй ночи!

Айвазян Ксения аватар

Всем привет.У меня вопросы

Всем привет.У меня вопрос я ввела задачу в МИК и программа запустилась, но я не смогла сделать второе задание- найти команду сложения.Как ее искать, что и где нужно вводить?и Как решается эта задача -y=4x-3?

Ивашиненко Дмитрий аватар

Думаю, я знаю в чем проблема

Сперва я заметил неладное в этой строчке

  1. 6  0019 22 0102 // выгрузка значения 4x на адрес 0102

Может я не прав, но я бы назначил адрес 0103.

Затем конечно же нужно сохранить "константу":

  1. 22 0106 // сохраню хотябы в 0106

Я так и не понял откуда взялся этот адрес значения константы 0_о
  1. 9  0028 11 0023 // вычитание значения константы (внимание на адрес значения константы!)

Мое решение выглядит так:

  1. 200) 01 // ввод Х
  2. 201) 22 0100 // сохраняем Х
  3. 204) 10 0100 // 2Х
  4. 207) 10 0100 // 3Х
  5. 210) 10 0100 // 4Х
  6. 213) 22 0100 // заменяю в ячейке памяти 0100 значение Х на 4Х
  7. 216) 23 0003 // создаю, как вы говорите, "константу" 3
  8. 219) 22 0103 // сохраняю её
  9. 222) 21 0100 // загружаю 4Х
  10. 225) 11 0103 // отнимаю 3
  11. 228) 02 // вывод
  12. 229) 99 // стоп

Несколько важных замечаний

Во-первых, напоминаю, "выходных" дней в он-лайне у меня не бывает, спрашивайте в любое время, когда вам это удобно, отвечу как только смогу.

Во-вторых, я ТРЕБУЮ, чтобы ваши комментарии и решения всегда предварялись УСЛОВИЕМ задачи, а не только её номером. Обсуждения задач полезны для всех, и любой человек, читающий пост всегда должен точно знать, какая конкретно задача в нём обсуждается или решается (номера задачи и текста решения для этого явно не достаточно!).

В-третьих, ОБЯЗАТЕЛЬНЫМ считаю умение правильно вставить в свой пост программный код. Как это делать на этом сайте описано многократно.
Но для вашего удобства повторю- заключите вставляемый как код фрагмент между двумя тегами вот так: < pre> ... < /pre>. Вместо многоточия вы и вставляете свой программный код.

Но, ВНИМАНИЕ! ПРОБЕЛ ВНУТРЬ ТЕГОВ < pre> и < /pre> НЕ ВСТАВЛЯТЬ! иначе теги не сработают (у меня он есть, потому теги не сработали как надо, зато напечатались как простой текст чтобы вы их увидели).

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

ПРИМЕР ВСТАВКИ КОДА:
< pre>
первая строка
вторая строка
< /pre>

Теперь по вашим решениям...

1. Я обещал прокомментировать вот это не вполне корректное, но при этом, чудесным образом, правильно срабатывающее решение Рычкова Александра:

  1. y=4x-3
  2.  
  3.   0006 01      // ввод x
  4.   0007 22 0100 // выгрузка x на адрес 0100
  5.   0010 10 0100 // сумма сумматора и значения адреса 0100
  6.   0013 10 0100
  7.   0016 10 0100
  8.   0019 22 0102 // выгрузка значения 4x на адрес 0102
  9.   0022 23 0003 // запись константы 3
  10.   0025 21 0102 // загрузка значения 4x в сумматор
  11.   0028 11 0023 // вычитание значения константы (внимание на адрес значения константы!)
  12.   0031 02
  13.   0032 99

Очевидно, некорректной здесь является команда в строке 10. Действительно, рассмотрим этот фрагмент:
  1. ...
  2. 0022 23 0003 // запись константы 3
  3. 0025 21 0102 // загрузка значения 4x в сумма
  4. 0028 11 0023 // вычитание значения константы (внимание на адрес значения константы!)
  5. ...

Команда 23 0003 (загрузка адресная) загружает в качестве "адреса" нужную нам константу 3 в сумматор. Спору нет, правильно. Казалось бы, нужно её теперь сохранить переслав командой st(22) в какую то рабочую ячейку чтобы потом можно было вычесть из 4X. Но вместо этого, в тот же сумматор перезаписывается ранее вычисленное 4X. А дальше делается совсем уж, кажется, нелогичное - командой 11 0023 из 4X в сумматоре вычитается содержимое ячейки 23, в которую программа уж точно ничего не записывала.
Но всё же информация содержащаяся в ячейке 0023 не случайна и действительно представляет собой константу 1 !
Если посмотреть внимательно на размещение команд программы, то можно заметить, что в ячейки 23,24 попадает адресная часть той самой команды 23 0003 "загрузка адресная". Т.е. если адрес этой команды, как мы видим, 0022, то по адресу 0022 размещается КОП этой команды (число 23), а в байты с адресами 0023 и 0024 попадают соответственно, числа 00,03. Значит, можно считать, что по адресу 0023 содержится константа 0003 (не забывайте, что каждое данное -целое число, в МиК занимает не байт, а слово, т.е. два рядом расположенных адреса). Эту "константу" программа и использует.
Кстати, команду 23 0003 можно заменить любой другой (кроме st), имеющей ту же самую адресную часть, например, можно было бы записать 10 0003 или 21 0003. Ответ всегда будет верен. В представленном этом решении важно ведь не действие, выполняемое командой, а вид её адресной части.
Отдаю должное изобретательности и той степени понимания структуры адресации МиК, которую проявил Александр, но так писать программы не следует.
Недостатки решения.
1) Трудности логического анализа корректности подобных решений.
2) Проблемность в использовании отладчиков, которые мало полезны в поиске ошибок связанных с такими решениями (нет чёткого разграничения кода и данных);
3) Любое изменение привязки программы по памяти потребует её переделки.
Впрочем, манипуляции с кодом как с данными были характерны на заре становления компьтерных технологий.

Первыми эту некорректность идентифицировали Гриньков Илья и Корниенко Кристина.
Вот правильный способ учёта константы, который предложила Кристина:

  1. 0022 23 0003 // запись константы 3
  2. 0025 22 0104 // выгрузка константы 3
  3. 0025 22 0102 // загрузка значения 4x в сумматор
  4. 0028 11 0104 // вычитание значения константы

2. По решениям, которые выложил Ивашиненко Дима, так же заявивший о себе как об уяснившем суть МиК-программирования (кстати, решения не всегда сопровождаются условиями задач)
1) Первое решение не содержит ввода и всегда выдаёт одно и то же число. Это не вычисление ф-ции Y=2X.
2) Решение второй задачи неверно. Прошу всех подключиться с поиском и исправлением ошибок.
3) Решение третьей задачи на ассемблере правильное. Здесь Вы молодец - освоили МиК-ассемблер.
Пост по решению задачи 4 я не понял.
Ещё общее замечание. Вы очень расточительны в использовании ячеек. Нет необходимости под каждый промежуточный результат отводить новую ячейку. Например, вычислив 2X можно его перезаписать в ячейку, ранее содержавшую X (конечно, если он вам далее уже не понадобится).

3. По вопросу Айвазян Ксении. Всё должно стать понятным после проработки двух основных материалов по МиК, указанных во "Введении для первокурсника 2014" под номерами ссылок 2 и 3 (выделены синим цветом - остаётся кликнуть мышкой). Жду конкретных вопросов по этим материалам.

Готовьтесь!

Сегодня вечером, часов в 9 опубликую несколько простых МиК-задач. Это вам и для самопроверки и для возможности подзаработать хоть какие-то баллы на активности. Решения необходимо будет оформлять так, как я указал чуть выше ("красивый код" и обязательное указание условий задач). Ещё требование - не выкладывать сразу более одного решения. Дайте возможность проявить себя и вашим товарищам. На обсуждения уже выложенных решений или на предложения других возможных способов решений это ограничение не распространяется.
Жду вас, готовьтесь!

Ивашиненко Дмитрий аватар

Вопрос

Есть ли на вашем сайте возможность скрывать текст под спойлер?
Вторую задачу исправил, проверьте.

баллы

Здраствуйте, Валерий Шахамболетович! Давно хотел спросить по поводу баллов... На этом сайте будет или есть такой раздел, как "кол-во баллов" или "баланс баллов" ? Этот раздел, я думаю, очень был бы полезен, т.к. каждому интересно его текущее суммарное кол-во баллов, а также других.
Предлагаю чтобы у каждого пользователя был раздел "баллы", в котором видно "история баллов" - за что он получил и "сколько баллов" и "суммарное кол-во баллов", а также таблицу для всех студентов, поступивших в этом году с суммарным кол-вом баллов у каждого на текущий момент... Это даст знать у кого сколько баллов и стремиться к повышению суммарному кол-ву баллов. Предполагаю, что не я один жду такой раздел...

Шукаев Сергей аватар

4x-3

0000) 01 // ввод х
0001) 22 0100 // сохр. х
0004) 10 0100 // х+х
0007) 10 0100 // х+х+х
0010) 10 0100 // х+х+х+х = 4х
0013) 22 0100 // заменяю х на 4х
0016) 23 0003 // ввожу константу 3
0019) 22 0103 // сохр. константу
0022) 21 0100 // загружаю 4х
0025) 11 0103 // вычитаю 3
0028) 02 // вывод
0029) 99 // stop

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

Духу Аминат аватар

Доброй ночи!

Доброй всем ночи. Вот, наконец, получилось дойти до компьютера и по-человечески все посмотреть. Но у меня одна большая проблема: документ "МиК помощь" не открывается, хотя все нужные программы у меня есть. Пыталась решить проблему все выходные, но так ничего и не удалось. Почти ничего не изучив, кроме имеющихся конспектов, выходные прошли даром. Быть может завтра можно будет принести с собой ноутбук, чтобы кто-нибудь помог мне разобраться с причиной проблемы? Я не хочу отставать, а чтобы разобраться во всем этот документ мне необходим.

Купчин Алексей аватар

4x-3

4x-3

  1. 1 0100 01//ввод х
  2. 2 0101 22 0080//выгрузка значения x
  3. 3 0104 10 0080// 2x
  4. 4 0107 10 0080// 3х
  5. 5 0110 10 0080//4х
  6. 6 0113 22 0083//выгрузка значения 4х
  7. 7 0116 23 0003// запись константы 3
  8. 8 0119 21 0083// загрузка значения 4х
  9. 9 0122 11 0117// вычитание константы от 4х
  10. 10 0125 02// вывод
  11. 11 0126 99//stop

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

Аминат,

а какой именно файл не открывается: MiK-Help.tgz или Мик справка.pdf ?

Купчин Алексей аватар

x-a+2z

  1. x-a+2z
  2.  
  3. 1 0100 01// ввод a
  4. 2 0101 22 0080// выгрузка значения а на адрес 0080
  5. 3 0104 01// ввод х
  6. 4 0105 11 0080// вычитание x-a
  7. 5 0108 220083// выгрузка значение х-а на адрес 83
  8. 6 0111 01// ввод
  9. 7 0112 22 0085// выгрузка значения z на адрес 0085
  10. 8 0115 10 0085 сложение z+z
  11. 9 0118 10 0083 сложение(x-a)+z+z
  12. 10 0121 02 вывод результата
  13. 11 0122 99 stop

Купчин Алексей аватар

min(x,z)

  1. min(x,z)
  2. 1 0100 01// ввод x
  3. 2 0101 22// 0080 выгрузка на адрес 0080
  4. 3 0104 01// ввод z
  5. 4 0105 12// сравнение x и z
  6. 5 0108 34// 0080 переход по минусу
  7. 6 0111 21// 0080 загрузка x
  8. 7 0114 02// вывод результата
  9. 8 0115 99// stop

Духу Аминат аватар

PDF

PDF. я уже и Adobe Fine Reader переустановила, и скачала Adobe Acrobat. Все напрасно.

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

ошибка, или я не так понял?

а, все, разобрался...

Клименко Екатерина аватар

Исходные данные к очередной

Исходные данные к очередной операции готовятся в регистрах S и R1, а результат, записывается в S. Разве результат не в Z записывается ? или я что-то не так поняла?
И ещё вопрос. Можно ли удалять свои комментарии?

Екатерина!

Спасибо за первый предметный вопрос.
В Z заносится ПРИЗНАК РЕЗУЛЬТАТА (-1, 0 или 1) в зависимости от ЗНАКА РЕЗУЛЬТАТА (минус, 0, плюс).
Сам же результат заносится в сумматор S (кстати, стирая его старое содержимое).

И ещё. Возможно, некоторые заметили, в документации по МиК, регистр признака результата(ПР) иногда называется не Z, а W.

А вот комментарии удалять нельзя, т.к. такая возможность могла бы привести, например, к бессмысленному комментированию того, что изменено или даже удалено. Я думаю, в любом комментарии есть информация, которая при правильном и публичном её переосмыслении кому-то может принести пользу.

Клименко Екатерина аватар

Спасибо!

теперь разобралась)

Алексей Гостев!

И остальные, у кого уже есть аккаунт с прошлого года.
Я удалю их с тем, чтобы вы могли включиться в списки новых групп. Иначе, Вы не сможете участвовать в групповых мероприятиях.

Смаков Роман аватар

Здравствуйте, хотелось бы

Здравствуйте, хотелось бы уточнить , приведу предложение из вашей статьи "Например, если по адресу 0456 хранится число -55, то в результате выполнения команды “21 0456”, в регистр S будет записано число -55, а в регистр Z – число -1." Если бы было не число -55, а допустим 10, то в регистр Z записалось бы число 1? .Т.е. знак числа в регистре Z , зависит от знака перед числом записанным в регистр S?

Именно так, Роман! ЗНАК

Именно так, Роман!
ЗНАК результата определяет содержимое Z.