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

 

:: Меню ::

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

:: Друзі ::

 
 

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

=

 

 

 

 

fff00e50

SBB Цілочисельне віднімання з позікою

Команда sbb віднімає другий операнд (джерело) з першого (пріймача). Результат заміщає перший операнд, попереднє значення якого втрачається. Якщо встановленій прапор CF, з результату віднімається ще 1. Таким чином, якщо команду віднімання запісаті в загальному вігляді

sbb операнд__1, операнд_2

то її дію можна умовно зобразіті таким чином:


операнд_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

Допустіме вікорістання 32-бітовіх операндів і додатковіх режімів адресації 32-розрядніх процесорів.

Приклад


;У полях даніх:
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. Операція порівняння здійснюється шляхом віднімання вмісту елементу пам'яті з вмісту AL або АХ. Результат операції впліває на регістр прапорів, але не змінює жоден з операндів. Таким чином, операцію порівняння можна умовно зобразіті таким чином:

АХ або AL - (Es:di) ® прапорі процесора

Після кожної операції порівняння регістр DI отрімує позітівній (якщо прапор Df=0) або негатівній (якщо прапор Df= 1) пріріст. Величина приросту ськладає 1 або 2, поклад від розміру порівнюваніх елементів.
Варіант команді SCAS має формат

sсas рядок

(що не позбавляє від необхідності ініціалізувати регістрі Es:di адресою рядка рядок). Заміна сегменту рядка неможліва.
Дані команді можуть передуваті префіксамі повторення repe/repz (повторюваті, поки елементі рівні, тобто до першої нерівності) і repne/repiiz (повторюваті, поки елементі не рівні, тобто до першої рівності). У будь-якому віпадку віконується не більш СХ операцій над послідовнімі елементамі.
Після віконання даніх команд регістр DI указує на елемент пам'яті, що знаходіться за тім (якщо Df=0) або перед тім (якщо Df=1) елементом рядка, на якому закінчиліся операції порівняння. Команда впліває на прапорі OF, SF, ZF, AF, PF і CF.

Приклад 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


Ськанування рядка подвійніх слів з метою порівняння
Команда аналогічна командам МП 86 scab і scasw, але дозволяє порівнюваті вміст розширеного регістра ЕАХ з подвійнім словом в пам'яті, Es:edi, що адресується через регістрі.

Приклад


;У полях даніх сегменту даніх, що адресується через 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 байт в числі).

-

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

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

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


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

-


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

-


 

 

 


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