→ Пошук по сайту       Увійти / Зареєструватися

Команди асемблера для Intel: LOCK, LODS, LODSB, LODSW

LOCK Замикання шини

Префікс lock, поміщений перед командою, встановлює сигнал на лінії LOCK системної шини і забороняє доступ до шини іншим процесорам на час виконання даної команди. Цей префікс призначений для використання в багатопроцесорних багатозадачних системах для забезпечення виняткового доступу до пам'яті даного процесу (і даного процесора) на час перевірки або модифікації деякого елементу пам'яті. Типовий приклад операцій такого роду - робота з семафорами.

Якщо два (або більш) процеси, що йдуть на різних процесорах, використовують який-небудь загальний ресурс, наприклад, файл або лазерний диск, то необхідно забезпечити механізм, що забороняє одночасне звернення процесів до загального ресурсу. Це завдання вирішується за допомогою семафора - елементи пам'яті (байта або навіть бита), стан якого відображає доступність або, навпаки, зайнятість ресурсу.

Якщо процесору знадобився загальний ресурс, він читає стан семафора і, якщо ресурс зайнятий, продовжує опитувати семафор до тих пір, поки інший процесор, загальний ресурс, що використовує зараз, не звільнить його. Виявивши, що ресурс вільний, перший процесор встановлює семафор в стан "зайнятий" і використовує ресурс. Закінчивши роботу з ресурсом, процесор скидає його семафор і дає можливість іншому процесу звернутися до того ж ресурсу.

Описаний алгоритм працюватиме тільки в тому випадку, якщо операція чтенія- модіфікациі- запису семафора виконуватиметься в безперервному режимі. Інакше обидва процеси можуть, одночасно звернувшись до семафора, побачити, що ресурс вільний, і почати його сумісне використання. Уникнути такої ситуації і дозволяє префікс lock у поєднанні з командами типу btr або bts, що виконують комплексні операції перевірки і скидання або перевірки і установки бита.

Вважатимемо, що семафор розташований в біті 0 байта за адресою sem, причому скинутий стан біта свідчить про зайнятість ресурсу, а встановлений стан про те, що ресурс вільний. Тоді типова процедура очікування звільнення ресурсу виглядає таким чином:

mov Si,offset sem ;Адрес байта з семафором
getsem:
lock btr byte ptr [SI],1 ;Проверка і скидання бита 0
jnc getsem

Перевірка стану семафора і його модифікація (запис в біт семафора 0, тобто ознаки "зайнятий") здійснюється в одній команді btr. На час виконання цієї команди шина багатопроцесорної системи блокується префіксом lock, і інший процесор звернутися до того ж семафору не може. Блокування шини знімається вже після того, як семафор буде переведений в стан зайнятості.

Якщо при зверненні до байта sem виявляється, що в бітсів семафора записаний 0, тобто ресурс зайнятий іншим процесом, команда btr скидає прапор CF (шляхом перенесення в нього вмісту аналізованого біта), що приводить до багатократного повторення процедури getsem, тобто до циклу очікування звільнення ресурсу.
Типова процедура звільнення зайнятого даним процесом ресурсу виглядає таким чином:

freesem:
lock bts byte ptr [SI],1 ;Проверка і установка бита 0

Власне кажучи, ніяка перевірка тут не виконується, проте процес звільнятиме ресурс лише якщо він цей ресурс використовує, і перевіряти полягання прапора в цій операції немає необхідності. Проте і тут необхідне замикання шини на час запису в біт семафора 1, щоб виключити одночасне звернення двох процесів до одного елементу пам'яті.
386+ Префікс lock може бути використаний тільки з наступними командами (і лише за умови, що при їх виконанні відбувається звернення до пам'яті): adc, add, and, bt, bts, btr, btc, or, sbb, sub, xor, xchg, dec, inc, neg, not.

LODS Завантаження операнда з рядка

LODSB Завантаження байта з рядка

LODSW Завантаження слова з рядка

Команди призначені для операцій над рядками (рядком називається послідовність байтів або слів пам'яті з будь-яким вмістом). Вони завантажують в регістр AL (у разі операцій над байтами) або АХ (у разі операцій над словами) вміст елементу пам'яті за адресою, що знаходиться в парі регістрів Ds:si. Команда lodsb завантажує 1 байт, команда lodsw - 1 слово, а команда lods може бути використана для завантаження як байтів, так і слів. У останньому випадку розмір завантажуваного даного визначається описом рядка (за допомогою директив db або dw). Після операції завантаження регістр SI отримує позитивний (якщо прапор Df=0) або негативний (якщо прапор Df= 1) приріст. Величина приросту складає 1 або 2, залежно від розміру завантажуваного елементу. Команда не має параметрів і не впливає на прапори процесора.

Варіант команди lods має формат

lods рядок

(що не позбавляє від необхідності ініціалізувати регістри Ds:si адресою рядка). У цьому форматі можлива заміна сегменту рядка рядок:

lods Es:строка

Приклад 1

;У полях даних сегменту даних, що адресується через DS:
str db 'qwertyuiop'
; У програмному сегменті:
сld ;Двигаемся по рядку вперед
mov SI, off set str ;Адрес рядки
add Si,bx ;Добавим зсув (хай Вх=4)
lodsb ;AL='t', SI -> 'у'

Приклад 2

;У полях даних сегменту даних, що адресується через ES:
str db 'qwertyuiop'
;В програмному сегменті:
сld ;Двигаемся по рядку вперед
mov Si,offset str ;Адрес рядки
lodsbes:str ;AL='q', Es:si -> 'w'

загрузка...
Сторінки, близькі за змістом