Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 3

г

алгоритмы

131

3.3. Обработка строк

Для работы со строками, или цепочками символов или чисел (т.е. попросту говоря, с массивами произвольных данных) в МП предусмот­рен ряд специальных команд:

movs — пересылка строки;

cmps — сравнение двух строк;

seas — поиск в строке заданного элемента;

lods — загрузка аккумулятора (регистров AL или АХ) из строки;

stos — запись элемента строки из аккумулятора (регистров АХ или AL).

Эти команды очень удобны, однако их использование сопряжено с некоторыми трудностями, так как процессор, выполняя эти команды, неявным образом использует ряд своих регистров. Только если все эти регистры настроены должным образом, команды будут выполняться пра­вильно. В результате включение в программу предложения с командой, например, movs, требует иной раз 6—7 дополнительных предложений, в которых осуществляется подготовка условий для правильного выполне­ния этой команды.

Хотя команды обработки строк, как правило, включаются в програм­му без явного указания операндов, однако каждая команда, в действи­тельности, использует два операнда. Для команд seas и stos операндом-источником служит аккумулятор, а операнд-приемник находится в памя­ти. Для команды lods, наоборот, операнд-источник находится в памяти, а приемником служит аккумулятор. Наконец, для команд movs и cmps оба операнда, и источник, и приемник, находятся в памяти.

Вес рассматриваемые команды, выполняя различные действия, под­чиняются одинаковым правилам, перечисленным ниже. Операнды, нахо­дящиеся в памяти, всегда адресуются единообразно: one ранд-источник через регистры 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,OFOOOh ;3анесем в DS/

mov DS,AX ;сегментный адрес ПЗУ BIOS

mov SI,OFFF5h ;Смещение к интересующему нас полю

mov AX,data ;Настроим ES

mov ES,AX ;на сегмент данных программы

mov DI,ofTset Ью8;Смещение к полю для хранения даты

mov СХ,8 ;Перенести 8 байт

eld Движение по строке вперед

rep movsb ;Перенос байтов

;Выведем полученную информацию на экран

mov AX,data ;Теперь настроим DS

mov DS,AX ;на сегмент данных программы

mov AH,40h ;Функция вывода

mov BX,1 ;Дескриптор экрана

mov CX,8 ;Вывести 8 байт

mov DX,offset bios ;Смещение к строке

int 21h ;Вызов DOS

;В сегменте данных

bios db 8 dup(') ;Поле для хранения даты

Известно, что в ПЗУ BIOS, сегментный адрес которого составляет FOOOh (см. рис. 1.5), наряду с программами управления аппаратурой ком­пьютера, хранятся еще и некоторые идентификаторы. Так, в восьми бай­тах ПЗУ, начиная с адреса FOOOh:FFF5h, записана в кодах ASCII дата разработки ПЗУ. В примере 3.6 выполняется чтение этой даты, сохранение ее в памяти и вывод на экран для контроля. Поскольку интересующая нас дата хранится в ПЗУ BIOS в кодах ASCII, никаких преобразований содер­жимого этого участка ПЗУ перед выводом на экран не требуется.

В программе осуществляется настройка всех необходимых для выпол­нения команды movs регистров (DS:SI, ES:DI, СХ и флага DF) и одной командой movsb с префиксом гср содержимое требуемого участка ПЗУ переносится в поле bios. Перенос строки байтами подчеркивает се формат (в строке записаны байтовые коды ASCII), однако в нашем примере, при четном числе переносимых байтов, более эффективно осуществить пере­нос по словам. В этом варианте команда movs будет фактически повто­ряться не 8 раз, а только 4. Для этого достаточно занести в СХ число 4 (вместо 8) и использовать вариант команды movsw.

132