
- •Введение в язык Assembler
- •Программные оболочки и их состав
- •Режимы работы процессоров Intel
- •Организация памяти
- •3.1.2. Сегментирование памяти
- •3.1.3. Адресация байтов и слов
- •Регистры процессоров и их классификация
- •Регистры общего назначения (рон)
- •Сегментные регистры
- •Регистры-указатели
- •Регистр флагов
- •Способы адресации операндов
- •Регистровая адресация
- •Непосредственная адресация
- •Прямая (абсолютная) адресация (адресация по смещению)
- •Косвенная адресация
- •Адресация по базе со сдвигом
- •Косвенная адресация с масштабированием
- •Адресация по базе с индексированием
- •Адресация по базе с индексированием и масштабированием
- •Классификация команд процессора Intel
- •Основные непривилегированные команды
- •Команды пересылки данных
- •Команды двоичной арифметики
- •Десятичная арифметика
- •Логические команды Логические операции
- •Логические команды
- •Mov ax, 00110011b
- •Операции над битами и байтами
- •Команды передачи управления
- •Директивы и операторы ассемблера
- •Структура программы
- •Директивы распределения памяти Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •Модели памяти и упрощенные директивы определения сегментов
- •3.3.3. Порядок загрузки сегментов
- •3.3.4. Процедуры
- •3.3.5. Конец программы
- •3.3.6. Директивы задания набора допустимых команд
- •3.3.7. Директивы управления программным счетчиком
- •3.3.8. Глобальные объявления
- •3.4. Выражения
- •3.5. Макроопределения
- •3.5.1. Блоки повторений
- •3.5.2. Макрооператоры
- •3.5.3. Другие директивы, используемые в макроопределениях
- •3.6. Другие директивы
- •3.6.1. Управление файлами
- •3.6.2. Управление листингом
Сегментные регистры
В процессорах Intel предусмотрено шесть 16-битных регистров – CS, DS, ES, FS, GS, SS, где хранятся селекторы (рис. 1) (регистры FS и GS отсутствовали в 8086, но появились уже в 80286). Это означает, что в любой момент можно изменить параметры, записанные в этих регистрах.
Рис. 1. Сегменты команд, данных и стека в памяти
Назначения сегментных регистров следующие:
• регистр CS [Code Segment – “сегмент кода”] соответствует сегменту команд, исполняемых в данный момент;
• регистр DS [Data Segment – “сегмент данных”] соответствует сегменту данных, с которыми работает процессор;
• регистр ES [Extra Segment – “дополнительный сегмент”] соответствует дополнительному сегменту данных;
• регистр SS [Stack Segment – “сегмент стека”] соответствует сегменту стека.
LIFO = Last In First Out
FILO = First In Last Out
В отличие от DS, ES, GS, FS, которые называются регистрами сегментов данных, CS и SS отвечают за сегменты двух особенных типов – сегмент кода и сегмент стека. Первый содержит программу, исполняющуюся в данный момент, следовательно, запись нового селектора в этот регистр приводит к тому, что далее будет исполнена не следующая по тексту программы команда, а команда из кода, находящегося в другом сегменте, с тем же смещением. Смещение очередной выполняемой команды всегда хранится в специальном регистре EIP (указатель инструкции, 16-битная форма IP), запись в который также приведёт к тому, что далее будет исполнена какая-нибудь другая команда. На самом деле все команды передачи управления – перехода, условного перехода, цикла, вызова подпрограммы и т. п. – и осуществляют эту самую запись в CS и EIP.
В принципе, все эти сегменты могут и перекрываться для оптимального использования пространства памяти. Например, если программа занимает только часть сегмента, то сегмент данных может начинаться сразу после завершения работы программы (с точностью 16 байт), а не после окончания всего сегмента программы.
Регистры-указатели
Остальные четыре регистра – ESI (индекс источника), EDI (индекс приемника), ЕВР (указатель базы), ESP (указатель стека) – имеют более конкретное назначение и применяются для хранения всевозможных временных переменных. Регистры ESI и EDI необходимы в строковых операциях, ЕВР и ESP – при работе со стеком. Так же как и в случае с регистрами ЕАХ-EDX, младшие половины этих четырех регистров называются SI, DI, ВР и SP соответственно, и в процессорах до 80386 только они и присутствовали.
F = 1510 = 11112
Следующие пять регистров процессора служат указателями (то есть определяют смещение в пределах сегмента).
BP – Base Pointer (“указатель базы”);
SI – Source Index (“указатель источника”);
DI – Destination Index (“указатель приёмника”);
SP – Stack Pointer (“указатель стека”);
IP – Instruction Pointer (“указатель инструкции (команды)”).
Например, счётчик команд процессора образуется парой регистров CS и IP, а указатель стека – парой регистров SP и SS. Регистры SI и DI используются в строковых операциях, то есть при последовательной обработке нескольких ячеек памяти одной командой.