Обработка строк
Для работы со строками, или цепочками символов или чисел (т.е. попросту говоря, с массивами произвольных данных) в МП предусмотрен ряд специальных команд:
- movs – пересылка строки;
- cmps – сравнение двух строк;
- seas – поиск в строке заданного элемента;
- lods – загрузка аккумулятора (регистров AL или АХ) из строки;
- stos – запись элемента строки из аккумулятора (регистров АХ или AL).
Эти команды очень удобны, однако их использование сопряжено с некоторыми трудностями, так как процессор, выполняя эти команды, неявным образом использует ряд своих регистров. Только если все эти регистры настроены должным образом, команды будут выполняться правильно. В результате включение в программу предложения с командой, например, movs, требует иной раз 6-7 дополнительных предложений, в которых осуществляется подготовка условий для правильного выполнения этой команды.
Хотя команды обработки строк, как правило, включаются в программу без явного указания операндов, однако каждая команда, в действительности, использует два операнда. Для команд seas и stos операндом-источником служит аккумулятор, а операнд-приемник находится в памяти. Для команды lods, наоборот, операнд-источник находится в памяти, а приемником служит аккумулятор. Наконец, для команд movs и cmps оба операнда, и источник, и приемник, находятся в памяти.
Все рассматриваемые команды, выполняя различные действия, подчиняются одинаковым правилам, перечисленным ниже. Операнды, находящиеся в памяти, всегда адресуются единообразно: операнд-источник через регистры DS:SI, а операнд-приемник через регистры ES:DI. При однократном выполнении команды обрабатывают только один элемент, а для обработки строки команды должны предваряться одним из префиксов повторения. В процессе обработки строки регистры SI и DI автоматически смещаются по строке вперед (если флаг DF = 0) или назад (если флаг DF = 1), обеспечивая адресацию последующих элементов. Каждая команда имеет модификации для работы с байтами или словами (например, movsb и movsw).
Таким образом, для правильного выполнения команд обработки строк необходимо (в общем случае) предварительно настроить регистры DS:SI и ES:DI, установить или сбросить флаг DF, занести в СХ длину обрабатываемой строки, а для команд seas и stos еще поместить операнд-источник в регистр АХ (или AL при работе с байтами).
Однако сама операция, после всей этой настройки, осуществляется одной командой, которая обычно даже не содержит операндов, хотя может иметь префикс повторения.
Стоит подчеркнуть, что строки, обрабатываемые рассматриваемыми командами, могут находиться в любом месте памяти: в полях данных программы, в системных областях данных, в ПЗУ, в видеобуфере. Например, с помощью команды movs можно скопировать массив данных из одной массивной переменной в другую, а можно переслать страницу текста на экран терминала. Рассмотрим несколько примеров использования команд обработки строк, ограничившись лишь теми фрагментами программ, которые имеют отношение к рассматриваемому вопросу.
Пример 3.6. Чтение из ПЗУ BIOS даты его выпуска.
;В программном сегменте main proc mov AX,0F000h; Занесем в DS mov DS,AX; Сегментный адрес ПЗУ BIOS mov SI,0FFF5h; Смещение к интересующему нас полю mov AX,data; Настроим RS mov RS,AX; на сегмент данных программы mov DI,offset bios; Смещение к полю для хранения даты mov CX,8; Перенести 8 байт cld; Движение по строке вперед rep movsb; Перенос байтов ;Выведем полученную информацию на экран mov AX,data; Теперь настроим DS mov DS,AX; на сегмент данных программы mov AH,40h; Функция вывода mov BX,1; Дескриптор экрана mov CX,8; Вывести 0 байт mov DX,offset bios; Смещение в строке int 21h; Вызов DOS ;В сегменте данных bios db 8 dup ('); Поле для хранения даты