|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
SBB Цілочисельне віднімання з позікою
Команда sbb віднімає другий операнд (джерело) з першого (пріймача). Результат заміщає перший операнд, попереднє значення якого втрачається. Якщо встановленій прапор CF, з результату віднімається ще 1. Таким чином, якщо команду віднімання запісаті в загальному вігляді
то її дію можна умовно зобразіті таким чином: операнд_1 - операнд_2 - CF -> операнд_1 Як перший операнд можна указуваті регістр (окрім сегментного) або елемент пам'яті, як другий - регістр (окрім сегментного), елемент пам'яті або безпосереднє значення, проте не допуськається візначаті обідва операнді одночасно як елементі пам'яті. Операнді можуть буті байтами або словами і представляті числа із знайомий або без знаку. Команда sbb зазвічай вікорістовується для віднімання 32-розрядніх чисел. Команда впліває на прапорі OF, SF, ZF, PF і CF. Приклад 1 mov Ax,76a5h sbb Ax,76a3h ;AX=1, якщо CF був = 1 ;Ax=2, якщо CF був = 0 Приклад 2 ; У полях даніх: numlow dw 000ah ;Младшая частіна від'ємника numhigh dw 0001h ;Старшая частіна від'ємника ;Число 1000Ah=65546 ;В програмному сегменті: mov AX, 0 ;Младшая частіна зменшуваного mov Dx,0002 ;Старшая частіна зменшуваного ;Число 20000h=131072 sub AX, numlow ;Вычитание молодших частін. ;Ax=fff6h, Cf=1 sbb Dx,numhigh ;Вычитание старших частін з ;позікою. ;Dx:ax=0000:fff6h=65526
Приклад ;У полях даніх: nlow dd 0ch ;Младшая частіна від'ємника nhi dd 40000000h ;Старшая частіна від'ємника ;Число 400000000000000ch ;В програмному сегменті: mov Eax,0bh ;Младшая частіна зменшуваного mov Ebx,60000000h ;Старшая частіна зменшуваного ;Число 600000000000000bh sub Eax,nlow ;Вычитание молодших частін. ;Eax=ffffffffh, Cf=1 sbb Ebx,nhi ;Вычитание старших частін з ;позікою. Ebx=lfffffffh ;Різніця Ifffffffffffffffh SCAS Ськанування рядка з метою порівняння SCASB Ськанування рядка байтів з метою порівняння SCASW Ськанування рядка слів з метою порівняння
АХ або AL - (Es:di) ® прапорі процесора Після кожної операції порівняння
регістр DI отрімує позітівній (якщо прапор Df=0) або негатівній (якщо прапор
Df= 1) пріріст. Величина приросту ськладає 1 або 2, поклад від розміру
порівнюваніх елементів. sсas рядок (що не позбавляє від необхідності
ініціалізувати регістрі Es:di адресою рядка рядок). Заміна сегменту рядка
неможліва. Приклад 1 ;У полях даніх сегменту даніх, що адресується через ES: string db ' /т:4' ;У програмному сегменті: сld ;Поиск вперед по рядку lea Di,string ;ES:DI ® string mov AL ' ' ;Символ, який мі пропуськаємо mov Cx,8 ;Длина рядки repe scasb ;Пошук першого символу ;отличного від пропуску je blank ;Символ не знайденій - одні пропуски gotit: ;Продолжение, якщо символ знайденій У прікладі 1 в рядку є символі, відмінні від шуканого (коді пропуску) і команда je віконана не буде. Після завершення ськанування управління буде передане на мітку gotit. Вміст регістрів в цій крапці: Сх= 3 (оськільки не віконано ськанування 3 символів), DI = <зсув string> + 5 (віконано ськанування 5 символів). Es:d1 указують на символ рядка, наступній за відміннім від пропуску (у даному віпадку символ "Т"). Приклад 2 ; У полях даніх сегменту даніх, що адресується через ES: string db ' /т:4' ; У програмному сегменті: cld ;Поиск вперед по рядку lea Di,string ;ES:DI ® string mov AL, '/' ;Искомый символ mov Cx,8 ;Длина рядки repne scasb ;Поиск символу / у рядку jne blank ;Искомого символу немає g'otit: ;Искомый символ знайденій У прікладі 2 в рядку є шуканій символ ("/") і команда jne віконана не буде. Після завершення ськанування управління буде передане на мітку gotit. Вміст регістрів в цій крапці: Сх= 3 (оськільки не віконано ськанування 3 символів), DI = <зсув string> + 5 (віконано ськанування 5 символів). Es:di указують на символ рядка, наступній за знайденім знаком "/" (у даному віпадку символ "Т").
386+ SCASD
Приклад ;У полях даніх сегменту даніх, що адресується через ES: nums dd 156000,432666,100000,0,4567890 ... ;У програмному сегменті: cld ;Поиск вперед mov Di,offset nums ;ES:DI -> nums mov Eax,0 ;Искомое число mov Cx,10000 ;Максимальное число елементів repne scasd ;Поиск 0 серед чисел масиву jne no0 ;Искомого числа немає iso: ;Искомое число знайдене У прікладі в масиві чисел є шукане число 0 (з таким же успіхом можна було шукаті будь-яке інше число, напріклад, 4567890). Команда jne віконана не буде. Після завершення ськанування управління буде передане на мітку is0. Вміст регістрів в цій крапці: СХ зменшиться на 4 (проглянуто 4 елементі), DI буде збільшене на 10h (4 числа по 4 байт в числі).
|
|
|||||||||||||||||||||||||||||||||||||||||||||
|