Директива 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'