МПС

Команды микропроцессора (Лекция)

 

ПЛАН ЛЕКЦИИ

1. Понятие набора команд

2. Мнемоническая форма записи команд

3. Методы адресации МП

3.1. Неявная (регистровая) адресация

3.2. Непосредственная адресация

3.3. Прямая адресация

3.4. Косвенная адресация

3.5. Индексная адресация

3.6. Относительная адресация

3.7. Команды работы со стеком

4. Система команд процессора

4.1. Команды пересылки данных

4.2. Арифметические команды

4.3. Логические команды

4.4. Команды переходов

 

1. Понятие набора команд

Команда микропроцессора (МП) – это такое двоичное слово, которое, будучи «прочитано» МП, заставляет последний выполнять определенные действия. Другие, отличные от команд, слова подобных действий в МП вызывать не могут. Команды осуществляют пересылку или обработку данных, расположенных в памяти или одном из регистров МП. Некоторые команды предназначены для управления некоторыми вспомогательными функциями МП, поддерживающими необходимый режим его работы. Когда говорят о наборе команд МП, подразумевают все его команды.

Длина команды как двоичного слова совпадает с длиной слова данных. Однако команды могут иметь длину, равную не только одному, но также двум или трем словам.

Для выполнения команда посылается в регистре команд, дешифратор и схемы управления, где она идентифицируется, в результате чего формируются сигналы, направляемые в другие части МП. С помощью этих сигналов выполняются операции, предписываемые командой.

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

Детальное рассмотрение команды МП показывает, что она должна содержать информацию двух видов. Во-первых, команда должна сообщать МП, что делать (выполнять сложение, очистку, пересылку, сдвиг и т.п.); во-вторых, указывать адрес, т.е. местоположение обрабатываемых данных. Таким образом МП получает от команды информацию не только о том, что делать, но и о том, где находятся данные – объекты манипулирования.

Команда состоит из двух частей: кода операции (КОП) и адреса. КОП сообщает МП, что делать; адрес указывает местоположение данных, участвующих в операции. Если длина команды составляет два или три слова,  то первое из них – это КОП, а второе и третье – адрес. Из этого следует сделать вывод, что все команды длиной в одно слово являются безадресными (подробнее об том при описании способов адресации).

Ins.gif (4077 bytes)

Мы рассмотрим 8 основных типов команд. На практике подавляющее большинство МП располагает значительно большим числом различных команд.

Любая машинная команда - это машинный код, который определяет:

1)      Операцию.

2)      Указывает на данные.

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

 

Метод адресации

Область применения

Регистровая

Требуемое значение в регистре

Непосредственная или литеральная

Для задания констант

Базовая со смещением

Для обращения к локальным переменным

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

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

Индексная

Полезна при работе с массивами

Прямая или абсолютная

Полезна для обращения к статическим данным

Косвенная

Выбирается значение по указателю

Автоинкрементная

Полезна для прохода в цикле по массиву с шагом: В каждом цикле получает приращение

Автодекрементная

Аналогична предыдущей. Обе могут использоваться для реализации стека

Базовая индексная со смещением и масштабированием

Для индексации массивов

Все известные способы адресации данных разделены на две большие группы.

1)      Прямые.

2)      Непрямые.

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

 

Число команд значительно больше, чем число различных кодов операции, поскольку при формировании команды один и тот же КОП может использоваться при различных способах адресации. Например, большинство МП используют КОП CLEAR . Естественно задать вопрос: очистка чего? Ответ зависит от конкретного набора команд МП. Некоторые МП располагают единственной подобной командой – командой очистки аккумулятора, другие – несколькими командами очистки, такими, как очистка аккумулятора А или В, очистка регистра А, В, С или D, очистка области памяти с адресом N. Как видно из последнего примера, сочетание одного КОП с различными адресами может привести к созданию семи разных команд.

 

2. Мнемоническая форма записи команд

Команда МП – это двоичное число. Но даже однобайтовое двоичное число трудно запомнить. Еще труднее «держать в голове» двоичные коды команд длиной 2-3 байта. Т.е. основная проблема: команды трудно запоминать и отождествлять с их фактическим назначением. Данная проблема решается путем применения мнемонического обозначения – сокращенной записи названия команды. Для этой цели обычно используются три буквы названия операции, выполняемой командой. Например, мнемоническое обозначение команды очистки имеет следующий вид: CLA. Если МП содержит два аккумулятора (А и В), то команды их очистки могут записываться как CLA А  и CLA В, где CLA – КОП, а А и В – адрес местоположения обрабатываемых данных. Если же команда оперирует числовыми данными или адресами областей памяти, то целесообразно использование чисел в адресной части команды. Например, код операции с мнемоническим обозначением JMP (JMP - ПЕРЕХОД) требует указания адреса перехода. Подобная команда может иметь вид JMP 1777568, где адрес выражен шестиразрядным восьмеричным числом, двоичный эквивалент которого 11111111111011102 есть адрес области памяти. Мнемоническое обозначение JMP легче запомнить, чем его восьмеричный эквивалент 3038. Сочетание сокращенного буквенного обозначения кода операции с числовой формой записи адреса являются одной из наиболее удобных форм записи команды.

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

 

 

3. Методы адресации МП

 

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

Итак, команда МП состоит из КОП и адреса. Однако имеются команды без адреса. Например, команде, приказывающей МП остановить работу, адрес не нужен. Но безадресных команд мало. Пусть в распоряжении имеется 8-разрядный МП с памятью объемом 65К. У программиста должна иметься возможность доступа к содержимому любой из 65536 областей памяти. Для адресации к этим областям длина адресной части команды должна быть достаточной для размещения 16 бит. Конечно, двоичный код команды длиной 8 бит не может включать в себя код операции и 16-битовую адресную часть.

Большинство МП имеет команды различной длины. Как правило, необходимы команды длиной в одно, два или три слова. Число битов, образующих двоичный код команды, не может быть произвольным, например, 7,12 или 14. Оно должно быть кратно длине байта (машинного слова). Следовательно, 8-разрядный МП может иметь команды длиной 8, 16 или 24 бит.

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

 

3.1. Неявная (регистровая) адресация

 

Однобайтовая команда 8-разрядного МП – это одна из 256 различных комбинаций 8 бит, образующих машинное слово (байт). Такого количества различных команд достаточно для рассматриваемого нами МП. Однако он располагает 65536 областями памяти, для адресации которых адресная часть команды должна быть больше той, которую может предоставить однобайтовая команда. Неприемлемым в данном случае является и такое решение, когда на месте адресной части размещаются сами данные. Однобайтовые данные нельзя разместить в однобайтовой команде, часть битов которой должна всегда быть предоставлена коду операции.

Каким же образом можно использовать однобайтовую команду для адресации к данным? Ответ таков: 1-байтовые команды не адресуются к данным, расположенным в памяти; они оперируют данными, загруженными в регистр, регистровую пару или данными, хранимыми в области памяти, адрес которой находится в регистровой паре. Например, 1-байтовая команда пересылки данных из регистра А в регистр В состоит из кода операции, адреса источника данных (регистра А) и адреса приемника данных (регистра В). Адреса источника и приемника указаны в команде неявно; иногда говорят, что они «встроены» в команду. Вот почему такая адресация называется неявной.

Регистровая адресация.

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

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

3.2. Непосредственная адресация

 

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

Чтобы ответить на вопрос о том, в каких случаях целесообразно использование непосредственной адресации, рассмотрим пример программы загрузки аккумулятора 8-разрядным двоичным числом. Такая загрузка осуществляется при каждом выполнении программы. Указанную программу можно реализовать посредством команды, КОП которой «приказывает» МП загрузить в аккумулятор данные длиной в 1 байт, следующие непосредственно за КОП. Подобную команду называют «Загрузка регистра непосредственная».

Загрузка регистра непосредственная

1-й байт

Данные

2-й байт

 

Непосредственная адресация осуществляется МП за 2 микроцикла: в течении первого микроцикла производится выборка команды, в течении второго – ее выполнение. Операции, задаваемые первым байтом команды (КОП), МП выполняет над данными, представленными ее вторым байтом. При использовании непосредственной адресации в команде предполагается размещение данных там же, где находится сама команда. Однако иногда  возникает необходимость размещать данные в каком-либо другом месте памяти и  иметь возможность адресоваться к ним. В таких случаях используется прямая адресация.

 

3.3. Прямая адресация

 

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

Прямая адресация.

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

Загрузка аккумулятора в память прямая

1-й байт

0016

2-й байт

16

3-й байт

 Прямая адресация, как правило, представляется наиболее естественной и простой для понимания. При неявной адресации адрес местоположения данных «встроен» в команду, и программист имеет возможности самостоятельно обращаться к данным по их адресу. При непосредственной адресации данные указываются в самой команде, следуя сразу за КОП. В этом случае программист тоже не может адресоваться к данным. И только при прямой адресации у него есть такая возможность, явным образом задавая адрес необходимых данных. Примером использования такой адресации может служить команда записи содержимого аккумулятора в память по адресу 000Е16. Этот адрес, заданный в шестнадцатеричной форме, занимает второй и третий байт трехбайтовой команды. (Адреса задаются в шестнадцатеричной форме, а содержимое адресуемых областей памяти – в двоичной). Рисунок ниже иллюстрирует, что происходит при выполнении этой команды. Перед выполнением команды (рис.а) содержимое аккумулятора равно 10101010. В области памяти 0003 находится КОП команды записи содержимого аккумулятора в память, а область с адресами 0004 и 0005 содержит информацию о местоположении необходимых данных, т.е. адрес 000Е. После выполнения команды (рис. б) копия содержимого аккумулятора оказывается размещенной в области памяти с адресом 000Е.

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

 

Первая команда данной программы – очистка аккумулятора – расположена в области памяти 0000. Занимающая три следующих байта памяти вторая команда – это команда загрузки в аккумулятор содержимого области памяти с адресом 000Е, т.е. двоичного числа 01010101. Последняя команда – останов – занимает 1 байт памяти. Содержимому аккумулятора можно было бы присвоить значение 01010101 также и посредством команды загрузки с непосредственной адресацией, но в этом случае загруженные данные должны находится в областях памяти смежных с кодом операции этой команды. И если в дальнейшем эти же данные потребовались бы для другой команды, к ним трудно было бы получить доступ. При прямой адресации таких проблем не возникает, т.к. МП имеет возможность производить обращение к любой области памяти. В последнем примере, благодаря использованию команды с прямой адресацией любое количество команд программы может обращаться к области памяти с адресом 000Е. Проиллюстрируем это, расширив рассмотренную программу добавлением одной команды.

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

 

 

На содержимое регистра В не оказывает влияние не очистка аккумулятора, ни его загрузка двоичным числом 01010101. Команда загрузки регистра В помещает в последний копию тех же данных, которые загружены в аккумулятор.

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

В некоторых МП используется прямая адресация, реализуемая за три микроцикла. В таких случаях команда имеет длину 2 байт: один – для КОП, другой – для адреса. Но однобайтовый адрес не позволяет адресоваться  ко всем областям памяти объемом 65 К. Например, в 8-разрядном МП 8-битовое слово – 2-й байт команды с прямой адресацией – позволяет обращаться только к одной из 256 областей. Специальный КОП информирует, что такая команда имеет однобайтовый адрес. Обычно отсчет этих адресов в памяти начинается в области, адрес которой равен 0.

Диапазон значений, охватываемый такими 1-байтовыми адресами, принято называть нулевой страницей памяти. Так, адреса первых 256 областей памяти 8-разрядного МП принадлежит диапазону десятичных значений  от 0 до 255 (двоичных – от 00000000 до 11111111, шестнадцатеричных – от 00 до FF). При адресации 2-байтовым словом диапазон подобных десятичных значений простирается от 0 до 65535 (00000000000000002 – 11111111111111112, 000016-FFFF16). На рис. схематически изображены два описываемых диапазона адресов –1- и 2-байтовый.

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

В 16-разрядном МП с памятью объемом 65К прямая адресация предполагает использование только одного 16-битового слова, т.к. оно позволяет адресоваться к любой области указанной памяти. Набор команд 16-разрядного МП состоит из команд длиной в одно или два слова.

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

 

3.4. Косвенная адресация

 

Большинство МП располагает еще одним способом адресации к памяти, реализуемой командами длиной только в одно слово. Такая адресация называется косвенной или иногда косвенно-регистровой. Помимо КОП в такой команде указывается номер регистра, содержимое которого – адрес местоположения данных в памяти. Этим подобные команды отличаются от команд непосредственной адресации, содержащие данные в самих себе, или от команд прямой адресации, которые включают адреса этих данных. Так, при использовании косвенной адресации, в 8-разрядном МП соответствующая команда указывает, в какой регистровой паре размещается адрес местоположения данных в памяти.

Косвенная адресация.

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

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

Процедура, описываемая блок-схемой алгоритма, состоит из:

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

2.         Загрузка аккумулятора данными из порта ввода-вывода с номером 01. Выполняется соответствующей командой ввода данных.

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

4.         Увеличение содержимого регистровой пары ВС на 1. Выполнение этой операции необходимо для того, чтобы в регистровой паре оказался адрес области памяти, заполняемой следующей.

5.         переход к повторению загрузки аккумулятора очередными данными из порта ввода-вывода (возврат к блоку 2). Осуществляется после того, как регистр указывает адрес области памяти, «ожидающей» очередные данные. Содержимое регистра увеличивается каждый раз на 1. Если бы регистр перезагружался, механизм единичных приращений был бы нарушен и новые данные записывались бы в одну и ту же область.

 

3.5. Индексная адресация

 

На рисунке представлена видоизменённая структурная схема 8-разрядного МП. На этой схеме вместо регистровой пары ВС используется 16-разрядный индексный регистр. Очевидно, что схема стала немного проще.

 

 

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

a3.gif (5157 bytes)

 

Адрес i-того операнда в массиве определяется как сумма начального адреса массива операнда, задаваемого смещением S, и индекса I, записанного в одном из регистров регистровой памяти, называемым индексным регистром.

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

В каждом i-том цикле содержимое индексного регистра изменяется на постоянную величину, как правило, это 1.

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

Индексный регистр применяется для реализации адресации с индексированием. Такой способ адресации осуществляется посредством сложения 2-го байта команды с содержимым индексного регистра. Полученная при этом сумма используется в качестве адреса области памяти. По существу, это- команда, при выполнении которой используется адресация по регистру и последующее вычисление адреса области памяти. Фактически путем сложения определяется новой 16-разрядный номер области.

Прибавляемая к содержимому индексного регистра 8-разрядная величина может принимать значения в диапазоне от 00 до FF. Эту величину называют смещением. Смещение может иметь любое значение в диапазоне 010-25510. Следовательно, при некотором содержимом индексного регистра, выбирая значение смещения, можно адресовать 256 областей памяти.

Этот способ адресации может использоваться в каждой команде. Если, например, в МП вместо косвенной адресации по регистру используется адресация с индексированием, то команда ADI (Сложение  Аккумулятора  с  Областью Памяти При Косвенной Адресации По Регистру) заменяется  командой  ADD A, X (Сложение с Индексированием). Команда  ADD A, X  занимает в памяти 2 байт и выполняется за 5 циклов. Обычно, для выполнения команд при использовании адресации с индексированием требуется большое число микроциклов, чем для выполнения аналогичных команд с использованием косвенной адресации по регистру.

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

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

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

 

3.6. Относительная адресация

 

В каждой команде некоторых МП, главным образом 16-разрядных (и выше) может быть использована относительная адресация. В других МП данный способ адресации может быть применен только в нескольких командах.

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

1)      суммирование кодов составляющих адреса

и = Б + С;   Аи - И + С;   Аи = Б + И + С);

2)      совмещение (конкатенация) кодов составляющих адреса

(например   Аи = Б/С).

 

Базирование способом суммирования. В команде адресный код Ак разделяется на две составляющие: Аб - адрес регистра в регистровой памяти, в котором хранится база Б (базовый адрес); С - код смещения относительно базового адреса.

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

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

 

 

СМ – сумматор,

РАОП – регистр адреса ОП,

Б – база (базовый адрес),

С – смещение,

Аб – адрес регистра базы

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

Относительная адресация имеет много общего с адресацией с индексированием. Однако эти способы имеют различия. Во-первых, при использовании рассматриваемых способов адресации смещение складывается с содержимым разных регистров; при относительной адресации смещение прибавляется к текущему содержимому счетчика команд. Во-вторых, в режиме относительной адресации применяется специальная форма арифметических операций над числами, представленными в дополнительном коде. Применение такой “специальной арифметики” позволяет выполнить переходы в перед в тех случаях, когда в старшем разряде смещения содержится значение, равное логическому 0. Кроме того, оказывается возможным производить переходы назад, когда значение старшего разряда смещения равно 1. Смещение при этом рассматривается как число в дополнительном коде.

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

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

 

3.7. Команды работы со стеком

 

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

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

Следует помнить, что стек представляет собой устройство памяти, действующее по принципу LIFO ­- last in, first out (поступивший последним, обслуживается первым). Это означает, что данные загруженные в стек последними, будут извлекаться из стека первыми. Извлечение данных из стека происходит в порядке, обратном загрузке в стек.

Предположим, что программируется обращение к двум подпрограммам, одна из которых вызывает другую. Вызываемую подпрограмму будем называть подпрограммой второго уровня. На рисунке показано содержимое стека во время выполнения подпрограммы второго уровня. Байт стека со старшим адресом занимает область памяти с адресом 0F25. В качестве начальной области стека была выбрана произвольная область памяти, которая  не  должна  использоваться в других частях программы. Содержимое областей с адресами 0F25 и 0F24 равно адресу области главной программы. Этот адрес является адресом команды, следующей в главной программе за командой вызова подпрограммы. Области памяти с адресами 0F25 и 0F24 содержат соответственно МБ и СБ счетчика команд. Когда завершится выполнение подпрограммы, работа главной программы будет продолжена, начиная с команды, расположенной в области памяти с адресом 000С. При выборке данных из стека сначала будет извлечён старший, а затем младший байт счётчика команд.

 

Адрес
области
памяти

Программа

Стек

0F21

Следующий доступный элемент стека

 

0F22

Старший байт СК для первой подпрограммы

02

0F23

МБ СК для первой подпрограммы

01

0F24

СБ СК для главной подпрограммы

00

0F25

МБ СК для главной подпрограммы

 

Из рисунка также видно, что за командой вызова подпрограммы второго уровня в подпрограмме первого уровня следует команда с адресом 0201.

Допустим, что в рассматриваемом примере подпрограмма второго уровня обеспечивает умножение чисел с двойной точностью. Во время выполнения этой подпрограммы необходимо выделить временную область памяти, используемую при выполнении команды сдвига влево содержимого 3-байтового поля. На рисунке показано размещение каждого байта множимого, занимающего 3 байт памяти в стеке. На рисунке а) изображено состояние стека после пересылки в него младшего байта множимого. Указатель стека (-> на рисунке) определяет следующую свободную область стека. Состояние стека после загрузки в него второго байта множимого изображено на рисунке б, а после загрузки последнего (старшего) байта - на рисунке в.

  Адрес обл.

    памяти

0F1E

 

 

®

 

 

 

 

 

­

 

 

®

 

 

 

 

 

 

­

 

®

 

 

 

 

 

 

 

­

 

 

®

 

 

 

 

 

 

¯

 

 

 

®

 

 

 

 

 

¯

 

 

 

 

®

 

 

 

 

¯

 

0F1F

 

 

0D

 

 

 

0F20

 

C5

C5

C5

 

 

0F21

72

72

72

72

72

 

0F22

02

02

02

02

02

02

0F23

01

01

01

01

01

01

0F24

00

00

00

00

00

00

0F25

0C

0C

0C

0C

0C

0C

 

а)

б)

в)

г)

д)

е)

 

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

Рассмотренный пример позволяет сделать вывод о важности соблюдения как порядка, так и количества выполнений операций загрузки данных в стек и операций извлечения данных из стека. Предположим, что СБ множимого по ошибке не был извлечён из стека. Это могло произойти, если вызов подпрограммы умножения был произведён, когда стек имел состояние, подобное изображённому на рисунке а, а её завершение по каким-то причинам произошло, когда состояние стека было подобно состоянию, представленному на рисунке д. Тогда по завершению подпрограммы умножения из стека извлекаются  2 байт и помещаются в счётчик команд. Затем МП будет выполнять подпрограмму первого уровня. В нашем примере извлекаются 2 байт, значение которых даёт адрес области памяти, равный 7202. Однако, начальный адрес подпрограммы первого уровня равен 0201. Таким образом, при вызове подпрограммы будет использован неправильный адрес, что проведёт к нарушению функционирования МП системы.

Команда загрузки непосредственного операнда в указателе стека занимает используется для установки исходного состояния стека, что обеспечивается загрузкой в указателе стека адреса начальной области стека. Вспомним, что очередная доступная для использования область стека имеет меньший адрес по отношению к адресам других, занятых областей стека. Следовательно, команда загрузки непосредственного операнда в указатель стека будет использоваться для задания области стека с наибольшим адресом. 2-й байт команды определяет СБ указателя стека. МБ указателя стека задаётся 3-м байтом команды. При выполнении этой команды в регистре состояния будет устанавливаться в 1 разряд нулевого результата, если 16-разрядное загружаемое слово имеет значение 0, а разряд отрицательного результата, если старший разряд загружаемого в указатель стека слова имеет значение 1. Команда загрузки в указатель стека непосредственного операнда выполняется один раз перед началом работы со стеком.

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

 

4. Система команд процессора

В общем случае система команд процессора включает в себя следующие четыре основные группы команд:

1)      команды пересылки данных;

2)      арифметические команды;

3)      логические команды;

4)      команды переходов.

Команды пересылки данных не требуют выполнения никаких операций над операндами. Операнды просто пересылаются (точнее, копируются) из источника (Source) в приемник (Destination). Источником и приемником могут быть внутренние регистры процессора, ячейки памяти или устройства ввода/вывода. АЛУ в данном случае не используется.

Арифметические команды выполняют операции сложения, вычитания, умножения, деления, увеличения на единицу (инкрементирования), уменьшения на единицу (декрементирования) и т.д. Этим командам требуется один или два входных операнда. Формируют команды один выходной операнд.

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

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

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

У разных процессоров системы команд существенно различаются, но в основе своей они очень похожи. Количество команд у процессоров также различно. Например, у процессора МС68000 всего 61 команда, а у процессора 8086 – 133 команды. У современных мощных процессоров количество команд достигает нескольких сотен. В то же время существуют процессоры с сокращенным набором команд (так называемые RISC-процессоры), в которых за счет максимального сокращения количества команд достигается увеличение эффективности и скорости их выполнения.

Рассмотрим теперь особенности четырех выделенных групп команд процессора более подробно.

4.1. Команды пересылки данных

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

1)      загрузка (запись) содержимого во внутренние регистры процессора;

2)      сохранение в памяти содержимого внутренних регистров процессора;

3)      копирование содержимого из одной области памяти в другую;

4)      запись в устройства ввода/вывода и чтение из устройств ввода/вывода.

В некоторых процессорах (например, Т-11) все эти функции выполняются одной единственной командой MOV (для байтовых пересылок – MOVB) но с различными методами адресации операндов.

В других процессорах помимо команды MOV имеется еще несколько команд для выполнения перечисленных функций. Например, для загрузки регистров могут использоваться команды загрузки, причем для разных регистров – разные команды (их обозначения обычно строятся с использованием слова LOAD – загрузка). Часто выделяются специальные команды для сохранения в стеке и для извлечения из стека (PUSH – сохранить в стеке, POP – извлечь из стека). Эти команды выполняют пересылку с автоинкрементной и с автодекрементной адресацией (даже если эти режимы адресации не предусмотрены в процессоре в явном виде).

Иногда в систему команд вводится специальная команда MOVS для строчной (или цепочечной) пересылки данных (например, в процессоре 8086). Эта команда пересылает не одно слово или байт, а заданное количество слов или байтов (MOVSB), то есть инициирует не один цикл обмена по магистрали, а несколько. При этом адрес памяти, с которым происходит взаимодействие, увеличивается на 1 или на 2 после каждого обращения или же уменьшается на 1 или на 2 после каждого обращения. То есть в неявном виде применяется автоинкрементная или автодекрементная адресация.

В некоторых процессорах (например, в процессоре 8086) специально выделяются функции обмена с устройствами ввода/вывода. Команда IN используется для ввода (чтения) информации из устройства ввода/вывода, а команда OUT используется для вывода (записи) в устройство ввода/вывода. Обмен информацией в этом случае производится между регистром-аккумулятором и устройством ввода/вывода. В более продвинутых процессорах этого же семейства (начиная с процессора 80286) добавлены команды строчного (цепочечного) ввода (команда INS) и строчного вывода (команда OUTS). Эти команды позволяют пересылать целый массив (строку) данных из памяти в устройство ввода/вывода (OUTS) или из устройства ввода/вывода в память (INS). Адрес памяти после каждого обращения увеличивается или уменьшается (как и в случае с командой MOVS).

Также к командам пересылки данных относятся команды обмена информацией (их обозначение строится на основе слова Exchange). Может быть предусмотрен обмен информацией между внутренними регистрами, между двумя половинами одного регистра (SWAP) или между регистром и ячейкой памяти.

 

4.2. Арифметические команды

Арифметические команды рассматривают коды операндов как числовые двоичные или двоично-десятичные коды. Эти команды могут быть разделены на пять основных групп:

1)      команды операций с фиксированной запятой (сложение, вычитание, умножение, деление);

2)      команды операций с плавающей запятой (сложение, вычитание, умножение, деление);

3)      команды очистки;

4)      команды инкремента и декремента;

5)      команда сравнения.

Команды операций с фиксированной запятой работают с кодами в регистрах процессора или в памяти как с обычными двоичными кодами. Команда сложения (ADD) вычисляет сумму двух кодов. Команда вычитания (SUB) вычисляет разность двух кодов. Команда умножения (MUL) вычисляет произведение двух кодов (разрядность результата вдвое больше разрядности сомножителей). Команда деления (DIV) вычисляет частное от деления одного кода на другой. Причем все эти команды могут работать как с числами со знаком, так и с числами без знака.

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

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

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

Наконец, команда сравнения (обозначается CMP) предназначена для сравнения двух входных операндов. По сути, она вычисляет разность этих двух операндов, но выходного операнда не формирует, а всего лишь изменяет биты в регистре состояния процессора (PSW) по результату этого вычитания. Следующая за командой сравнения команда (обычно это команда перехода) будет анализировать биты в регистре состояния процессора и выполнять действия в зависимости от их значений. В некоторых процессорах предусмотрены команды цепочечного сравнения двух последовательностей операндов, находящихся в памяти (например, в процессоре 8086 и совместимых с ним).

 

4.3. Логические команды

Логические команды выполняют над операндами логические (побитовые) операции, то есть они рассматривают коды операндов не как единое число, а как набор отдельных битов. Этим они отличаются от арифметических команд. Логические команды выполняют следующие основные операции:

1)      логическое И, логическое ИЛИ, сложение по модулю 2 (Исключающее ИЛИ);

2)      логические, арифметические и циклические сдвиги;

3)      проверка битов и операндов;

4)      установка и очистка битов (флагов) регистра состояния процессора (PSW).

Команды логических операций позволяют побитно вычислять основные логические функции от двух входных операндов. Кроме того, операция И (AND) используется для принудительной очистки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие очистки, установлены в нуль). Операция ИЛИ (OR) применяется для принудительной установки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие установки в единицу, равны единице). Операция "Исключающее ИЛИ" (XOR) используется для инверсии заданных битов (в качестве одного из операндов при этом применяется код маски, в котором биты, подлежащие инверсии, установлены в единицу). Команды требуют двух входных операндов и формируют один выходной операнд.

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

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

Команды проверки битов и операндов предназначены для установки или очистки битов регистра состояния процессора в зависимости от значения выбранных битов или всего операнда в целом. Выходного операнда команды не формируют. Команда проверки операнда (TST) проверяет весь код операнда в целом на равенство нулю и на знак (на значение старшего бита), она требует только одного входного операнда. Команда проверки бита (BIT) проверяет только отдельные биты, для выбора которых в качестве второго операнда используется код маски. В коде маски проверяемым битам основного операнда должны соответствовать единичные разряды.

Наконец, команды установки и очистки битов регистра состояния процессора (то есть флагов) позволяют установить или очистить любой флаг, что бывает очень удобно. Каждому флагу обычно соответствуют две команды, одна из которых устанавливает его в единицу, а другая сбрасывает в нуль. Например, флагу переноса C (от Carry) будут соответствовать команды CLC (очистка) и SEC или STC (установка).

 

4.4. Команды переходов

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

Команды переходов без возврата делятся на две группы:

1)      команды безусловных переходов;

2)      команды условных переходов.

В обозначениях этих команд используются слова Branch (ветвление) и Jump (прыжок).

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

Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий. В качестве таких условий обычно выступают значения флагов в регистре состояния процессора (PSW). То есть условием перехода является результат предыдущей операции, меняющей значения флагов. Всего таких условий перехода может быть от 4 до 16.

Несколько примеров команд условных переходов:

1)      переход, если равно нулю;

2)      переход, если не равно нулю;

3)      переход, если есть переполнение;

4)      переход, если нет переполнения;

5)      переход, если больше нуля;

6)      переход, если меньше или равно нулю.

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

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

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

Команды переходов с дальнейшим возвратом в точку, из которой был произведен переход, применяются для выполнения подпрограмм, то есть вспомогательных программ. Эти команды называются также командами вызова подпрограмм (распространенное название – CALL). Использование подпрограмм позволяет упростить структуру основной программы, сделать ее более логичной, гибкой, легкой для написания и отладки. В то же время надо учитывать, что широкое использование подпрограмм, как правило, увеличивает время выполнения программы.

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

Для обратного возврата в точку вызова подпрограммы (точку перехода) используется специальная команда возврата (RET или RTS). Эта команда извлекает из стека значение адреса команды перехода и записывает его в регистр-счетчик команд.

Особое место среди команд перехода с возвратом занимают команды прерываний (распространенное название – INT). Эти команды в качестве входного операнда требуют номер прерывания (адрес вектора). Обслуживание таких переходов осуществляется точно так же, как и аппаратных прерываний. То есть для выполнения данного перехода процессор обращается к таблице векторов прерываний и получает из нее по номеру прерывания адрес памяти, в который ему необходимо перейти. Адрес вызова прерывания и содержимое регистра состояния процессора (PSW) сохраняются в стеке. Сохранение PSW – важное отличие команд прерывания от команд переходов с возвратом.

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

Для возврата из подпрограммы, вызванной командой прерывания, используется команда возврата из прерывания (IRET или RTI). Эта команда извлекает из стека сохраненное там значение счетчика команд и регистра состояния процессора (PSW).

Отметим, что у некоторых процессоров предусмотрены также команды условных прерываний, например, команда прерывания при переполнении.