- •1.1. Память и процессор
- •1.2. Распределение адресного пространства
- •1.3. Регистры процессора
- •1.4. Сегментная структура программ
- •1.5. Стек
- •1.6. Система прерываний
- •1.7. Система ввода-вывода
- •Разница между директивами и командами Ассемблера
- •Описание сегмента — директива segment
- •Директива группирования сегментов Group
- •Директива Assume
- •Стандартные модели памяти
- •Директива model
- •Директивы упрощенного описания сегментов
- •Описание процедур
- •Описание внешних ссылок
- •Директива описания общих имен public
- •Директива описания внешних имен extrn
- •Xchg (eXcHanGe) Обмен
- •Xadd назначение,источник — обмен местами и сложение.
- •Команды условного перехода и регистр ecx/cx
- •Аппаратная реализация Кэш центрального процессора
- •Уровни кэша
- •Ассоциативность кэша
Директива группирования сегментов Group
Эта директива используется для объединения сегментов в группу. Она имеет следующий формат:
имяG GROUP имяС1[, имяС2…] |
Группа позволяет осуществлять доступ к данным из всех сегментов, которые находятся в ней, с помощью одной загрузки адреса группы в сегментный регистр. Этим широко пользуются компиляторы С/С++.
Директива Assume
Эта директива сообщает компилятору, что указанный в ней сегментный регистр необходимо связать с именем сегмента или группы. Она имеет следующий формат:
ASSUME сегм_регистр1:имя1[, сегм_регистр2: имя2…] |
В качестве сегментных регистров для базового Ассемблера принимаются уже известные нам регистры: CS, DS, ES или SS.
Для ОТМЕНЫ назначения для данного сегментного регистра используется ДРУГОЙ формат этой директивы:
ASSUME сегм_регистр1:NOTHING[,сегм_регистр2: NOTHING …] |
Чаще всего эта директива используется в начале модуля на Ассемблере.
Рассмотрим фрагмент листинга ассемблерного файла, который был получен компилятором Borland C++ 5.02:
_TEXT segment byte public 'CODE' _TEXT ends DGROUP group _DATA,_BSS assume cs:_TEXT,ds:DGROUP _DATA segment word public 'DATA' ……………………………………… _DATA ends _BSS segment word public 'BSS' ……………………………………… _BSS ends _TEXT segment byte public 'CODE' assume cs:_TEXT,ds:DGROUP ……………………………………… _TEXT ends _DATA segment word public 'DATA' ……………………………………… _DATA ends _TEXT segment byte public 'CODE' _TEXT ends end |
Стандартные модели памяти
Современные версии компиляторов с Ассемблера позволяют упростить описание сегментов с помощью использования стандартных моделей памяти. В этом случае директивы SEGMENT, ENDS и ASSUME становятся НЕНУЖНЫМИ.
Директива model
Директива MODEL позволяет задавать в ассемблерной программе одну из нескольких стандартных моделей сегментации памяти (модель_памяти). Приведем ее упрощенный формат, которым мы будем пользоваться в дальнейшем:
.MODEL модель_памяти [, язык] |
Параметр язык позволяет немного упростить вопросы интерфейса (стыковки) модуля на Ассемблере с общепринятыми алгоритмическими языками. Если вы их используете, то параметр язык должен быть равен одному из терминальных элементов: C, CPP, BASIC, PASCAL, FORTRAN, PROLOG. Если этот параметр НЕ указан, он считается NOLANGUAGE. Например:
.MODEL Large , C .MODEL Small , Pascal |
Директивы упрощенного описания сегментов
Определившись с используемой моделью, можно использовать упрощенные директивы описания основных сегментов (регистр букв НЕСУЩЕСТВЕНЕН!):
.Code ; формат MASM CODESEG ; формат Ideal — см. Прил. 5. .DATA ; формат MASM DATASEG ; формат Ideal .STACK ; формат MASM STACK ; формат Ideal |
