Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТ_ОРГ_1.doc
Скачиваний:
29
Добавлен:
18.11.2019
Размер:
1.27 Mб
Скачать

Строковые команды

В составе команд процессора МП 86 имеется группа команд, предназначенных для операций со строками символов или чисел, т. е., по существу, с массивами произвольных данных. Таких команд всего 5:

    1. movs - пересылка строки;

    2. cmps - сравнение строк;

    3. seas - поиск в строке заданного элемента (сканирование строки);

    4. lods - загрузка из строки регистров АХ или AL;

    5. stos - запись элемента строки из регистров АХ или AL.

Команды имеют общие черты:

    1. они выполняются процессором в предположении, что адрес строки-источника находится в регистрах DS:SI, а адрес строки-приемника в ES:DI;

    2. при однократном выполнении они обрабатывают только один элемент, а для обработки строки должны предваряться префиксом повторения;

    3. в процессе обработки элементов строки регистры SI и DI автоматически смещаются по строке вперед (если DF=0) или назад (если DF=1);

    4. каждая команда имеет модификации для работы с бай­тами или словами (например, movsb и movsw).

Рассмотрим сначала особенности использования строковых команд на простых формальных примерах.

Пересылка (копирование) строки байтов

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

src db 10,20,30,40,50

;Строка-источник

dest db 5 dup (?)

;Строка-приемник

;В сегменте команд

mov AX, data

;Обычная инициализация

mov DS, AX

;регистра DS

mov SI, offset sourc

;DS:SI →src

push DS

;DS в стек

pop ES

;из стека в ES, теперь ES=DS

mov DI, offset dest

;ES=DI → dest

cld

;DF=0, движение по строке вперед

mov CX, 5

;число пересылаемых байтов

rep movsb

;Собственно пересылка

В этом примере команда movsb использована с префиксом повторения rep (repeat, повторять), который фактически заставляет процессор выполнить команду movsb чис­ло раз, равное содержимому регистра СХ, т. е. в данном случае переслать 5 байт.

Мы видим, что перед использованием команды movsb надо выполнить целый ряд предварительных действий:

поместить в регистры DS и ES сегментные адреса источника и приемника, а в регистры SI и DI - их смещения;

  • с помощью команды сld (clear direction, сбросить направление) сбросить флаг процессора DF;

  • в регистр СХ заслать число пересылаемых байтов.

После этого одна команда movsb с префиксом повто­рения rep выполняет операцию копирования сколь угодно длинной последовательности байтов (практически до 32 Кбайт, если и источник и приемник находятся в одном сегменте) на новое место.

Сравнение двух строк

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

sourc db 'MYFILE01 .~AT' ;Сравниваемая строка

fname db 'MYFILE01.DAT' ;Эталон

;В сегменте команд

mov AX, data

mov DS, AX

mov SI, offset sourc

push DS

pop ES

mov DI, offset fname

cld

mov CX, 12

repe cmpsb

jne no

yes : . . .

no : . . .

Сравнение пары строк осуществляется с помощью команд cmps, cmpsb и cmpsw. Префикс repe (repeat while equal, повторять, пока равно), использованный в этом при­мере, заставляет процессор выполнять сравнение последовательных элементов строк, пока эти элементы равны, т. е. до тех пор, пока не обнаружится пара различающихся элементов. Если все элементы оказываются попарно одинаковыми, сравнение выпол­няется СХ раз, а после завершения цикла сравнения флаг нуля ZF устанавливается в 1. Если же в какой-то паре элементы оказались разными, цикл сравнения заканчивается, а флаг ZF устанавливается в 0 (отсутствие равенства операндов). Команда jne (или jnz) позволяет проанализировать результат сравнения (в сущности, последней сравниваемой пары элементов) и перейти на соответствующую метку при обнаружении неравен­ства строк. В случае равенства всех СХ пар элементов команда jne не срабатывает и выполняется следующее за jne предложение программы. В приведенном примере сравниваемые строки различаются в 10-й паре байтов, по­этому после сравнения 10-й пары (символов D и ~) выполнение команды cmpsb "дос­рочно" завершится со сброшенным флагом ZF и сработает команда jne, передав управ­ление на метку nо.