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

C

Пример 1:

;В полях данных сегмента данных, адресуемого через DS:
str1 db 'FILE.001'; 1-я строка
;В полях данных сегмента данных, адресуемого через ES:
str2 db 'FILE.012'; 2-я строка
;В программном сегменте:
cld; Сравнение вперед
mov SI,offset strl; DS:SI ® strl
mov DI, off set str2; ES:DI ® str2
mov CX,8; Длина сравниваемых строк
repe cmpsb; Поиск различия в строках
je equal; Переход, если строки совпадают
notequ:; Продолжение, если строки не совпадают

В примере 1 строки не совпадают, и команда je выполнена не будет. После завершения сравнения строк управление будет передано на метку notequ. Содержимое регистров в этой точке: СХ=1 (так как не выполнено сравнение одной последней пары символов), SI = <смещение strl> + 7, DI = <смещение strl> + 7 (выполнено сравнение 7 пар символов).

Пример 2:

;В полях данных сегмента данных, адресуемого через DS:
str1 db '12345678*90'; 1-я строка
;В полях данных сегмента данных, адресуемого через ES:
str2 db ' abcdefgh*ij'; 2-я строка
; В программном сегменте:
cld;Сравнение вперед
mov SI,offset str1; DS:SI ' str1
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:
str1 db '09.12.1998'; 1-я строка
str2 db '09.12.1998'; 2-я строка
;В программном сегменте:
cld; Сравнение вперед
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, т.е. побайтовое сравнение.

Иллюстрированный самоучитель по Assembler › Приложение. Система команд процессоров Intel. › C Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.

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

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

Пример:

;В полях данных сегмента, адресуемого через DS
area1 dd 152345.168666.954333
area2 dd 152345.168666.954331
;B программном сегменте
push DS
pop ES;ES=DS
mov SI,offset area1; DS:SI › area1
mov DI,offset area2; ES:DI › area2
mov CX,3; Будем сравнивать 3 числа
repe cmpsd
je equal

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.