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

2.5. Регистры

Процессор имеет 13 16-битных регистров и 9 однобитных флажков (флажки NT и IOPL предназначены только для виртуального режима). Мы разделим регистры на четыре набора: три набора содержат по четыре регистра, а непосредственно недоступный программисту указатель коман­ды образует отдельный набор. Регистры и флажки показаны на рис. 2.7. Регистры общего назначения служат, в основном, для хранения операндов арифметических и логических операций; указательные и индексные регистры предназначены для хранения внутрисегментных смещений, а сегментные регистры определяют начальные адреса сегментов.

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

РОНы в процессоре 80286 представлены 16-битными регистрами АХ, ВХ, СХ и DX. Младшую и старшую половины каждого РОНа можно использо­вать либо отдельно (как два 8-битных регистра), либо совместно (как один 16-битный регистр). В связи с этим каждой половине РОНа дано свое название: младшие (Low) половины называются AL, BL, CL и DL, а старшие (High) - АН, ВН, СН и DH. Двойственный характер РОНов позволяет одина­ково легко оперировать байтами и словами.

Большей частью содержимое РОНов единообразно участвует в арифме­тических и логических операциях. Например, по команде ADD (сложить) можно прибавить содержимое любого 8- или 16 битного РОНа к содержимо­му любого другого РОНа такого же размера и сохранить результат в любом из них. Однако в некоторых командах функции РОНов специализированы. Например, в цепочечных командах регистр СХ должен хранить число элементов цепочки; для этого нельзя привлекать регистры АХ, ВХ и DX. Такая специализация предопределяет описательное название регистра СХ - СЧЕТЧИК. Специальные функции регистров АХ, ВХ и DX (см. далее) объясняют их названия: АККУМУЛЯТОР, БАЗА и ДАННЫЕ.

Специализация РОНов затрудняет изучение процессора из-за необходи­мости помнить специальные правила. Она же несколько увеличивает длину программ, так как до выполнения некоторых команд приходится пересылать данные из одного РОНа в другой. Однако рассмотрим разработ­ку программы для процессора, в котором все РОНы одинаковы. Чтобы следить за ее выполнением, нам, вероятно, придется организовать про­грамму так, чтобы определенные данные всегда находились в конкретных регистрах. Например, можно договориться всегда использовать регистр СХ для учета числа - элементов цепочки. Тогда нам никогда не придется пересылать размер цепочки в регистр СХ, так как он всегда будет там. Но поскольку цепочечная команда в нашем гипотетическом процессоре может получать размер цепочки из любого РОНа, каждая цепочечная команда должна указывать, где находится размер цепочки. Для этого придется, либо увеличить длину каждой цепочечной команды (два байта вместо одного), либо ввести больше однобайтных цепочечных команд. Первое решение прямо ведет к увеличению программы, а второе имеет такие же последствия. Действительно, всего может быть только 256 одно­байтных команд, и увеличение числа однобайтных цепочечных команд заставит удлинить другие однобайтные команды до двух байт. Таким образом, специализация РОНов в некоторых командах уменьшает длину программы.

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

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

К указательным и индексным регистрам процессора 80286 относятся 16-битные регистры SP, BP, SI и DI, которые обычно содержат внутрисег­ментные смещения. Например, в команде ADD один из операндов может находиться в текущем сегменте, данных со смещением, содержащимся в одном из указательных или индексных регистров, скажем SI.

Помимо сокращения длины команд рассматриваемые регистры выпол­няют еще одну (возможно, более важную функцию): они позволяют коман­дам обращаться к ячейкам, смещения которых являются результатом предыдущих вычислений в ходе выполнения программы. Такие вычисле­ния часто требуются (особенно в программах на языках высокого уровня) для того, чтобы установить смещения переменных. Требуемые вычисления можно осуществить в РОНах, а затем переслать результат в указательный или индексный регистр для использования его как смещения. Если устра­нить подобные пересылки, программы будут короче. Поэтому содержимое указательных и индексных регистров может участвовать в арифметичес­ких и логических операциях наряду с 16-битными РОНами. Например, в упомянутой выше команде ADD вторым операндом может быть содержи­мое регистра SI.

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

В некоторых командах учитывается различие между двумя базовыми регистрами SP и ВР. Например, в командах PUSH и POP смещение верхнего

элемента стека берется из регистра SP, что объясняет его название УКАЗА­ТЕЛЬ СТЕКА. Использовать для этой цели регистр ВР нельзя. Этот регистр содержит смещение "базы" области данных в сегменте стека, поэтому и называется УКАЗАТЕЛЕМ БАЗЫ.

Кроме того, в цепочечных командах существует различие между индексными регистрами SI и DI. Предполагается, что смещение операн­да-источника содержится в регистре SI, а операнда-приемника - в регистре DI. Этим объясняется название этих регистров ИНДЕКС ИСТОЧНИКА и ИНДЕКС ПРИЕМНИКА. Функции регистров SI и DI в цепочечных командах изменить нельзя. Например, команда пересылки цепочки передает цепоч­ку из текущего сегмента данных со смещением из регистра SI в текущий дополнительный сегмент со смещением из регистра DI; регистры SI и DI в команде явно не указываются. (Цепочка-приемник находится в дополнительном сегменте, а не в сегменте данных, поэтому у каждой цепочки есть свой сегмент и длина ее может доходить до 216 байт.)

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

В процессоре 80286 для задания текущих сегментов предназначены четыре 16-битных сегментных регистра CS, DS, SS и ES. Каждый регистр идентифицирует конкретный текущий сегмент и функции их совершенно различны: CS идентифицирует текущий сегмент кода, DS - текущий сегмент данных, SS - текущий сегмент стека и ES - текущий дополнитель­ный сегмент (данных).

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

Выборки всех команд осуществляются из текущего сегмента кода, поэтому нужен регистр, содержащий смещение следующей выполняемой команды в текущем сегменте кода. Эту функцию выполняет регистр IP -УКАЗАТЕЛЬ КОМАНДЫ. Если, например, регистр CS содержит 1FF7, а регистр IP - 003А, то следующая выполняемая команда выбирается из ячейки 1FFАА:

+1FF70 (начальный адрес сегмента кода)

003А (смещение в регистре IP)

1FFАА (адрес следующей команды)

Напомним, что для образования адреса памяти к содержимому регист­ра CS "пристраивается" шестнадцатеричная цифра 0 (см. рис. 2.5).

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

если в вычислении смещения участвует указательный регистр, то привлекается текущий сегмент стека;

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

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

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

Рассмотрим команду ADD, один из операндов которой находится в сегменте данных, а смещение содержится в регистре SI. Команда должна указать регистр SI в своем поле операнда, но может не определять регистр DS. При выполнении команды процессор знает, что для локализации операнда необходимо использовать содержимое регистров DS и SI. Теперь обратимся к команде ADD, один из операндов которой находится в сегмен­те кода (им, например, может быть константа), а смещение содержится в регистре SI. Команда ADD, как и раньше, должна определить регистр SI в поле операнда; при выполнении же команды ей должен предшествовать байт префикса, идентифицирующий регистр CS.

Флажки. Процессор 80286 имеет 9 флажков, которые применяются для регистрации состояния (флажки состояния) и управления действиями процессора (флажки управления). Флажки состояния обычно устанавлива­ются после выполнения арифметических и логических команд, отражая определенные свойства их результатов. К ним относятся:

флажок переноса CF, показывающий перенос из старшего бита;

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

флажок переполнения OF, определяющий выход знакового результата за границы диапазона;

флажок нуля ZF, показывающий нулевой результат команды;

флажок знака SF, регистрирующий отрицательный результат;

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

К флажкам управления относятся флажок направления DF (показывает направление прохождения цепочек в цепочечных командах), флажок разрешения прерываний IF (разрешает или запрещает восприятие прерыва­ний по входу INTR) и флажок трассировки TF (переводит процессор в пошаговый режим для отладки программы).