Repe cmpsb
je EQ; Строки X и Y равны
jb LT; Строка X меньше Y
ja GT; Срока X больше Y
В нашем примере сравниваемые строки для простоты расположены в одном сегменте (сегменте данных). Как видим, основная часть работы – последовательное сравнение в цикле символов двух строк до первых несовпадающих символов или до конца строк – выполняется двумя тесно связанными командами repe cmpsb .
Остальные строковые команды имеют формат регистр-память, но они тоже ориентированы на задачи обработки строк (массивов) коротких и длинных целых чисел. Команды сканирование строки являются командами сравнения и, при использовании в цикле, хорошо подходят для поиска в строке заданного короткого (scasb) или длинного (scasw) целого значения. Эти команды отличаютсяя только битом размера аргументов w и имеет два неявных операнда op1 и op2, где op1=al для w=0, и op1=ax для w=1, а второй неявный операнд op2=<es,di> является соответственно байтом или словом. Если обозначить буквой r соответственно регистры al или ax, то схему выполнения команд сканирования строки можно записать так:
cmp r,<es,di>; φ(di)
Для иллюстрации использования команды сканирования напишем фрагмент программы для реализации следующей задачи: в массиве длинных целых чисел найти номер последнего нулевого элемента (пусть элементы нумеруются с единицы). Если в массиве нет нулевых элементов, то будем в качестве ответа выдавать номер ноль.
N equ20000
D segment
. . .
X dw N dup (?)
. . .
D ends
C segment
assumecs:C,ds:D,es:D,ss:Stack
Start:mov ax,D
mov ds,ax
mov es,ax
. . .
mov cx,N; Число элементов
sub ax,ax; Образец для поиска=0
lea si,X+2*N-2; Последний элемент
std ; Обратный просмотр
Дата добавления: 2015-10-05; просмотров: 818;