Ассемблер в примерах и задачах [Наталья Юрьевна Добровольская] (pdf) читать постранично, страница - 3

-  Ассемблер в примерах и задачах  1.59 Мб, 136с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Наталья Юрьевна Добровольская - Олег Васильевич Гаркуша

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

код.
Предложения и end устанавливают
границы кода. Обе метки должны быть идентичны. Весь код
должен располагаться между этими предложениями.
2. ЯЗЫК АССЕМБЛЕРА
Программа, написанная символическими мнемокодами,
которые используются в языке ассемблер (ЯА), представляет
собой исходный модуль. Для формирования исходного модуля
применяют любой текстовый редактор. Затем программу подают
на вход специальному транслятору, называемому ассемблером,
который переводит ее на машинный язык, и далее полученную
машинную программу выполняют.
11

Ассемблер в примерах и задачах

При описании синтаксиса ЯА мы будем использовать
формулы Бэкуса – Наура (БНФ) со следующими дополнениями:
− в квадратных скобках будем указывать конструкции,
которые можно опускать; например, запись А[В]С означает либо
текст ABC, либо текст АС;
− в фигурные скобки будем заключать конструкции,
которые могут быть повторены любое число раз, в том числе и ни
разу; например, запись А{ВС} означает любой из следующих
текстов: А, АВС, АВСВС, АВСВСВС и т. д.
2.1. РЕГИСТРЫ ПРОЦЕССОРОВ СЕМЕЙСТВА IA-32
К регистрам общего назначения (РОН) относится группа из 8
регистров, которые можно использовать в программе на языке
ассемблера. Все регистры имеют размер 32 бита и могут быть
разделены на 2 части или более.
Регистры данных (32 разряда)
AH
BH
CH
DH
SI
DI
BP
SP

AL
BL
CL
DL

EAX
EBX
ECX
EDX
ESI
EDI
EBP
ESP

Регистры EAX, EBX, ECX и EDX позволяют обращаться как к
младшим 16 битам (по именам AX, BX, CX и DX), так и к двум
младшим байтам по отдельности (по именам AH/AL, BH/BL, CH/CL
и DH/DL).
Регистры ESI, EDI, ESP и EBP позволяют обращаться к
младшим 16 битам по именам SI, DI, SP и BP соответственно.
Названия регистров происходят от их назначения:
EAX/AX/AH/AL (accumulator register) — аккумулятор;
EBX/BX/BH/BL (base register) — регистр базы;
ECX/CX/CH/CL (counter register) — счётчик;
EDX/DX/DH/DL (data register) — регистр данных;
ESI/SI (source index register) — индекс источника;
12

Регистры процессоров семейства IA-32

EDI/DI (destination index register) — индекс приёмника

(получателя);
ESP/SP (stack pointer register) — регистр указателя стека;
EBP/BP (base pointer register) — регистр указателя базы стека.
Несмотря на существующую специализацию, все регистры
можно использовать в любых машинных операциях. Однако надо
учитывать тот факт, что некоторые команды работают только с
определёнными регистрами. Например, команды умножения и
деления используют регистры EAX и EDX для хранения исходных
данных и результата операции. Команды управления циклом
используют регистр ECX в качестве счётчика цикла.
Ещё один нюанс состоит в использовании регистров в
качестве базы, т.е. хранилища адреса оперативной памяти. В
качестве регистров базы можно использовать любые регистры, но
желательно использовать регистры EBX, ESI, EDI или EBP. В этом
случае размер машинной команды обычно бывает меньше.
К сожалению, количество регистров катастрофически мало,
и зачастую бывает трудно подобрать способ их оптимального
использования.
Любые регистры общего назначения могут использоваться
для сложения и вычитания как 8-, 16-, так и 32-битовых значений.
2.1.1. Сегментные регистры CS, DS, SS и ES
Процессор имеет 6 так называемых сегментных регистров:
CS, DS, SS, ES, FS и GS. Их существование обусловлено спецификой
организации и использования оперативной памяти.
16-битные регистры могли адресовать только 64 Кб
оперативной памяти, что явно недостаточно для более или менее
приличной программы. Поэтому память программе выделялась в
виде нескольких сегментов, которые имели размер 64 Кб. При
этом абсолютные адреса были 20-битными, что позволяло
адресовать уже 1 Мб оперативной памяти. Для решения задачи
адресации 20-битных адресов 16-битными регистрами адрес
разбивался на базу и смещение. База –адрес начала сегмента, а
смещение –номер байта внутри сегмента. На адрес начала
сегмента накладывалось ограничение – он должен быть кратен 16.
При этом последние 4 бита были равны 0 и не хранились, а
13

Ассемблер в примерах и задачах

подразумевались. Таким образом, получались две 16-битные части
адреса. Для получения абсолютного адреса к базе добавлялись
четыре нулевых бита, и полученное значение складывалось со
смещением.
Сегментные регистры использовались для хранения адреса
начала сегмента кода (CS – code segment), сегмента данных (DS
— data segment) и сегмента стека (SS – stack segment).
Регистры ES, FS и GS были добавлены позже. Существовало
несколько моделей памяти, каждая из которых подразумевала
выделение программе одного или нескольких сегментов кода и
одного или нескольких сегментов данных: tiny, small, medium,
compact, large и huge. Для команд языка ассемблера существовали
определённые соглашения: адреса перехода сегментировались по
регистру CS, обращения к данным сегментировались по регистру
DS, а обращения к стеку – по регистру SS. Если программе
выделялось несколько сегментов для кода или данных, то
приходилось менять значения в