Вход в систему

Лекции по курсу "Проектирование ассемблеров, компоновщиков, макропроцессоров"

5. Программная модель процессора Intel 8086

 

Процессор интересует нас, прежде всего, как набор регистров.

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

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

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

  • регистры общего назначения (AX, BX, CX, DX, SI, DI, BP, SP);
  • сегментные регистры (CS, DS, SS, ES);
  • указатель команд (IP);
  • регистр флагов (Flags).
Приведем расшифровку названий регистров:

AX   accumulator, аккумулятор;
BX   base, база;
CX   counter, счетчик;
DX   data, данные;

(буква X - от слова eXtended, расширенный: в процессоре 8080 были байтовые регистры A, B, C и D, но затем их расширили до размера слова)

SI   source index, индекс источника;
DI   destination index, индекс приемника;
BP   base pointer, указатель базы;
SP   stack pointer, указатель стека;

IP   instruction pointer, указатель команд;

SS   stack segment, сегмент стека;
DS   data segment, сегмент данных;
CS   code segment, сегмент команд;
ES   extra segment, дополнительный сегмент.

Регистры общего назначения

Особенностью регистров общего назначения является то, что их можно использовать в любых арифметических, логических и т.п. машинных операциях. Например, можно сложить число из регистра DI с числом из регистра SP (add  DI,SP) или вычесть из содержимого регистра BP содержимое регистра CX (sub   BP,CX).

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

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

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

Регистры AX, BX, CX и DX устроены так, что возможен независимый доступ к их старшей и младшей половинам. Обозначают эти половины буквами H (high - выше, старший) и L (low - ниже, младший) и первой буквой из названия регистра: AH и AL - в AX, BH и BL - в BX и т.д.

Отметим, что на части делятся только регистры AX, BX, CX и DX. Запись же в другие регистры и чтение из них осуществляются только целиком.

 

Сегментные регистры

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

Если в оперативной памяти ЭВМ имеется 2k ячеек, то для ссылок на эти ячейки нужны k-разрядные адреса (абсолютные или физические адреса). Ясно, что при большом объеме памяти большим будет и размер абсолютных адресов, а это ведет к увеличению длины команд, к увеличению размера программы в целом. Это плохо. Чтобы сократить размеры команд поступают следующим образом.

Память условно делят на участки, которые принято называть сегментами. Начальные адреса сегментов (эти адреса называются базами) могут быть любыми, но на длины сегментов накладывается ограничение: размер любого сегмента не должен превосходить, скажем, 2m ячеек, где m < k.

В этих условиях абсолютный адрес A любой ячейки памяти можно представить в виде суммы A=B+ofs, где B - база сегмента, к которому относится ячейка A, а ofs - смещение (offset) или относительный адрес ячейки, т.е. ее адрес, отсчитанный от начала сегмента, от адреса B.

Ограничение размера сегментов означает, что 0 ≤ ofs ≤ 2m-1, и потому для записи смещений достаточно m разрядов. Следовательно, большая часть адреса A приходится на базу B, а ofs -лишь небольшой добавок. Учитывая это, поступаем следующим образом. Если в команде надо указать абсолютный адрес A, то базу B помещаем в некоторый регистр R, а в команде указываем лишь этот регистр и меньшее слагаемое ofs.

Процессор I8086 мог работать с 1 Мб памяти, т.е. 220 байтов (k=20), поэтому абсолютные адреса 20-разрядные. Размер сегмента должен быть равен 64 Кб, т.е. 216 байтов (m=16), поэтому смещения (или эффективный адрес) - это 16-разрядные адреса.

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

 

Указатель команд

В регистре IP всегда находится адрес команды, которая должна быть выполнена следующей. Более точно, в IP находится адрес этой команды, отсчитанный от начала сегмента команд, на начало которого указывает регистр CS.

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

 

Регистр флагов

Флаг - это бит, принимающий значение 1 ("флаг установлен") или значение 0 ("флаг сброшен"). В i8086 используется 9 флагов, собранных в один 16-разрядный регистр, называемый регистром флагов (Flags). Некоторые разряды регистра не заняты.

Флаги делятся на две группы: флаги условий (они автоматически меняются при выполнении команд и фиксируют те или иные свойства их результата (например, равен ли он нулю)) и флаги состояний (их меняет программа; состояние этих флагов оказывает влияние на дальнейшее поведение процессора).

Флаги условий:

  • CF   (carry flag) - флаг переноса. Наиболее полезен в арифметических операциях над числами без знака; например, если при сложении беззнаковых чисел получилась слишком большая сумма - с единицей переноса, которой нет места в ячейке, тогда флаг CF принимает значение 1, а если сумма "укладывается" в размер ячейки, то значением CF будет 0.

  • OF   (overflow flag) - флаг переполнения. Полезен в арифметических операциях над числами со знаком; например, если при сложении или вычитании знаковых чисел получился результат, по модулю превосходящий допустимую величину (произошло переполнение мантиссы), тогда флаг OF получает значение 1, а если переполнения мантиссы не было - значение 0.

  • ZF   (zero flag) - флаг нуля. Устанавливается в 1, если результат команды оказался нулевым.

  • SF   (sign flag) - флаг знака. Устанавливается в 1, если в операции над знаковыми числами получился отрицательный результат.

  • PF   (parity flag) - флаг четности. Равен 1 , если в 8 младших битах результата очередной команды содержится четное количество двоичных единиц.

  • AF   (auxiliary carry flag) - флаг дополнительного переноса. Фиксирует особенности выполнения операций над двоично-десятичными числами.

Флаги состояний:

  • DF   (direction flag) - флаг направления. Устанавливает направление просмотра строк в строковых командах: при DF=0 строки просматриваются "вперед" (от начала к концу), при DF=1 - в обратном направлении.

  • IF   (interrupt flag) - флаг прерываний. При IF=0 процессор перестает реагировать на поступающие к нему прерывания, а при IF=1 блокировка прерываний снимается.

  • TF   (trace flag) - флаг трассировки. При TF=1 после выполнения каждой команды процессор делает прерывание, чем можно воспользоваться при отладке программы.
Введение
Причины использования языка ассемблер
Причины неиспользования языка ассемблер
Синтаксис ассемблера
Системное программное обеспечение и структура ЭВМ
Программная модель процессора Intel 8086
Организация работы памяти
Операнды
Адресация операндов
Формат машинных команд
Команды переходов
Типы ассемблеров. Функции ассемблера
Ассемблер по схеме 1А / ОП
Ассемблер по схеме 1А / МД
Двухпросмотровый ассемблер
Многопросмотровый ассемблер
Загрузчик
Структура объектных файлов. Основные понятия
Идентификация модуля и атрибуты
Концепция привязки
Объектный файл. Последовательность записей
Объектный файл. Формат записей
Формат записей THEADR и LHEADR
Формат записи LNAMES
Формат записи SEGDEF
Формат записи GRPDEF
Формат записи PUBDEF
Формат записи COMDEF
Формат записи LOCSYM
Формат записи EXTDEF
Формат записи LINNUM
Формат записи LEDATA
Формат записи LIDATA
Формат записи FIXUPP
Формат записи MODEND
Формат записи комментариев


исполнялось 0,299791 c, запросов к базе 6