 |
::
Меню :: |
 |
|
|
 |
::
Друзі :: |
 |
|
|
 |
::
Лічильники :: |
 |
|
|
|
СМР Порівняння
Самі операнди не змінюються. Таким чином, якщо команду порівняння записати
в загальному вигляді
стр операнд_1, операнд_2
то її дію можна умовно зобразити таким чином:
операнд_1 - операнд_2 -> прапори
процесора
Як перший операнд команди
сmр можна указувати регістр (окрім сегментного) або елемент пам'яті, як другий
- регістр (окрім сегментного), елемент пам'яті або безпосереднє значення, проте
не допускається визначати обидва операнди одночасно, як елементи пам'яті. Операнди
можуть бути байтами або словами і представляти числа із знаком або без знаку.
Зазвичай услід за командою сmр коштує одна з команд умовних переходів, що
аналізують стан прапорів процес
сміття. При порівнянні чисел без знаку необхідно використовувати команди умовних
переходів, призначені для аналізу чисел без знаку
(ja, jb і інш.). При
порівнянні чисел із знаком необхідно використовувати команди умовних переходів,
призначені для аналізу чисел із знаком
(jl, jg і інш.).
Приклад 1
cmp Ах,10000 ;АХ-10000
je eqloooo ;Переход на мітку eql0000
;якщо Ах=10000
Приклад 2
;У полях даних:
base dw 8002h
;В програмному сегменті:
cmp Dx,base Dx-base
jb below ;Переход на мітку below
;якщо DX, що розглядається
;как число без знаку, менше
;числа без знаку 8002h=32770
Приклад 3
;У полях даних:
base dw 8002h
;В програмному сегменті:
cmp Dx,base Dx-base
jl less ;Переход на мітку less, якщо
;DX, що розглядається як
;число із знаком, менше
;числа із знаком 8002h=-32766
Допустиме використання
32-бітових операндів і додаткових режимів адресації 32-розрядних процесорів.
Приклад
cmp Eax,8000000 Oh
ja above ;Переход, якщо
;Eax=80000001h...FFFFFFFFh
CMPS
Порівняння рядків
CMPSB
Порівняння рядків по байтах
CMPSW
Порівняння рядків по словах
Команди призначені для операцій над рядками (рядком називається
послідовність байтів або слів пам'яті з будь-яким вмістом). Вони порівнюють по одному
елементу кожного рядка, фактично здійснюючи віднімання другого операнда з
першого і встановлюючи відповідно до результату віднімання прапори
CF, PF, AF, ZF,
SF і OF. Команда cmpsb виконує порівняння по байтах, команда cmpsw - по словах,
а команда cmps може бути використана для порівняння як байтів, так і слів.
У останньому випадку розмір порівнюваних елементів визначається їх описом (за
допомогою директив db або dw). Перший операнд адресується через
Ds:si, другий, -
через Es:di. Таким чином, операцію порівняння можна умовно зобразити таким
чином:
(Ds:si) - (Es:di) -> прапори процесора
Після кожної операції порівняння регістри SI і DI отримують позитивний (якщо
прапор Df=0) або негативний (якщо прапор Df= 1) приріст. Величина
приросту складає 1 або 2 залежно від розміру порівнюваних елементів (байт або
слово).
Варіант команди cmps має формат
cmps строка_1, строка_2
(що не позбавляє від необхідності ініціалізувати регістри Ds:si і Es:di адресами
рядків строка_1 і строка_2 відповідно). У цьому форматі можлива заміна сегменту
першого рядка:
cmps Es:строка_ 1, строка_2
Дані команди можуть передувати префіксами повторення
repe/repz (повторювати,
поки елементи рівні, тобто до першої нерівності) і
repne/repiiz (повторювати,
поки елементи не рівні, тобто до першої рівності). У будь-якому випадку виконується
не більш СХ операцій над послідовними елементами.
Після
виконання даних команд регістри SI і DI указують на елементи пам'яті,
що знаходяться за тими (якщо Df=0) або перед тими (якщо
Df=1) елементами
рядків, на яких закінчилися операції порівняння.
Приклад 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 виконана не буде.
-
|
 |
::
Наша кнопка :: |
 |
|
 |
Отримати код:
|
Підтримайте наш сайт і розмістіть нашу
кнопку на своєму ресурсі. |
|
|
 |
::
Популярне :: |
 |
|
|
 |
:: Посилання :: |
 |
|
|
|