Чтение онлайн

ЖАНРЫ

Ассемблер для процессоров 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;

Поделиться с друзьями: