Директива SEGMENT
Лекция 4. Организация программ на языке ассемблера
Команды работы со строками
В процессоры Intel 8086 были включены команды последовательной пакетной обработки данных. Эти команды очень напоминают функции для работы со строками в языках высокого уровня, однако могу применяться для произвольных действий. При работе этих команд процессор автоматически модифицирует содержимое регистров DI и SI в соответствии с состоянием флага DF и размером операндов. Управление флагом DF осуществляется с помощью команд STD (установить DF=1) и CLD (установить DF=0). Рассмотрим кратко общие формы команд:
MOVS – копирование байта (слова, двойного слова) находящегося в памяти по адресу DS:SI в память по адресу ES:DI
CMPS – сравнение байта (слова, двойного слова) находящегося в памяти по адресу DS:SI с байтом (словом, двойным словом), находящемся по адресу ES:DI
SCAS – сравнение содержимого регистра AL (AX, EAX) с байтом (словом, двойным словом) по адресу ES:DI
LODS – копирует байт (слово, двойное слово), находящийся по адресу DS:SI в регистр AL (AX, EAX)
STOS – копирует регистр AL (AX, EAX) в память по адресу ES:DI
INS, OUTS – пакетная работа с портами ввода вывода.
Для команд работы со строками существует специальный префикс повторения операции, который позволяет избежать создания циклов:
REP - повторяет команду работы со строкой столько раз, сколько указано в регистра CX, уменьшая его при каждом выполнении команды на 1. REP – это префикс команды, указывается непосредственно перед командой пакетной обработки. Существуют также условные формы команды REP – REPZ, REPNZ, REPE и REPNE. Условные формы могут прекратить цикл досрочно в соответствии с состоянием флага ZF.
Пример программы:
.data
sourсe db «Пересылаемая строка$»
dest db 20 dup (?)
.code
assume ds:@data, es:@data
main: mov ax, @data
mov ds, ax
mov es, ax
cld
lea si, source
lea di, dest
mov cx,20
rep movsb
В программах на языке ассемблер могут использоваться команды, которые осуществляют управление процессом компиляции, и позволяют компилятору корректно интерпретировать команды.
Любые ассемблерные программы содержат по крайней мере один сегмент - сегмент кода. В некоторых программах используется сегмент для стековой памяти и сегмент данных для определения данных. Ассемблерная директива для описания сегмента SEGMENT имеет следующий формат:
имя SEGMENT [параметры]
.
.
имя ENDS
Имя сегмента должно обязательно присутствовать, быть уникальным. Директива ENDS обозначает конец сегмента. Обе директивы SEGMENT и ENDS должны иметь одинаковые имена. Директива SEGMENT может содержать три типа параметров, определяющих выравнивание, объединение и класс.
1. Выравнивание. Данный параметр определяет границу начала сегмента. Обычным значением является PARA, по которому сегмент устанавливается на границу параграфа. В случае отсутствия этого операнда ассемблер принимает по умолчанию PARA.
2. Объединение. Этот элемент определяет объединяется ли данный сегмент с другими сегментами в процессе компоновки после ассемблирования. Возможны следующие типы объединений:
PRIVATE - сегмент не будет объединяться с другими сегментами с тем же именем вне данного модуля;
PUBLIC - заставляет компоновщик объединить все сегменты с одинаковым именем.
COMMON - располагает все сегменты с одним и тем же именем по одному адресу
STACK - определение сегмента стека.
Сегмент стека определяется следующим образом:
имя SEGMENT PARA STACK
3. Класс. Данный элемент, заключенный в апострофы, используется для группирования относительных сегментов при компоновке:
имя SEGMENT PARA STACK 'Stack'