|
Команди асемблера для Intel: LOCK, LODS, LODSB, LODSW
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: 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, щоб виключити одночасне звернення двох процесів до одного елементу пам'яті. 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' Зверніть увагу на додаткові посиланняГоловний розділСторінки, близькі за змістомзагрузка...
|
Сторінки, близькі за змістом ![]() Асемблер (англ. assembler) — загальноприйнята назва транслятора з автокоду. Асемблер переводить початкову програму, написану на автокоді, в переміщувану програму на мові машинній. Оскільки асемблер здійснює трансляцію на мову завантажувача, при завантаженні програми необхідна налаштування умовних адрес, тобто адрес, значення яких залежать від розташування даної програми в пам'яті ЦВМ і від її зв'язків з іншими незалежно трансльованими програмами. |
|
Copyright © 2008—2026 Портал Знань.
При використанні матеріалів посилання, для інтернет-ресурсів — гіперпосилання, на Znannya.org обов'язкове.
Зв'язок
|
НТУУ "КПІ" Інженерія програмного забезпечення КПІ Лабораторія СЕТ |
|