Ассемблер для процессоров Intel Pentium
Шрифт:
имя EQU выражение
Директива EQU создает абсолютное имя, псевдоним или текстовое имя путем присваивания имени указанного выражения. Под абсолютным именем здесь подразумевается имя, представляющее собой 16-разрядное значение, а псевдонимом называется ссылка на другое имя. В качестве текстового имени может использоваться строка символов. При компиляции исходного текста каждое появление имени ассемблер замещает текстом или значением выражения, в зависимости от типа выражения. Имя должно быть уникальным и не может быть переопределено. В качестве выражения может задаваться целое число, строковая константа, вещественное
Примеры применения директивы EQU:
k EQU 1024
adr EQU [BP]
de EQU X0R АХ,АХ
cl EQU BYTE PTR
t EQU 'File'
MASM EQU 5.1 + 0.9
Msft EQU <Microsoft>
mat EQU 20*30
Директива LABEL имеет следующий формат:
имя LABEL тип
Директива LABEL порождает новую переменную или метку путем присваивания имени указанного типа и текущего значения указателя позиции. Имя должно быть уникальным и не может быть переопределено. В качестве типа может быть задано одно из следующих ключевых слов: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR.
Примеры использования директивы LABEL:
byte_array LABEL BYTE
word_array DW 10 DUP(0)
Здесь имена bytearray и wordarray ссылаются на одну и ту же область памяти.
3.3. Программная модель процессора Intel Pentium
Для понимания работы команд ассемблера необходимо четко представлять, как выполняется адресация данных, какие регистры процессора и как могут использоваться при выполнении инструкций. Сейчас мы рассмотрим базовую программную модель процессоров Intel Pentium, в которую входят:
– 8 регистров общего назначения, служащих для хранения данных и указателей;
– регистры сегментов – они хранят 6 селекторов сегментов;
– регистр управления и контроля EFLAGS, который позволяет управлять состоянием выполнения программы и состоянием (на уровне приложения) процессора;
– регистр-указатель EIP выполняемой следующей инструкции процессора;
– система команд (инструкций) процессора;
– режимы адресации данных в командах процессора.
Начнем с описания базовых регистров процессора Intel Pentium.
Базовые регистры процессора Intel Pentium являются основой для разработки программ и позволяют решать основные задачи по обработке данных. Все они показаны на рис. 3.6.
Рис. 3.6. Базовые регистры процессора Intel Pentium
Среди базового набора регистров выделим отдельные группы и рассмотрим их назначение. Начнем с 32-разрядных регистров общего назначения (ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, EBP, ESP), которые могут использоваться в качестве:
– операндов в арифметических и логических операциях;
– операндов при вычислении адресов операндов;
– указателей на переменные в памяти.
Несмотря на то что любой из этих регистров можно использовать для вышеперечисленных операций, необходимо учитывать специфику применения регистра ESP – он служит для хранения указателя стека, поэтому задействовать его для других целей не рекомендуется. Во многих программах требуется хранить в регистрах определенные значения
операндов в процессе выполнения каких-либо операций. Для этого подходят регистры ЕСХ, ESI и EDI. Если при этом используется отдельный сегмент данных, то некоторые команды ассемблера предполагают, что переменная, адресуемая одним из этих регистров, находится в сегменте данных, определяемом регистром DS.Во многих случаях регистры общего назначения используются для предопределенных целей:
– ЕАХ выполняет функцию аккумулятора при работе с операндами и хранит результат операции;
– ЕВХ – указатель на данные, находящиеся в сегменте данных, адресуемом регистром DS;
– ЕСХ – счетчик циклов и элементов при строковых операциях;
– EDX – указатель на порты устройств ввода-вывода;
– ESI – указатель на данные, находящиеся в сегменте, адресуемом регистром DS (при выполнении строковых операций содержит смещение строки-источника);
– EDI – указатель на данные, находящиеся в сегменте, адресуемом регистром ES (при выполнении строковых операций содержит смещение строки-приемника);
– ESP содержит указатель стека в сегменте стека, адресуемом регистром SS;
– ЕВР содержит указатель на данные, находящиеся в стеке, адресуемом регистром SS.
Младшие 16 бит 32-разрядных регистров общего назначения могут адресоваться так же, как и 16-разрядные регистры в процессорах 8086 с именами АХ, ВХ, СХ, DX, ВР, s1 , DI, SP. В свою очередь, 16-разрядные регистры АХ, ВХ, СХ и DX позволяют обращаться отдельно как к старшим 8-разрядным регистрам (АН, ВН, СН, DH), так и к младшим (AL, BL, CL, DL). Это проиллюстрировано рис. 3.7.
Сегментные регистры (CS, DS, SS, ES, FS и GS) содержат 16-разрядные селекторы сегментов. Селектор представляет собой специальный указатель, который идентифицирует данный сегмент в памяти. Более подробно мы остановимся на использовании сегментных регистров в главе 4.
Рис. 3.7. Использование регистров общего назначения
Помимо регистров общего назначения и сегментных регистров, как мы знаем, в базовой архитектуре имеется еще два регистра: регистр управления/состояния EFLAGS и регистр-указатель адреса следующей инструкции El Р. Рассмотрим их более подробно.
Регистр EFLAFS, часто именуемый регистром флагов, имеет 32 разряда и содержит группу битов или, как их чаще называют, флагов состояния, управляющий флаг и группу системных флагов. На рис. 3.8 показана структура регистра флагов и приводится расшифровка наиболее часто используемых флагов.
Рис. З.8. Регистр управления/состояния процессора
Указанные на рис. 3.8 флаги наиболее часто используются в прикладных программах и сигнализируют о следующих событиях:
– OF (флаг переполнения) фиксирует ситуацию переполнения, то есть выход результата арифметической операции за пределы допустимого диапазона значений;
– DF (флаг направления) используется командами обработки строк. Если DF = 0, строка обрабатывается в прямом направлении, от меньших адресов к большим. Если DF = 1, обработка строк ведется в обратном направлении;
– SF (флаг знака) показывает знак результата операции, при отрицательном результате SF = 1;
– ZF (флаг нуля) устанавливается в 1, если результат операции равен 0;