Регистры процессора Pentium.

Пользовательские регистры. Они называются так потому, что программист может использовать их при написании своих программ. К этим регистрам относятся:

1) восемь 32-битных регистров, которые могут использоваться программистами для хранения данных и адресов (их еще называют регистрами общего назначения -РОН):

1.1) eax – 32 бита/ ax – 16 бит/ ah/ al – по 8 бит;

1.2) ebx – 32 бита/ bx – 16 бит/ bh/ bl – по 8 бит;

1.3) edx – 32 бита/ dx – 16 бит/ dh/ dl – по 8 бит;

1.4) ecx – 32 бита/ cx – 16 бит/ ch/ cl – по 8 бит;

1.5) ebp – 32 бита/ bp – 16 бит;

1.6) esi – 32 бита/ si – 16 бит;

1.7) edi – 32 бита/di – 16 бит;

1.8) esp – 32 бита/ sp – 16 бит.

2) шесть регистров сегментов: cs, ds, ss, es, fs, gs по 16 бит;

3) регистры состояния и управления:

3.1) регистр флагов eflags – 32 бита/ flags – 16 бит;

3.2) регистр указателя команды eip – 32 бита/ ip – 16 бит.

Микропроцессоры i486 и Pentium имеют в основном 32-разрядные регистры. Их количество, за исключением сегментных регистров, такое же, как и у i8086, но размерность больше, что и отражено в их обозначениях - они имеют приставку e (Extended).

Перечислим регистры, относящиеся к группе регистров общего назначения. Так как эти регистры физически находятся в микропроцессоре внутри арифметико-логического устройства (АЛУ), то их еще называют регистрами АЛУ:

1) eax/ax/ah/al (Accumulator register) - аккумулятор. Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно. Например, при выполнении операций умножения и деления используется для хранения первого числа, участвующего в операции, и результата операции после ее завершения.

2) ebx/bx/bh/bl (Base register) - базовый регистр. Применяется для хранения базового адреса некоторого объекта в памяти (например, массивов).

3) ecx/cx/ch/cl (Count register) - регистр-счетчик. Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды. К примеру, команда организации цикла loop кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx;

4) edx/dx/dh/dl (Data register) - регистр данных. Так же, как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно. Используется как расширение регистра- аккумулятора при работе с 32- разрядными чмслами.

Следующие два регистра используются для поддержки цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит:

1) esi/si (Source Index register) - индекс источника. Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике;

2) edi/di (Destination Index register) - индекс приемника (получателя). Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике.

В архитектуре микропроцессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. Для работы со стеком в системе команд микропроцессора есть специальные команды, а в программной модели микропроцессора для этого существуют специальные регистры:

1) esp/sp (Stack Pointer register) - регистр указателя стека. Содержит указатель вершины стека в текущем сегменте стека.

2) ebp/bp (Base Pointer register) - регистр указателя базы начального адреса поля памяти, непосредственно отведенного под стек. Предназначен для организации произвольного доступа к данным внутри стека.

Большинство из перечисленных регистров могут использоваться при программировании для хранения операндов практически в любых сочетаниях. Но некоторые команды используют фиксированные регистры для выполнения своих действий. Это нужно обязательно учитывать.

В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs. Фактически в этих регистрах содержатся адреса памяти? с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов:

1) Сегмент кода. Содержит команды программы. Для доступа к этому сегменту служит регистр cs (code segment register) - сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор (то есть, эти команды загружаются в конвейер микропроцессора).

2) Сегмент данных. Содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр ds (data segment register) - сегментный регистр данных, который хранит адрес сегмента данных текущей программы.

3) Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком. Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) - сегментный регистр стека, содержащий адрес сегмента стека.

4) Дополнительный сегмент данных. Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds. Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).

В микропроцессор включены несколько регистров, которые постоянно содержат информацию о состоянии, как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:

1) регистр флагов eflags/flags;

2) регистр указателя команды eip/ip.

Младшая часть регистра eflags полностью аналогична регистру flags (слово состояния процессора, описанного выше) для i8086.

Регистр eip/ip содержит смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.

Перейдем к рассмотрению основных команд язык ассемблера, необходимых для выполнения лабораторных работ.

Команды языка ассемблера

В персональных ЭВМ форматы команд достаточно разнообразны. Имеются команды с одним или двумя операндами.

Например:

1) формат команды “регистр - регистр” (2 байта);

2) формат команды “регистр - память” (2 - 4 байта);

3) формат команды “регистр - непосредственный операнд” (3 - 4 байта);

4) формат команды “память- непосредственный операнд” (3-6 байтов).

Команды передачи данных

Предназначены для пересылок данных, адресов и непосредственных операндов в регистры или в ячейки памяти. Их описание представлено в таблице 4.2.

Таблица 4.2 - Формат команд передачи данных

Название команды Мнемоника и формат команды Описание действия
Передать MOV DST,SRC (DST)(SRC)
Загрузить эффективный адрес LEA DST,SRC (REG) (SRC)
Загрузить в DS указатель LDS DST,SRC (REG) (SRC) (DS) (SRC+2)
Загрузить в ES указатель LES DST,SRC (REG) (SRC) (ES) (SRC+2)
Обменять XCHG OPR1,OPR2 (OPR1) (OPR2)

Ни один из флажков не изменяется. Что касается режимов адресации, то получатель не может быть непосредственным и не может быть CS. В командах LEA, LES, LDS операнд REG не может быть сегментным регистром, а источник не может иметь непосредственный или регистровый режим. В команде MOV один из операндов должен быть регистром. В команде XCHG хотя бы один из операндов должен быть регистром, но ни один из операндов не может быть сегментным регистром.