Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6842

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

426 

вающий  что  адрес  перехода  хранится  в  следующем  слове,  составляющем  с  1C0D  единое  целое. 
Подробности такого способа адресации - в следующем пункте. 

По-другому обстоит дело с

 

относительным переходом, код которого D. В качестве примера 

возьмем команду 

1D06 

Для  определенности  будем  считать,  что  эта  команда  находится  в  памяти  по  адресу  42.  В 

строгом  соответствии  с  основным  алгоритмом  работы  процессора,  после  выборки  рассматривае-
мой  команды  счетчик  адреса  команд  PC  автоматически  увеличивается  до  44.  Затем,  выполняя 
расшифрованную команду перехода, процессор прибавит к текущему содержимому PC смещение 
06 и тем самым осуществит переход на адрес 44 + 6 = 4А. Обратите внимание, что итоговый адрес 
в случае относительного перехода зависит от расположения команды перехода в ОЗУ. 

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

обсуждении команд перехода мы незаметно включили в работу модификатор команд. Для перехо-
дов  его  роль  проста  и  наглядна:  МОД  показывает,  по  какому  условию  осуществляется  переход. 
Таблица всех используемых в «Е97» значений модификаторов выглядит так: 

0   -   возврат из подпрограммы; 
1    -   безусловный переход; 
2    -    N = 0 (≥0); 
3    -   N = 1 (<0); 
4    -    Z 

=

 0 (≠0); 

5    -   Z 

=

 1 (=0); 

6    -   N=1 orZ=l (≤0); 
'7    -   N=0andZ=0(>0); 
9   -   вызов подпрограммы. 
 
Становится очевидным, что рассмотренные в обоих предыдущих примерах команды с МОД 

= 1 являются наиболее простым вариантом перехода - безусловным. 

Для работы с условными переходами следует твердо запомнить следующее правило: 

«Если анализируемое условие справедливо, т. е. состояние управляющих признаков сов-

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

 

Кстати, так обстоит дело и в языках высокого уровня. 
И еще об одном виде перехода следует поговорить особо - о

  переходе  с возвратом

  или о 

переходе  к  подпрограмме

,  как  его  часто  называют.  На  практике  подпрограммы  (процедуры)  и 

функции играют очень важную роль. Подпрограммы полезны, когда 

в разных местах

 программы 

требуется  выполнить 

одни  и  те  лее  действия.

  В  этом  случае  имеет  смысл  оформить  повторяю-

щиеся действия в виде подпрограммы, а затем просто вызывать ее в нужных местах. В каком-то 
смысле это похоже на публикацию текстов песен, когда припев пишется один раз, а в дальнейшем 
просто ставится ссылка на него в виде слова «ПРИПЕВ». 

Наиболее  важное  отличие  перехода  к  подпрограмме  от  безусловного  перехода  состоит  в 

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

Для обеспечения возможности вложения друг в друга подпрограмм необходимо уметь со-

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

Рассмотрим конкретный пример. Пусть в некотором месте программы находится команда 

из двух слов 

9C0D  

0030 

Исполнять эту команду процессор будет так. Прежде всего, он уменьшит SP на 2 и запом-

нит по полученному адресу текущее содержимое PC (вспомните, что счетчик к этому времени уже 


background image

 

427 

будет показывать на следующую команду). Затем последует переход по адресу 30, считанному ра-
нее из второго слова команды. Таким способом мы попадем в подпрограмму, надежно спрятав в 
стеке адрес основной программы, куда нужно вернуться. Обсудим теперь, как произойдет возврат. 

В конце любой подпрограммы должна стоять команда 0С00 или 0D00. Встретив ее. процес-

сор извлечет из стека занесенное туда ранее значение и поместит его в PC. При этом он увеличит 
SP на два, освободив ненужную более ячейку памяти в стеке. Таким образом, прерванное

 на

 время 

выполнение основной программы продолжится с нужного места. 

Примечание.

 Команды с кодами 0С и 0D тождественны

 

и их младшие 8 бит не

 

используют-

ся. 

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

проанализировать ситуацию, когда одна подпрограмма вызывает другую. 

Займемся последней группой команд процессора, для которой КОП = Е. Прежде всего, по-

чему такому КОП соответствует группа, а не одна команда? Все дело в том, что эти команды од-
ноадресные, и освобождающиеся от одного из операндов 4 бита можно использовать для задания 
номера операции в этой группе. Назовем полученные биты дополнением к КОП - ДКОП. В итоге 
получим формат, приведенный на рис.4.20, д). Из рисунка видно, что код операций для всех одно-
адресных операций состоит из двух шестнадцатеричных цифр, причем первая из них всегда Е. По-
знакомимся с этими командами более подробно. 

Команда с кодом Е1 выполняет над единственным операндом ОП1 логическую операцию 

НЕ, т.е. заменяет нулевые биты единицами и наоборот (инверсия). 

Команды с кодами Е2 - Е9 обеспечивают работу со стеком. Так, при коде операции Е2 ОП1 

заносится в стек, а при ЕЗ - считывается оттуда. Например, вот как можно поменять местами со-
держимое регистров R1 и R2 с использованием стека: 

 
0000   0Е21      записать R1 в стек 
0002   0Е22      записать R2 в стек 
0004   0Е31      считать значение из стекав R1 
0006   0Е32      считать значение из стека в R2 
0008   0F00      останов 
 
Команды Е4 и Е5 позволяют изменять значение SP на величину ОП1, что часто бывает по-

лезно  при  работе  со  стеком,  например,  при  освобождении  в  нем  сразу  нескольких  «этажей».  По 
кодам Е6 и Е7 можно задать новое значение SP и прочитать его текущее значение в ОП1. Наконец, 
наиболее экзотические из этой группы команды Е8 и Е9 сохраняют в стеке и восстанавливают для 
последующего анализа регистр состояния процессора PS. Эти команды замечательны тем, что об-
рабатывают вполне определенный операнд, поэтому содержимое ОП1 в команде значения не име-
ет; 

договоримся заполнять его нулем.

 

Осталось рассмотреть последнюю группу команд - сдвиги. Их коды ЕА - ЕС. Все они осу-

ществляют сдвиг кода в ОП1 на один разряд влево или вправо в зависимости от значения ДКОП. 
Полезно помнить, что сдвиг влево эквивалентен умножению, а вправо - делению на два. 

Команда ЕС, называемая арифметическим сдвигом, отличается от обычного сдвига ЕВ тем, 

что старший знаковый разряд при арифметическом сдвиге сохраняет свое значение, например: 

Исходное значение ОП 1: 1111 0000 1111 0000 
Результат команды ЕВ:   0111 1000 0111 1000 
Результат команды ЕС:   1111 1000 0111 1000. 
Арифметический  сдвиг  бывает  полезен  для  деления  отрицательных  чисел,  так  как  в  этом 

случае автоматически сохраняется признак знака минус - единица в старшем разряде. 

В данной модели при сдвиге, приводящем в выходу старшей или младшей цифры за преде-

лы разрядной сетки, соответствующая информация теряется. В реальных процессорах для ее  со-
хранения существует специальный управляющий

 

бит, называемый «битом переноса».

 

 

4.3. АДРЕСАЦИЯ ДАННЫХ 

 
Теперь, когда мы знаем практически все об операционной части команды, можно заняться 

адресной. Посмотрим, какими способами могут представляться операнды ОП1 иОП2. 


background image

 

428 

Начнем с того, что под кодирование каждого операнда всегда отводится четыре двоичных 

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

Старшая

  «половинка»  модификатора  операнда,  соответствующая  типу  адресации,  может 

содержать четыре неповторяющиеся двоичные комбинации: 

00 - 

регистровый

 метод адресации: операнд является содержимым указанного регистра; 

01

 - метод 

косвенной

 адресации: операндом является содержимое ячейки ОЗУ, адрес кото-

рой задан в указанном регистре; 

10

 - резерв; в будущей версии здесь будет реализован индексный метод адресации; 

11

 - адресация 

по счетчику адреса команд

 PC: операнд извлекается с использованием ин-

формации, входящей в команду (более подробные объяснения приведены ниже). 

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

в примерах предыдущего раздела. Учитывая, что этому  методу  соответствуют нулевые значения 
старших битов, полный код операнда совпадает с номером регистра: двоичная комбинация 0000 
соответствует R0, 0001 - R1 и т.д. 

В качестве данных для операции используется информация, содержащаяся в указанном ре-

гистре. Например, если Rl = 3, а R2 = 5, то в результате выполнения команды 

0212

:R2+R1=>R2 

получится R2 = 8. 

При косвенной

 

адресации код операнда выглядит несколько сложнее: косвенное обращение по 

регистру R0 имеет вид 0100 (т.е. 4), по Rl - 0101 (5) и т.д. Содержимое указанного регистра при 
этом служит не операндом, а

 

его адресом в ОЗУ. Рассмотрим команду

 

0263

: R3 + (R2) => R3 

где  скобки  у  R2  символизируют  косвенную  адресацию.  Пусть  содержимое  R2  в  данный  момент 
равно 30, а R3 = 6. Примем также, что в ячейке памяти с адресом 30 хранится число 10. Тогда про-
цессор «Е97», выполняя команду, к имеющемуся в R3 значению 6 прибавит число из ячейки 30, на 
которую указывает R2, и результат операции - 16 - занесет в R3. 

И,  наконец,  рассмотрим  способы  адресации  по  программному  счетчику

 

PC

.

  Поскольку  в 

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

11 00

 - резерв; 

11 01

 - операндом служит константа, входящая в команду; 

11

 

10

 - операнд извлекается из ячейки ОЗУ, адрес которой входит в команду; 

1111

-резерв. 

Итак,  в  «Е97»  существует  два  метода  адресации  по  PC,  соответствующих  шест-

надцатеричным кодам 

D

 и 

Е

 в качестве операнда. Изучим их на примерах. Команда, состоящая из 

двух слов 

02D1  

0020 

выполняет  операцию  Rl  +  20  =>  Rl  следующим  образом:  к  текущему  значению  Rl  прибавляется 
извлеченное из команды число 20 и результат помещается в Rl. Если первоначальное значение Rl 
было, скажем, F0, то в результате операции в Rl запишется 110. 

Рассмотрим еще одну команду с адресацией по PC: 

021Е 

0020 

выполняющую операцию (20) + Rl => (20) так: к числу, хранящемуся в ячейке памяти 20, прибав-
ляется значение Rl. В случае, когда Rl = F0, a (20) = 40, ответ будет: (20)= 130. 

На  этом  рассказ  о  методах  адресации  можно  было  бы  и  закончить,  если  бы  не  наличие  в 

командах  модификатора,  хранящегося  в  первой  цифре  шестнадцатерич-ного  представления  ко-
манды. Его значение также может существенно влиять

 

на

 

извлечение данных и запись результата. 

Во всех приведенных в данном пункте примерах МОД = 0 и, следовательно, не оказывает 

влияния на расшифровку и выполнение операции. Если же он имеет ненулевое значение, необхо-


background image

 

429 

димо дополнительно учитывать и этот фактор. 

Модификатор состоит из четырех битов, причем два старших отвечают за «переключением 

бант/слово,  а  два  младших  -  за  особый  способ  представления  данных,  называемый  «

короткой 

константой

». Многие команды оперируют с небольшими константами, значения которых не пре-

вышает по модулю 15. Такие констангы вполне «уместятся» в четырех отведенных под ОП1 би-
тах. Для реализации такой возможности в «Е97» используются два младших бита модификатора -
0-й и 1-й. Признаком, по которому процессор распознает «короткую константу», служит наличие 
единицы  в  первом  разряде  модификатора.  В  этом  случае  содержимое  ОП1  рассматривается  как 
двоичное число, а 0-й бит модификатора служит его знак ом,например: 

 

25A3:R3* 10=>R3 

 или 

3653:R3/(-5)=>R3 

 

Из  приведенных  примеров  видно,  что  операции  с  «короткой  константой»  занимают  всего 

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

Наличие операций с «короткой константой» позволяет  упростить систему команд процес-

сора. Например, в программах часто требуются команды, увеличивающие или уменьшающие дан-
ные на единицу. Любой процессор имеет для этой важной ситуации специализированные коман-
ды, обозначаемые чаще всего INC и DEC. В «Е97» эти команды получаются как частный случай 
операций с «короткой константой». 

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

с 16-разрядными словами. Но это не всегда так - иногда требуется выполнить те или иные дейст-
вия над байтами, например, при обработке текста. Старшие биты модификатора как раз и преду-
смотрены для оказания режима байт/слово: 3-й бит соответствует ОП1, а 2-й - ОП2. Если соответ-
ствующий бит модификатора установлен в единицу, то процессор оперирует с байтом, иначе - со 
словом. Как всегда, наличие двух битов порождает четыре варианта: 

 

00

    ОП1-слово,   ОП2-слово; 

01

    ОП1-слово,   ОП2-байт; 

10

    ОП 1 - байт,    ОП2 - слово; 

11

    ОП1-байт,    ОП2-байт. 

 
Наиболее простыми и очевидными являются комбинации слово - слово и байт -байт, когда 

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

 0 для операции со словами,

 

либо

 С для байтов. 

 

4.4.

 РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ 

 

Как  уже  говорилось  ранее,  модель  «Е97»  отражает  наиболее  простые  методы  обмена  с 

внешними устройствами из тех, что свойственны современным компьютерам. 

Как и в реальных микропроцессорах, «общение» с периферийными устройствами осущест-

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

 порт данных и порт состоя-

ния.

 Можно считать, что каждый порт представляет собой 16-разрядный регистр, находящийся в 

контроллере.  Через  порт  данных  происходит  обмен  информацией.  Порты  состояния  позволяют 
управлять процессом обмена данными, так как предоставляют процессору сведения о текущем со-
стоянии  внешнего  устройства.  Реальная  синхронизация  ввода-вывода  является  достаточно  слож-
ной  проблемой  и  существенно  зависит  от  типа  периферийного  устройства.  Поэтому  в  «Е97»  ре-
гистр  состояния  устроен  максимально  просто:  в  нем  имеется  единственный  используемый  бит  - 

бит готовности

. В обсуждаемом учебном компьютере бит готовности помещается в седьмом раз-


background image

 

430 

ряде регистра состояния. 

Все  порты  являются  16-разрядными,  но  реальная  информация  всегда  располагается  в  их 

младшем байте. Содержимое битов с 8-го по 15-й в выходные порты формально заносится, но ни-
какого влияния на устройство вывода не оказывает. 

Каждому порту соответствует свой номер (адрес). В «Е97»

 

из шестнадцати возможных ис-

пользуются следующие порты: 

 

0

 - порт состояния клавиатуры (только чтение); 

1

 - порт данных клавиатуры (только чтение); 

2

 - порт состояния дисплея (только чтение); 

3

 - порт данных дисплея (только запись). 

 
Стандартный  алгоритм  обмена  с  использованием  портов  ввода-вывода  выглядит  следую-

щим образом. Считывается порт состояния и проверяется значение 

знакового бита

 его 

младшего

 

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

Вот как может выглядеть правильная программа вывода одиночного символа из R0 на дис-

плей (именно так она реализована в ПЗУ «Е97»): 

 
0А21 порт2=>R1 
Е401 сравнить с 0 R1b 
2DFA если 

≥ 

0, PC - 6 (к повторению проверки) 

0В03 R0 => порт 3 
 
Первые три команды считывают и проверяют бит готовности в порту 2, а последняя коман-

да обеспечивает собственно вывод требуемого символа на дисплей. 

Обратите  внимание  на  команду  с  «короткой  константой»  0,

 

которая

  обязательно 

должна 

проверять знаковый разряд

 

младшего байта,

 а не всего слова в целом. 

Мы подробно рассмотрели программирование процедуры вывода символа; ввод осуществ-

ляется совершенно аналогично. 

 

4.5. ПРИМЕРЫ ПРОГРАММ 

 

Пример 1.

  Вычислить  полную  поверхность  параллелепипеда  со  сторонами  А,  В  и  С.  Счи-

тать, что исходные значения находятся в ячейках ОЗУ. Результат также поместить в ячейку памя-
ти. 

Решение.

 Полная поверхность параллелепипеда вычисляется по формуле 

S=2*(A*B+A*C+B*C) 

Для упрощения программы выражение удобно представить в виде S = 2 * [А * (В + С) + В * 

С] 

 

Программа 134 

 
0000          

01ЕО    

(22) => R0     В => R0  

0002          

0022 

0004          

0101     

R0 => Rl       В => Rl  

0006          

02Е0     

R0 + (24) => R0       В + С  

0008          

0024 

000А          

05Е0     

R0 * (20) => R0       A * (В + С)  

000С          

0020 

000Е          

05Е1     

Rl * (24) => Rl      

В * С  

0010          

0024