5. Лекция. Система команд процессоров IA-32 Pentium
Система команд процессоров IA-32 Pentium
Регистры и адресация
Структура регистров процессоров IA-32
Команды и последовательности команд
Нотация для описания операций с регистрами
Нотация языка ассемблера
Базовые типы команд
Выполнение команд и линейный код
Ветвление
Флаги кодов условий регистра состояния
Режимы адресации
Команды IA-32
Программа для сложения чисел
Формат машинных команд
Однобайтовые команды
Кодировка непосредственной адресации
Режимы адресации и поля смещения
Все процессоры корпорации Intel имеют общее название Intel Architecture (IA). Мы с вами рассмотрим лишь процессоры IA, которые работают с 32-разрядными адресами памяти и 32-разрядными данными. Общее название процессоров этого семейства IA-32, а самые последние их представители носят имя Pentium. Первый процессор архитектуры IA-32 — процессор 80386 — увидел свет в 1985 году. После этого были созданы процессоры 80486 (1989), Pentium (1993), Pentium Pro (1995), Pentium II (1997), Pentium III (1999) и Pentium 4 (2000). Каждый новый процессор обладал более высокой производительностью, что достигалось за счет множества архитектурных усовершенствований и новых решений в микроэлектронной технологии. Последние его члены поддерживают специализированные команды для управления мультимедийной графической информацией и обработки векторных данных. Набор команд процессоров IA-32 очень большой, поэтому придется ограничиться рассмотрением самых основных команд и режимов адресации, а полную информацию об архитектуре системы команд процессоров IA-32 и их языке ассемблера вы найдете на web-узле Intel, который находится по адресу http://www.intel.com.
5.1. Регистры и адресация
В архитектуре процессоров IA-32 память адресуется побайтово при помощи 32-разрядных адресов, а команды работают с операндами размером 8 и 32 разряда. Эти два размера операндов, согласно терминологии Intel, называются байтом и двойным словом. В первых моделях процессоров Intel 16-разрядный операнд назывался словом. Для хранения информации используется прямой порядок байтов, описанный в разделе 4.2. Многобайтные операнды могут начинаться по любым адресам. Выравниваться как-либо в памяти они не должны.
Структура регистров процессоров IA-32
Регистры процессора IA-32 показаны на рис. 5.1., Обычно восемь 32-разрядных регистров с именами от R0 до R7 являются регистрами общего назначения и используются для хранения операндов-данных или адресной информации. Кроме того, имеется восемь регистров с плавающей запятой для хранения операндов-данных, имеющих размер двойного или четверного (64 разряда) слова. Регистры с плавающей запятой содержат поле расширения (на рис. 5.1. не показано), с учетом которого их длина составляет 80 бит. Дополнительные биты используются для увеличения точности при обработке процессором чисел с плавающей запятой. Архитектура IA-32 основана на модели памяти, в которой различные области памяти, называемые сегментами, имеют разное назначение. Сегмент кода содержит команды программы, сегмент стека — стек процессора, а четыре сегмента данных предназначены для хранения операндов-данных. В шести сегментных регистрах хранятся значения селекторов, используемые для идентификации указанных сегментов в адресном пространстве памяти. О назначении этих регистров мы поговорим в разделе 9.6, где будет обсуждаться семейство IA-32. Пока же такого рода информация нам не нужна. 32-разрядные адреса в архитектуре IA-32 часто применяются для доступа к тем областям памяти, в которых располагается сама программа, стек процессора и области данных.
-
0
NT
IOPL
OF
DF
IF
TF
SF
ZF
0
AF
O
PF
1
CF
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Регистр флагов flags
Рис. 5.1. Регистры процессоров IA-32
В нижней части рис. 5.1. показаны еще два регистра — указатель команды, являющийся счетчиком команд и содержащий адрес следующей выполняемой команды программы, и регистр состояния, в котором хранятся флаги кодов условий (CF, ZF, SF, OF). Флаги информируют о результатах арифметических операций. Биты режима выполнения программы (IOPL, IF, TF) связаны с операциями ввода-вывода и прерываниями, о которых рассказывается в разделе 6.
Регистры общего назначения процессоров семейства IA-32 совместимы с регистрами ранних 8- и 16-разрядных процессоров Intel. В этих процессорах на использование разных регистров в программах накладывались некоторые ограничения. О соответствии регистров процессоров IA-32 регистрам более ранних процессоров можно судить по рис. 5.2. Восемь регистров общего назначения разделены на три группы: регистры данных для хранения операндов, регистры-указатели и индексные регистры для хранения адресов и индексов, посредством которых определяется исполнительный адрес операнда в памяти.
Имя регистра общего назначения |
31 16 |
15 8 |
7 0 |
|
|
|
R0 |
EAX |
|
AH |
AL |
|
Регистры данных |
|
|
|
AX |
|
||
R1 |
ECX |
|
CH |
CL |
||
|
|
|
CX |
|||
R2 |
EDX |
|
DH |
DL |
||
|
|
|
DX |
|||
R3 |
EBX |
|
BH |
BL |
||
|
|
|
BX |
|
|
|
R4 |
ESP |
|
SP |
|
Регистры-указатели |
|
|
|
|
|
|
||
R5 |
EBP |
|
BP |
|||
|
|
|
|
|
|
|
R6 |
ESI |
|
SI |
|
Индексные регистры |
|
|
|
|
|
|
||
R7 |
EDI |
|
DI |
|||
|
|
|
|
|
|
|
|
EIP |
|
IP |
|
Указатель команды |
|
|
|
|
|
|
|
|
|
EFLAGS |
|
FLAGS |
|
Регистр состояния |
Рис. 5.2. Соответствие регистров IA-32 регистрам более ранних процессоров Intel
В первых, 8-разрядных, процессорах Intel регистры данных назывались А, В, С и D. В более поздних 16-разрядных процессорах их стали называть АХ, ВХ, СХ и DX. Старший и младший байты каждого регистра идентифицируются суффиксами Н и L. Например, два байта в регистре АХ называются АН и AL. В процессорах IA-32 для идентификации соответствующих «расширенных» 32-разрядных регистров используется префикс E: ЕАХ, ЕВХ, ЕСХ и EDX. Этот же префикс употребляется и с другими 32-разрядными регистрами, показанными на рис. 5.2 (они являются расширенными версиями соответствующих 16-разрядных регистров, использовавшихся в более ранних процессорах).
Все перечисленные наименования регистров до сих пор применяются в технической документации Intel и других описаниях процессоров этой корпорации. Старые наименования регистров сохранены потому, что Intel поддерживает обратную совместимость для всех своих процессоров. Это означает, что при корректной установке состояния процессора программы на машинном языке, созданные для ранних 16-разрядных процессоров, будут нормально работать на современных процессорах IA-32 без каких-либо изменений. В программах на языке ассемблера для 16-разрядных процессоров мы будем использовать в именах регистров префикс E, поскольку это мнемоническое обозначение применяется в текущих версиях ассемблера процессоров IA-32. Для однобайтовых операндов, хранящихся в младших разрядах 32-разрядных регистров процессора, используются обозначения AL, BL и т. д. Для команд процессора IA-32 можно динамически установить 32- или 16-разрядный режим, для чего используется байт префикса команды.