Регистры, назначение и характеристика
Регистр является устройством временного хранения данных и используется с целью облегчения арифметических, логических и пересылочных операций. Регистры 32-битных моделей IA-32 являются расширением регистров 16-битных моделей семейства.
Регистры общего назначения
Восемь регистров общего назначения имеют длину в 32 бит и содержат адреса или данные. Они поддерживают операнды-данные длиной 8, 16, 32 и (при использовании двух регистров) 64 бит. Эти регистры называются EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP.В машинных кодах никаких букв нет, и регистры кодируются тремя битами (в указанном выше порядке - от 000 до 111). Доступ к младшим 16 бит этих регистров выполняется независимо при использовании соответствующих имен 16-битных регистров: AX, BX, CX, DX, SI, DI, BP и SP. Также могут использоваться индивидуально младший (биты 0-7) и старший (биты 8-15) байты регистров AX, BX, CX, DX. Им соответствуют обозначения AH, DH, CH, BH и AL, DL, CL, BL.
EAX- аккумулятор, операнд-источник или приемник результата (некоторые инструкции могут быть короче на один байт при использовании EAX);
EBX- указатель на данные в сегменте DS;
ECX - используется в качестве счётчика (в циклах) и для цепочечных и циклических (с префиксом REP и т.п.) инструкций;
EDX- регистр данных (подобно eax) (адрес порта ввода-вывода для инструкций IN/INS, OUT/OUTS; )
ESI- указатель на операнд-источник;
EDI - указатель на операнд-приемник;
ESP - указатель на вершину стека.
EBP- указатель на данные в сегменте SS.
При записи ячеек памяти (переменных) в командах пишут обозначения:
byte ptr – 8-разрядная переменная, – эти слова, записанные ПЕРЕД адресом области памяти, говорят, что в операции над этой памятью должно участвовать данное, расположенное в одном байте
word ptr – 16-разрядная переменная, - эти слова, записанные ПЕРЕД адресом области памяти, говорят, что в операции над этой памятью должно участвовать данное, расположенное в двух байтах (в слове)
dword ptr – 32-разрядная переменная, - эти слова, записанные ПЕРЕД адресом области памяти, говорят, что в операции над этой памятью должно участвовать данное, расположенное в четырех байтах (в двойном слове)
qword ptr – 64-разрядная переменная
tbyte ptr – 80-разрядная переменная
Флаги процессора
Есть еще два регистра: это регистр флагов EFLAGS и указатель инструкций EIP. Состояние регистра флагов может меняться после каждой инструкции в зависимости от полученного результата. Регистр EIP содержит адрес начала следующей инструкции в памяти. Его значение увеличивается каждый раз, когда из памяти извлекается для исполнения очередная инструкция, на величину размера этой инструкции.
Указатель команд
Указатель команд (EIP) является 32-разрядным регистром. Он содержит смещение следующей команды, подлежащей выполнению. Относительный адрес отсчитывается от начала сегмента исполняемой задачи. Указатель команд непосредственно недоступен программисту, но он управляется явно командами управления потоком, прерываниями и исключениями , командами условного перехода. Младшие 16 бит регистра EIP обозначаются IP и могут быть использованы процессором независимо при исполнении 16-битного кода.
ZF – флаг нуля. Устанавливается в 1, если результат предыдущей операции – ноль
SF – флаг знака. Он всегда равен старшему биту результата
CF – флаг переноса. Устанавливается в 1, если результат предыдущей операции над беззнаковыми числами не уместился в приёмнике и произошёл перенос из старшего бита, или если требуется заём (при вычитании), иначе 0
OF – флаг переполнения. Устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы
AF – флаг полупереноса. Устанавливается в 1, если в результате предыдущей операции произошёл перенос или заём из третьего бита в четвёртый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
PF – флаг чётности. Устанавливается в 1, если младший байт результата предыдущей команды содержит чётное число битов, равных единице, иначе 0.
IF – флаг прерываний. 1 – прерывания разрешены, 0 – прерывания запрещены
DF – флаг направления. 0 – строки обрабатываются в сторону увеличения адресов, 1 – в сторону уменьшения адресов
Сегментные регистры
Микропроцессор 80386 включает шесть непосредственно доступных 16-битных регистров селекторов сегментов. С каждым сегментным регистром ассоциирован программно-недоступный кэш дескриптора соответствующего сегмента, содержащий базовый адрес сегмента в линейном адресном пространстве, предел сегмента и атрибуты сегмента: CS, SS , DS, ES, FS, GS. Регистр CS хранит селектор сегмента кода. Регистр SS хранит селектор сегмента стека.
Регистры DS, ES, FS и GS хранят селекторы сегментов данных. Если инструкция обращается к памяти, но содержит только смещение, то считается, что она обращается к данным в сегменте DS. Сегмент ES может использоваться без явного указания в цепочечных командах. Сегменты FS и GS используются при обращении к памяти только при явном использовании в инструкции префиксов этих сегментов.
Также существуют регистры управления сегментированной памятью, регистры управления, регистры отладки.
Способы адресации.
КОП РР,РР Регистровая адресация
КОП РР,ОП Прямая адресация
КОП ОП,РР Косвенная адресация
КОП РР,НД Непосредственная адрес-я
КОП ОП,НД
Регистровая адресация
Операнды могут располагаться в любых регистрах общего назначения и сегментных регистрах. Для этого в тексте программы указывается название соответствующих регистров, длины регистров должны совпадать
Непосредственная адресация
Некоторые команды позволяют указывать один из операндов непосредственно в тексте программы. Например: mov d,100. При такой адресации один операнд находится в регистре или в памяти, а второй записан в самой команде, причем ДЛИНА этих данных тоже ВСЕГДА ОДИНАКОВА! В качестве НЕПОСРЕДСТВЕННОГО ДАННОГО может выступать десятичное число, шестнадцатеричное число, символ и двоичное число.
Прямая адресация
Если у операнда, располагающегося в памяти, известен адрес, то его можно использовать.mov eax,x; mov ax,i ; mov al,c
Косвенная адресация
По аналогии с регистровыми и непосредственными операндами адрес операнда в памяти также можно не указывать, а хранить в любом регистре. Адрес операнда можно считывать изЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ЕВР и ESP,ВХ, SI, DI ,ВР.
Косвенная адресация включает в себя следующие :