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

Пример 1

;В полях данных сегмента данных, адресуемого через DS: strl db 'FILE.001' ;1-я строка ;В полях данных сегмента данных, адресуемого через ES: str2 db 'FILE.012' ;2-я строка ;В программном сегменте: eld ;Сравнение вперед 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: strl db '12345678*90' ;1-я строка ;В полях данных сегмента данных, адресуемого через ES: 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 выполнена не будет. 

7.2.

Синтаксис команды безусловного перехода - jmp

Синтаксис команды безусловного перехода – jmp [модификатор] адрес_перехода – безусловный переход без сохранения информации о точке возврата.

Адрес_перехода представляет собой адрес в виде метки либо адрес области памяти, в которой находится указатель перехода.

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

Их различия определяются дальностью перехода и способом задания целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным,или близким, во втором – межсегментным, или дальним. Внутрисегментный переход предполагает, что изменяется только содержимое регистра eip/ip.

Можно выделить три варианта внутрисегментного использования команды jmp:

1) прямой короткий;

2) прямой;

3) косвенный.

 

7.3. Каждая из команд условного перехода состоит из 8-битного кода операции и 8 бит, определяющих назначение перехода.

Оно равно разности между смещением назначения и смещением команды условного перехода. Как мы уже говорили, это ведет к позиционно-незавиеимому коду (переходы относительны) и к компактному коду (назначение определяется всего 8 битами). Но при этом назначение перехода будет в сравнительно небольшом диапазоне (примерно 127 байт) от команды условного перехода.

Для двух форм команд условных переходов ("близкая" и "далекая") потребовалось бы слишком много кодов операций. Случай "близкого" перехода встречается гораздо чаще, поэтому было решено выбрать этот вариант ("далекий" условный переход всегда можно осуществить двумя командами, в которых "близкий" условный переход обходит "далекий" безусловный переход). Кроме проверки на равенство часто нужно знать, какое число больше, и при этом возникает интересный вопрос: является ли число 1111 1111 больше числа 0000 0000? Ответ может быть и положительным и отрицательным.

Если числа считать беззнаковыми, то первое число равно 255 и оно, конечно, больше 0. Но если числа считать знаковыми, то первое число равно - 1 , т.е. меньше 0. Следовательно, отношение "больше" и "меньше" зависит от того, считаются числа беззнаковыми или знаковыми, и целесообразно ввести новые термины, позволяющие различать эти два случая.

При сравнении чисел как знаковых мы пользуемся терминами меньше и больше, а при сравнении беззнаковых чисел - терминами ниже и выше. Поэтому число 1111 1111 выше числа 0000 0000 и одновременно меньше его.

А число 0000 0000 ниже и меньше числа 0000 0001. Следовательно, между двумя числами существуют отношения равны, выше, ниже, меньше и больше. Каждое из этих условий можно определить по состояниям флажков после команды сравнения (см. табл. 3.9). В процессоре 80286 имеются команды условных переходов, которые проверяют по состояниям флажков, удовлетворяется конкретное отношение или нет. Имеются следующие условные переходы:

Название          Смысл ТЕ Перейти, если равны JNE Перейти, если не равны JL Перейти, если меньше JNL Перейти, если не меньше JG Перейти, если больше JNG Перейти, если не больше JB Перейти, если ниже JNB Перейти, если не ниже JA Перейти, если выше JNA Перейти, если не выше

7.5. Команда LOOP осуществляет переход в зависимости от содержимого регистра СХ. Но, как мы видели ранее, иногда желательно повторение цикла с учетом состояния флажка ZF. Соответствующими командами процессора 80286 являются LOOPZ (зациклить, если ZF = 1) и LOOPNZ (зациклить, если ZF = 0). Конечно, обе команды LOOPZ и LOOPNZ перед зацикливанием производят декремент содержимого регистра СХ и проверяют его на нуль. Команды имеют альтернативные мнемоники LOOPE (зациклить, если равны) и LOOPNE (зациклить, если не равны); они более наглядно показывают условие зацикливания. Для примера использования команды LOOPNZ обратимся к изменению знака последовательности байт, но теперь число байт не определено. Известно, однако, что ни один байт в последовательности не содержит нуля, но вся последовательность заканчивается нулевым байтом. Напомним, что команда NEG устанавливает флажок ZF, если байт-операнд содержит нуль. Получаются следующие действия:

CYCLE: LODS MEMBYTE1 NEG AL STIS MEMBYTE2 LOOPNZ CYCLE

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]