Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч.-пр. пособие.doc
Скачиваний:
27
Добавлен:
26.02.2016
Размер:
327.17 Кб
Скачать

1.6 Команды обработки строк

Данные, представляющие собой цепочку смежных байтов, называются строковые или цепочечные. Они могут быть как символьные, так и числовые. Для обработки строковых данных ассемблер имеет следующие команды:

1. movs – переслать байт, слово или двойное слово из одной области памяти в другую;

2. lods – загрузить из памяти байт, слово или двойное слово в регистр al, ax, eax.

3. stos – записать содержимое al, ax или eax в память.

4. cmps – сравнить содержимое двух областей памяти размером в байт, слово или двойное слово.

5. scas – сканирование области памяти на нахождение содержимого al, ax или eax.

В цепочечных операциях участвуют регистры:

1. esi – индекс источника, содержит текущий адрес элемента в цепочке – источнике.

2. edi – индекс приемника, содержит текущий адрес элемента в цепочке – приемнике.

Эти регистры содержат относительные адреса, указывающие на необходимые области памяти. Для загрузки этих адресов надо использовать команду lea. Регистр esi связан с регистром данных ds. Регистр edi всегда связан с регистром дополнительного сегмента es. Поэтому эти команды требуют инициализации регистра es (обычно адресом из регистра ds).

Команда

Операнды

Байт

Слово

Двойное слово

Movs

Lods

Stos

Cmps

Scas

di, si

al, si v ax, si

di, al v di, ax

si, di

di, al v di, ax

movs b

logs b

stos b

cmps b

scas b

Movs w

Lods w

Stos w

Cmps w

Scas w

Movsd

Lodsd

Stosd

Cmpsd

Scasd

Префикс повторения команды rep кодируется непосредственно перед цепочечной командой и обеспечивает повторение команды несколько раз.

Предварительно надо установить начальное значение в регистре cx. При выполнении цепочечной команды с префиксом rep происходит уменьшение на 1 значение cx до нуля. Т.о., можно обработать строки любой длины.

Флаг направления определяет направление обработки строки:

- для направления слева направо надо с помощью команды cld установить флаг df в 0;

- для направления справа налево надо с помощью команды std установить флаг df в 1;

Например, переслать 20 байт из s1 в s2. (предположим, что ds и es инициализированы адресом сегмента данных)

……………….

s1 db 20 dup (‘*’)сегмент

s2 db 20 dup (‘ ’) данных

……………….

cld; df=0

mov cx,20; счетчик на 20 байт

lea si,s1; адрес «откуда»

lea di,s2; адрес «куда»

rep movs b; пересылка по 1 байту.

При выполнении команд cmps и scas возможна установка флагов состояния, так чтобы операция могла прекратиться сразу после обнаружения необходимого условия:

  1. rep – повторять операцию пока сх≠0.

  2. repz/repe – повторять операцию, пока zf=1; прекратить выполнение, если zf=0 или cx=0 (для cmps);

  3. repnz/repne – повторять операцию, пока zf=0; прекратить выполнение, если zf=1 или cx=0 (для scas).

В процессе обработки текстовой информации может возникнуть необходимость замены определенных символов в тексте на другие.

Например, заменить & на пробел. Команда scasb обнаружит символ & (S+8), операция сканирования прекратится, и регистр di будет содержать адрес S+9. Для получения адреса & надо уменьшить di на 1 и записать по полученному адресу символ пробела.

………………………..

S1 equ 15; длина поля S

S db ‘The time&is now’

……………………….

cld

mov dl, ‘&’; искомый символ

mov cx, S1; длина поля S

Lea di, S; адрес поля S

Repne scasb; сканировать

jnz k; если не найден →k

dec di; di=di-1

mov byte ptr [di], 20h; подставить пробел

k: ret

Команда stos полезна для установки в некоторой определенных значений байтов и слов. Для дублирования образца, длина которого превышает размер слова, можно использовать команду movs.

Например,

сформировать строку:

***---***---***---

p db ‘***---’; образец

d db 18 dup (?); область-приемник

………………………………………

cld; df=0

mov cx, 9; счетчик

lea di,d; адрес ‘куда’

lea si, p; адрес ‘откуда’

rep movsw

……………………….

Образец должен быть расположен непосредственно перед принимающей областью.