- •3.11.1 Команды пересылки данных
- •Команды пересылки общего назначения
- •Xchg приемник, источник
- •Команды загрузки адресных значений
- •Команды обращения к стеку
- •Команды пересылки флагов
- •Команды ввода/вывода
- •In аккумулятор, порт
- •In аккумулятор, dx.
- •3.11.2. Арифметические команды
- •Типы арифметических данных
- •Команды инкрементирования и декрементирования
- •Inc приемник
- •Команды сложения и вычитания
- •Команды расширения знака
- •Команды умножения и деления
- •Imul источник.
- •Команды десятичной коррекции
- •Сложение в bdc-формате
- •Вычитание в bcd-формате
- •Сложение в ascii-формате
- •Вычитание в ascii-формате
- •Умножение в ascii-формате
- •Деление в ascii-формате
- •3.11.3 Логические команды
- •Команды логических операций
- •Команды сравнения
- •Команды сдвигов
- •Команды логических сдвигов
- •Команды арифметических сдвигов
- •Команды циклических сдвигов
- •3.11.4. Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды перехода по состоянию арифметических флагов
- •Команды перехода по соотношению между числами
- •Команды перехода по состоянию регистра cx
- •Команды управления циклами
- •Команды для организации подпрограмм
- •Команды прерываний
- •3.11.5. Команды обработки строк
- •Строковые примитивы
3.11.5. Команды обработки строк
Строка представляет собой последовательность элементов, расположенных в смежных ячейках памяти. Элементами строки могут быть байты или слова, а ее длина ограничивается лишь размерами логического сегмента (до 64 кбайт).
Команды обработки строк выполняют пять основных операций: пересылка, сравнение, сканирование, загрузка и сохранение элементов строк. Обработка строки всегда осуществляется последовательно элемент за элементом. Поэтому команды обработки строк часто называют строковыми примитивами. Однако, с помощью одного примитива может быть обработана вся строка путем его многократного повторения.
Все строковые примитивы в общем случае могут быть записаны в следующих форматах:
COPS строка_приемник, строка_источник;
COPSB;
COPSW;
где COPS формальная мнемоника строкового примитива.
Отсюда следует, что строковый примитив не имеет операндов. Операнды, приведенные в первом формате, имеют фиктивный характер, так как они используются не для адресации данных, а лишь для определения типа обрабатываемых элементов. В этом случае тип элементов определяется предшествующим описанием операндов. Если операнды описаны как последовательность байтов (директивой DB), то строковый примитив выполняет операцию над байтами, а если как последовательность слов (директивой DW), то над словами.
Во втором и третьем форматах тип обрабатываемых элементов указывается явно в мнемонике строкового примитива: В байты, W слова.
При трансляции программы ассемблер заменяет первый формат строкового примитива вторым или третьим форматами в зависимости от размера операндов. Однако, первый формат записи является основным и рекомендуется к применению в большинстве случаев. Это обусловлено тем, что его использование позволяет ассемблеру проверить возможность адресации операндов при трансляции программы и способствует выявлению ошибок на данном этапе.
Для адресации данных строковые примитивы могут использовать единственный способ: косвенную адресацию по регистрам SI, DI. При этом адрес строки-источника всегда находится в регистре SI, а строки-приемника в регистре DI. По умолчанию предполагается, что строка-источник находится в основном сегменте данных, и адрес ее элемента берется из регистров DS:SI, а строка-приемник находится в дополнительном сегменте данных, и адрес ее элемента берется из регистров ES:DI. Однако, сегмент, соответствующий регистру SI, может быть заменен на любой другой с помощью префикса замены сегмента. Для этого строковый примитив должен записываться в первом формате. Сегмент, соответствующий регистру DI, заменить нельзя ни при каких условиях. Отсюда следует, что строка-источник может находиться в любом сегменте, а строка-приемник лишь в дополнительном сегменте данных.
Обработка строки-приемника в основном сегменте данных обеспечивается совмещением сегментов путем загрузки (ES)=(DS). При этом формально будет осуществляться обращение к строке-приемнику в дополнительном сегменте, а фактически в основном сегменте данных.
Для ускорения обработки строк при выполнении любого строкового примитива автоматически аппаратным путем модифицируются регистры указатели адреса SI и DI, что подготавливает обращение к следующему элементу строки без всяких затрат времени. При модификации адресов содержимое регистров SI и DI увеличивается или уменьшается в зависимости от состояния флага направления DF. При DF=0 строка обрабатывается от первого элемента к последнему, и адреса увеличиваются. При DF=1 строка обрабатывается от последнего элемента к первому, и адреса уменьшаются. При этом при обработке байтов содержимое регистров SI, DI изменяется на 1, а при обработке слов на 2.