logo
Лекции препода / Конспект лекций ЭВМ

2.7. Замечания о режимах адресации

После знакомства с режимами адресации возникают следующие вопросы:

1. Нужно ли практически пользоваться полями mod, reg, r/т, w, s, d и др. при использовании любой команды с операндами?

2. Зачем предусмотрено так много режимов адресации?

Ответ на первый вопрос отрицательный, если, конечно, вы не собирае­тесь писать программу на машинном языке. Имея такие средства про­граммирования, как Ассемблер или компилятор, вам никогда не придется обращаться к полям mod, reg, rи др.; любой Ассемблер или компилятор освободит вас от этих деталей.

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

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

А(i) = Х

Он читается так: "i-й элемент А становится равным X". Его можно преобразовать в команды, которые пересылают содержимое ячейки памяти, соответствующей простой переменной X, в регистр, например BL, а затем пересылают содержимое BL в ячейку памяти, соответствующую i-му элементу массива А. Пусть X - это содержимое ячейки со смещением 0FF0 в текущем сегменте данных, а А(0) - это первый элемент массива А со смещением 0FF1 в этом же сегменте. Машинная команда, которая пересылает X в регистр BL, показана на рис. 2.24, а. В ней с помощью специальной комбинации полей mod и r задается прямая адресация памяти. Поскольку обращения к простым переменным (таким, как X) встречаются часто, неудивительно наличие такого режима адресации. На рис. 2.24, б показана машинная команда, которая передает содержимое регистра BL в ячейку А (I). Здесь предполагается, что в индексном регист­ре уже находится значение индекса I. Подобные обращения к массиву показывают необходимость режима косвенной адресации памяти "индекс­ный регистр + смещение (в команде)". Операторы присваивания вида A(I) - B(J) требуют, по крайней мере, двух индексных регистров с указан­ным выше режимом адресации "SI + смещение (в команде)" и "DI + смеще­ние (в команде)". Такие обращения к массиву, как А (I + 2), не встречают дополнительных сложностей; поле смещения в команде на рис. 2.24, б будет просто содержать 0FF3, т.е. смещение А(2), а не смещение А(0).

В некоторых языках высокого уровня применяются указатели. Указа­тель - это переменная, содержащая адрес памяти некоторой другой переменной, которую мы назовем указываемой или адресуемой. Если значение указателя (т.е. значение в ячейке памяти, соответствующей указателю) изменяется, указываемая переменная будет соответствовать другой ячейке памяти. Удобный доступ к указываемой переменной заключается в том, чтобы поместить значение указателя в регистр ВХ, а затем воспользоваться режимом адресации с привлечением ВХ, т.е. режим "ВХ" следует применять для обращения к простой указываемой перемен­ной (простой переменной, адресуемой указателем), а режимы "ВХ + SI" и "ВХ + DI" - к элементу в указываемом массиве (массиве, адресуемом указателем).

В языках высокого уровня применяются также записи. Под записью (иногда называемой структурой) понимается набор именованных элемен­тов данных, возможно, различных типов. Запись не совпадает с понятием массива, представляющего собой последовательность (наименованных) элементов данных одного и того же типа. Например, в программе начисле­ния заработной платы имеются записи, соответствующие каждому работ­нику. Запись может содержать фамилию работника, номер страхового полиса, год поступления на работу и почасовую ставку. Конкретный элемент записи, например год поступления на работу, находится в одной и той же позиции во всех записях. Если, например, эта информация находит­ся в четвертом байте от начала записи и запись для Джона Доу начинается со смещением 0ЗВ4, то год поступления на работу этого сотрудника содер­жится в ячейке памяти со смещением 0ЗВ7. Следовательно, положение любого элемента в записи фиксировано, и к нему можно обратиться с помощью прямой адресации; по существу, здесь нет отличий от простой переменной.

Рассмотрим теперь указываемую запись и предположим, что указа­тель записи находится в регистре ВХ. Режим адресации для обращения к элементу такой записи имеет вид "ВХ + смещение (в команде)", причем смещение в команде соответствует позиции элемента в записи. Например, для указываемой записи о работнике смещение (в команде) байта о годе поступления на работу равно 3. Если запись невелика (менее 256 байт), для смещения в команде достаточно S бит и можно использовать режим с mod = 01.

Хотя режим адресации операнда для обращения к элементу указывае­мой записи похож на режим обращения к элементу массива (оба они имеют вид "регистр + смещение (в команде)", между ними имеется суще­ственная разница. В случае массива элементов смещение в команде соответствует началу массива, а регистр - расстоянию в массиве. В случае же указываемых записей регистр соответствует началу записи, а смещение в команде - расстоянию в записи. Рассмотрим массив, в котором каждый элемент является записью о работнике. Более того, будем считать, что это указываемый массив. Предположим, что указатель находится в регистре ВХ, а индекс, соответствующий элементу массива, в регистре SI. Тогда режим адресации для доступа к элементу года поступления конкретной записи имеет вид "ВХ + SI + смещение (в команде)", где смещение в команде равно 3. Такая ситуация оправдывает наличие в процессоре 80286 наиболее сложного режима адресации "базовый регистр + индексный регистр + смещение (в команде)".

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

процедура вызывает саму себя;

процедура вызывается некоторой другой процедурой, которая, в свою очередь, вызвана первоначальной процедурой;

выполнение процедуры было приостановлено из-за прерывания, а при обработке прерывания эта же процедура была вызвана вновь.

Все используемые реентрантной процедурой данные (локальные пере­менные и параметры) должны иметь уникальное размещение в памяти для каждого параллельного вызова процедуры, иначе данные, используемые одним вызовом процедуры, будут разрушены последующим вызовом. Это означает, что при каждом вызове процедуры для ее данных нужно распре­делять память. Такая область памяти называется стековым кадром (подробнее см. гл. 3). Конечно, весьма желательно, чтобы при своем завершении процедура освобождала бы эту область памяти. Поскольку последняя вызванная процедура заканчивается первой, удобным местом для распределения памяти оказывается стек. При каждом вызове про­цедуры для стекового кадра резервируется блок памяти в вершине стека путем простого изменения содержимого регистра SP. При выполнении процедуры необходим указатель начала стекового кадра, функции кото­рого выполняет регистр ВР. К элементам внутри стекового кадра можно обращаться в режимах адресации с привлечением регистра ВР. Например, к простой переменной в стековом кадре можно обратиться в режиме "ВР + смещение (в команде)", а к элементу массива - в режиме "ВР + SI + + смещение (в команде)". Поскольку в образовании адреса участвует регистр ВР, обращение происходит к текущему сегменту стека (а не к текущему сегменту данных), в котором и находится стековый кадр.

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

Таблица 2.5 Применение прямого и косвенного режимов адрсации в языках высокого уровня

Данные

Не указываемая

Указываемая

Стековый кадр

Простая переменная

Прямая

BX

BP + смещение

Массивы

SI + смещение

BX + SI

BP + SI + смещение

DI + смещение

BX + DI

BP + DI + смещение

Записи

Прямая

BX + смещение

BP + смещение

Массивы записей

SI + смещение

BX + SI + смещение

BP + SI + смещение

DI + смещение

BX + DI + смещение

BP + DI + смещение

Под «смещением» понимается смещение в команде

ЗАКЛЮЧЕНИЕ

Мы рассмотрели структуру процессора 80286 и формат команд. В следующей лекции мы обратимся к самим командам.

Процессор 80286, работающий в реальном режиме, практически анало­гичен микропроцессору 8086, поэтому литературные источники по микро­процессору 8086 относятся и к процессору 80286.

Центральный процессор

При разработке структуры блока ЦП возникают задачи разделения (демультиплексирования) шины адреса/данных (ШАД), буферирования шин адреса (ША) и шин данных (ШД), а также формирования системных управляющих сигналов для блоков памяти и внешних устройств.

Первая задача решается с помощью ИС К1810ИР82/83, выполняющих функции адресной защелки. Так как сигнал ВНЕ формируется в том же интервале времени, что и адресные сигналы, то его также необходимо зафиксировать в защелке. Поэтому изображенные на рис. 4 два 8-битовых регистра К1810ИР82 обеспечивают запоминание 15 разрядов адреса. Для доступа к па­мяти максимальной емкостью 1 Мбайт необходимо подключить еще один ре­гистр, на который подаются оставшиеся старшие разряды AD15, A19/S 6 — A16/S3.

Вторая задача решается с помощью двунаправленных 8-битовых шинных формирователей К1810ВА86/87, которые усиливают сигналы системной шины данных.

Третья задача может быть решена с помощью комбинационных логических схем, которые формируют требуемые управляющие сигналы на основе сигналов RD, WR и M/IO, вырабатываемых МП. Если в системе используется адресное пространство ввода — вывода, изолированное от пространства памяти, то целе­сообразно сформировать сигналы, аналогичные сигналам на выходах системно­го контроллера К580ВК28: MEMR, MEMW, IOR, IOW. Эти сигналы управляют запоминающими и внешними устройствами подобно тому, как это делается в системах, построенных на основе МП К580ВМ80. Роль формирователей сигналов могут выполнять элементы ИЛИ-НЕ (рис. 4) или дешифратор на три входа (например, К155ИД7). Если же в МПС ввод — вывод организован с отображением на память, то сигнал М/IO не используется и на ЗУ и ВУ пода­ются сигналы RD и WR после усиления.

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

рис. 4 Схема ЦП на баз МП К1810ВМ86 в минимальном режиме