|
Команди асемблера для Intel: SBB, SCAS, SCASB, SCASW, 386+ SCASD
ADO в Delphi AJAX Android C++ CakePHP CMS COM CSS Delphi Flash Flex HTML Internet Java JavaScript MySQL PHP RIA SCORM Silverlight SQL UML XML Бази даних Веб-розробка Генетичні алгоритми ГІС Гітара Дизайн Економіка Інтелектуальні СДН Колір Масаж Математика Медицина Музика Нечітка логіка ООП Патерни Подання знань Розкрутка сайту, SEO САПР Сесії в PHP Системне програмування Системний аналіз Тестологія Тестування ПЗ Фреймворки Штучний інтелект
|
Команди асемблера для Intel: SBB, SCAS, SCASB, SCASW, 386+ SCASD
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
Приклад ;У полях даніх: 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, поклад від розміру порівнюваніх елементів. 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 байт в числі). Зверніть увагу на додаткові посиланняГоловний розділСторінки, близькі за змістомзагрузка...
|
Сторінки, близькі за змістом ![]() Асемблер (англ. assembler) — загальноприйнята назва транслятора з автокоду. Асемблер переводить початкову програму, написану на автокоді, в переміщувану програму на мові машинній. Оскільки асемблер здійснює трансляцію на мову завантажувача, при завантаженні програми необхідна налаштування умовних адрес, тобто адрес, значення яких залежать від розташування даної програми в пам'яті ЦВМ і від її зв'язків з іншими незалежно трансльованими програмами. |
|
Copyright © 2008—2026 Портал Знань.
При використанні матеріалів посилання, для інтернет-ресурсів — гіперпосилання, на Znannya.org обов'язкове.
Зв'язок
|
НТУУ "КПІ" Інженерія програмного забезпечення КПІ Лабораторія СЕТ |
|