Все про Assembler українською мовою на сайті net.kr.ua

 

:: Меню ::

Головна
Введення
Архітектура реального режиму
Основи програмування
Команди і алгоритми
Розширені можливості сучасних мікропроцесорів
Система команд процесорів Intel
Книга для гостей
Контакти
Добавити у вибране

:: Друзі ::

  В нашей организации монтаж отопления в частном доме по низким ценам.   С хорошей скидкой продвижение сайта под любые нужды.
 

:: Лічильники ::

=

 

 

 

 

fff00e50

СМР Порівняння

Самі операнди не змінюються. Таким чином, якщо команду порівняння записати в загальному вигляді

стр операнд_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 виконана не буде. 

-

:: Наша кнопка ::

Отримати код:

Підтримайте наш сайт і розмістіть нашу кнопку на своєму ресурсі.


:: Популярне ::

-


:: Посилання ::

-


 

 

 


Copyright © net.kr.ua, 2019-2025 (assem.us)