Язык программирования Ассемблер, страница 2

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

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

Регистр сегмента стека (SS) всегда содержит адрес размещения стека в Оперативной Памяти (ОЗУ). Размер стека не может превышать 4ГБ, что соответствует максимальному размеру сегмента в оперативной памяти для процессора i486 и более высоких моделей. В каждый момент времени программе доступен лишь один сегмент стека.

 Регистр указателя стека (ESP)  содержит относительный адрес вершины стека в текущем сегменте стека. Его значение используется командами POP и PUSH, при вызове подпрограмм и при возврате, исключениями и прерываниями. При занесении элемента в стек, процессор уменьшает значение регистра ESP, а затем записывает элемент по адресу новой вершины. При извлечении данных из стека, процессор копирует элемент, расположенный по адресу вершины, а затем увеличивает значение регистра указателя стека. Иными словами, стек растет вниз, в сторону уменьшения адресов.

 Регистр указателя базы кадра стека (EBP), как правило, используется для доступа к структурам данных, содержащимся в стеке. Например, при входе в подпрограмму, стек содержит адрес возврата и некоторое число параметров, передаваемых в данную подпрограмму. Подпрограмма, при необходимости создания временных локальных переменных, использует стек, что приводит к изменению указателя стека по мере занесения и удаления данных в стеке. Если перед началом выполнения операций со стеком указатель копируется в базовый указатель кадра стека, последний может быть использован для доступа к данным, имеющим фиксированное смещение в сегменте стека. Если этого не делать, доступ к структурам данных, имеющим фиксированное смещение, может быть утерян в процессе занесения в стек и удаления из стека временных переменных. При использовании регистра EBP (BP) для хранения адреса памяти, текущий сегмент обязательно должен быть выбран (установлен регистр SS). Т.к. нет необходимости указывать сегмент стека в каждой команде, их кодирование становится более компактным. Регистр EBP (BP) может также использоваться для адресации других сегментов. Такие команды как ENTER и LEAVE предусматривают автоматическое использование регистра EBP (BP) для обеспечения удобного доступа к переменным.

Содержимое регистров флагов представлено в следующей таблице

№ бита

Название флага

Назначение

0

CF – Carry Flag

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

1

1

Всегда равен 1.

2

PF – Parity Flag

Флаг Четности равен 1, если результат операции – число с четным числом бит, 0 – в противном случае.

3

0

При нормальной работе машины всегда равен 0.

4

AF – Auxiliary Carry Flag

Флаг Дополнительного Переноса равен 1, если произошел перенос или заем для третьего бита результата. Он автоматически используется в командах коррекции результата при операциях двоично-десятичной арифметики.

5

0

При правильной работе оборудования всегда равен нулю.

6

ZF – Zero Flag

Флаг Нуля равен 1, если результат операции равен нулю, и равен 1, если результат не нулевой.

7

SF – Sign Flag

Флаг Знака дублирует самого старшего бита результата. Этот бит равен нулю для положительных чисел и 1 для отрицательных чисел.

8

TF – Trap Flag

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

9

IF – Interrupt Flag

Флаг разрешения Прерывания определяет, можно ли прервать ход выполнения программы в ответ на запрос прерывания от внешнего устройства. Если этот флаг равен 1, такие прерывания разрешены, в противном случае этот флаг равен 0.STI устанавливает IF в 1. CLI устанавливает IF в 0.

10

DF – Destination Flag

Флаг Направления используется в командах работы со строками и показывает, как будут автоматически изменяться содержимое индексных регистров SI и DI. Если этот флаг равен 0, содержимое будет увеличиваться, (строка обрабатывается слева направо), если он равен 1, то содержимое регистров будет уменьшаться, (строка обрабатывается справа налево). Команда STD устанавливает DF в 1. Команда CLDустанавливает DF в 0.

11

OF – Overflow Flag

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

12 - 13

IP - OL

Уровень привилегий ввода/вывода.

14

NT

Флаг вложенной задачи.

15

0

При правильной работе машины всегда равен нулю.

16

RF

Флаг возобновления.

17

VM

Режим виртуального процессора i8086

18

AC

Проверка выравнивания.