Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 4

Как видно из рис. 4.1, регистры общего назначения и регистры-указа­тели отличаются, от аналогичных регистров МП 86 тем, что они являются 32-разрядными. Соответственно, к их мнемоническим обозначениям до­бавлена буква Е (от extended, расширенный).

Для сохранения совместимости с ранними моделями процессоров допускается обращение к младшим половинам всех регистров, которые имеют те же мнемонические обозначения, что и в МП 86 (АХ, ВХ,.СХ, DX, SI, DI, ВР и SP). Естественно, сохранена возможность работы с младшими (AL, BL, CL и DL) и старшими (АН, ВН, СН и DH) поло­винками регистров МП 86. Однако старшие половины 32-разрядных реги­стров не имеют мнемонических обозначений и непосредственно недо­ступны. Для того, чтобы прочитать, например, содержимое старшей по­ловины регистра ЕАХ (биты 31... 16) придется сдвинуть все содержимое ЕАХ на 16 бит вправо (в регистр АХ) и прочитать затем содержимое АХ. Все регистры общего назначения и указатели программист может исполь­зовать по своему усмотрению для временного хранения адресов и данных размером от байта до двойного слова. Так, например, возможно исполь­зование следующих команд:

mov EAX,OFFFFFFFFh mov AX,OFFFFh mov AL,OFFh

;Работа с двойным словом (32 бит) ; Работа со словом (16 бит) ; Работа с байтом (8 бит)

Все сегментные регистры, как и в МП 86, являются 16-разрядными. В их состав включено еще два регистра — FS и GS, которые могут исполь­зоваться для хранения сегментных адресов двух дополнительных сегмен­тов данных. Таким образом, при использовании расширенных возможно­стей современных процессоров программе одновременно доступны четы­ре сегмента данных, а не два, как в МП 86.

Регистр указателя команд также является 32-разрядным и обычно при описании процессора его называют EIP. Младшие шестнадцать разрядов этого регистра соответствуют регистру IP процессора МП 86. Весь регистр EIP используется только в 32-разрядных приложениях; в 16-разрядных программах адреса могут быть только 16-разрядными и, соответственно, для адресации в программном сегменте используется младшая половина регистра Е1Р.

Регистр флагов принято называть EFLAGS (от extended flags, расши­ренные флаги). Хотя он имеет длину 32 бит, только младшие 18 бит (да и то не все) содержат значащую информацию. Дополнительно к шести флагам состояния (CF, PF, AF, ZF, SF и OF ) и трем флагам управле­ния состоянием процессора (TF, IF и DF), назначение которых было описано в гл. 1, он включает новые флаги задачи, рестарта и виртуаль­ного режима, а также двухбайтовое поле привилегий ввода-вывода. Все эти биты используются только в защищенном режиме и здесь рассмат­риваться не будут.

Расширенные возможности современных микропроцессоров

163

4.2. Дополнительные режимы адресации

Режимы адресации 32-разрядных процессоров разработаны, исходя из требований образования 32-битового смещения. Другими словами, они предназначены для 32-разрядных приложений, в которых сегменты дан­ных или стека (как, впрочем, и сегменты команд) могут иметь размеры до 232 = 4 Гбайт. Однако в реальном режиме размер любого сегмента огра­ничивается величиной 216 = 64 Кбайт, и 32-битовые смещения не имеют смысла. С другой стороны, ничто не мешает нам использовать для образо­вания 16-битового смещения 32-разрядные регистры (ЕВХ, ESI и проч.), если, конечно, их реальное содержимое не будет превышать величины FFFFh. Указание в качестве операндов команд 32-разрядных регистров позволяет использовать дополнительные возможности 32-разрядных про­цессоров по части адресации памяти, что в некоторых случаях может ока­заться полезным. Следует подчеркнуть, что речь идет здесь только о тех операндах, или, правильнее сказать, аргументах команды, которые опи­сывают косвенную (через регистры) адресацию памяти.

В отличие от МП 86, где базовыми регистрами могут быть только ВХ и ! ВР, а индексными только SI и DI, 32-разрядные процессоры допускают | использование в качестве и базовых, и индексных практически всех реги­стров общего назначения. Таким образом, вполне законна команда вида

mov EAX,[ECX][EDX]

Второе отличие заключается в возможности масштабирования содер­жимого индексного регистра, т.е. умножения его на заданный в команде коэффициент, который может принимать значения 1, 2, 4 или 8. Пример такой адресации:

inc word ptr [EAX][ECX*2]

Еще раз подчеркнем, что дополнительные режимы косвенной адрсса-I ции требуют использования 32-разрядных регистров. Команды

inc word ptr [AX][ECX*2]

или

inc word ptr [EAX][CX*2]

рассматриваются ассемблером, как неправильные.

Режимы косвенной адресации памяти, предоставляемые 32-разряд­ными процессорами при использовании 32-разрядных регистров, изобра­жены на рис. 4.2.

Из рисунка видно, что в качестве базового можно использовать все

регистры общего назначения, включая даже указатель стека ESP. При этом,

если в качестве базового выступает один из регистров ESP или ЕВР, то

по умолчанию адресация осуществляется через сегментный регистр SS,

хотя возможна замена сегмента. Во всех остальных случаях адресация по

I умолчанию осуществляется через сегментный регистр DS. Использование

I регистра ЕВР в качестве индексного не адресует нас к стеку: адресация

по-прежнему осуществляется с помощью регистра DS.

164