Иллюстрированный самоучитель по Assembler


СМР Сравнение - часть 3


str2 db ' abcdefgh*ij' ;2-я строка

; В программном сегменте:

cld ;Сравнение вперед

mov SI,offset strl;DS:SI ' strl

mov DI,offset str2;ES:DI ' str2

mov CX,11 ;Длина сравниваемых строк

repne cmpsb ;Поиск первой пары

;одинаковых элементов

jne notequ ;Переход, если таковой нет

found: ;Продолжение, если пара

;одинаковых элементов найдена


В примере 2 имеется пара одинаковых элементов (*) в позиции 8 от начата строк. Поэтому команда jne выполнена не будет. После завершения сравнения строк управление будет передано на метку found. Содержимое регистров в этой точке: СХ=2 (так как не выполнено сравнение двух последних пар символов), SI = <смещение strl> + 9, DI = <смешенис strl> + 9 (выполнено сравнение 9 пар символов).

Пример 3


;В полях данных сегмента, адресуемого через ES:

strl db '09.12.1998' ;1-я строка

str2 db '09.12.1998' ;2-я строка

;В программном сегменте:

eld ;Сравнение вперед

mov SI, off set strl ;DS:SI -> strl

mov DI,offset str2 ;ES:DI -> str2

mov CX,10 ;Длина сравниваемых строк

repe cmps ES:str1,ES:str2 ;Поиск различия в строках

je equal ; Переход, если строки

;одинаковы

notequal: ;Продолжение, строки

;различаются


В примере 3 строки одинаковы и после завершения сравнения управление будет передано на метку equal. Поскольку строки описаны с помощью директив db, фактически выполняется команда cmpsb, т.е. побайто вое сравнение.


Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.

386+ CMPSD Сравнение строк по двойным словам


Команда аналогична командам МП 86 cmpsb и cmpsw, но позволяет сравнивать 32-битовые участки строк, адресуемых через регистры DS:ESI и ES:EDI (или, в 16-разрядных приложениях, через DS:SI и ES:DI). Использование мнемоники cinpsd с префиксом rep не означает, что в качестве счетчика будет автоматически использоваться расширенный регистр ЕСХ.

Пример


;В полях данных сегмента, адресуемого через DS

areal dd 152345,168666,954333

area2 dd 152345,168666,954331

;B программном сегменте

push DS

pop ES ;ES=DS

mov SI,offset areal ;DS:SI ->areal

mov DI,offset area2 ;ES:DI ->area2

mov CX,3 ;Будем сравнивать З числа

repe cmpsd

je equal


В приведенном примере в строках (фактически это целочисленные массивы) различаются последние элементы, и команды jc выполнена не будет. 

 




Начало  Назад  Вперед



Книжный магазин