|
Команди асемблера для Intel: DAA, DAS, DEC, DIV, 386+ ENTER,
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: DAA, DAS, DEC, DIV, 386+ ENTER,
DAA Десяткова корекція в регістрі AL після складанняКоманда daa коректує результат складання в регістрі AL двох упакованих двійково-десяткових (BCD) чисел (по одній цифрі в кожному півбайті), щоб отримати пару правильних упакованих двійково-десяткових цифр. Команда використовується услід за операцією складання упакованих двійково-десяткових чисел. Якщо результат складання перевищує 99, виникає перенесення і встановлюється прапор CF. Команда впливає на прапори SF, ZF, AF, PF і CF. Приклад 1
mov Al,87h ;Упакованное BCD 87
add Al,04h ;После складання Al=8bh
daa ;AL=91h, тобто упаковане BCD 91
Приклад 2
mov Al,87h ;Упакованное BCD 87
add Al,11h ;После складання Al=97h
daa ;AL=97h, тобто упаковане
;BCD 97 (в даному випадку
;команда daa нічого не робить)
DAS Десяткова корекція в регістрі AL після віднімання
Приклад 1
mov Al,55h ;Упакованное BCD 55
sub Al,19h ;После віднімання Al=3ch
das ;AL=36h, тобто упаковане BCD 36
Приклад 2
mov Al,55h ;Упакованное BCD 55
sub Al,15h ;После віднімання Al=40h
das ;AL=40h, тобто упаковане
;BCD 40 (в даному випадку
;команда das нічого не робить)
DEC Декремент (зменшення на 1)
Приклад 1
mov Ax,0ffffh
dec AX ;AX=FFFEh
Приклад 2 mov Cx,0 dec CX ;CX=FFFFh Приклад 3 mov Cx,3500h dec CL ;CX=35FFh Приклад 4 ; У полях даних mem dw 68 ;B програмному сегменті dec mem mem=67
Приклад mov EAX, 0 dec EAX ;EAX=FFFFFFFFh DIV Ділення цілих чисел без знаку
Для однобайтових операцій ділиме поміщається в регістр АХ; після виконання операції приватне записується в регістр AL, залишок - в регістр АН. Для двобайтових операцій ділиме поміщається в регістри Dx:ax (у DX - старша частина, в АХ - молодша); після виконання операції приватне записується в регістр АХ, залишок - в регістр DX. Як операнд-дільник команди div можна указувати регістр (окрім сегментного) або елемент пам'яті; не допускається ділення на безпосереднє значення. Якщо дільник дорівнює 0, або якщо приватне не поміщається в призначений регістр, збуджується переривання з вектором 0. Команда не впливає на прапори процесора. Команду div можна використовувати для цілочисельного ділення неупакованого двійково-десяткового числа в регістрі АХ не неупакований двійково-десятковий дільник, якщо перед нею виконати команду aad (див. приклад 3). Приклад 1 mov Ax,506 ;Делимое mov Bl,50 ;Делитель div BL ;AL=0Ah (приватне), Ah=06h (залишок) Приклад 2 ; У полях даних long dd 65537 ;Делимое ;У програмному сегменті mov Dx,word ptr long+2 ;DX=0001h, старша ;частина ділимого mov Ax,word ptr long ;AX=0001h, молодша ;частина ділимого mov Cx,256 ;Делитель div CX ;AX=0100h (приватне), ;Dx=0001h (залишок) Приклад З mov Ax,0807h ;Неупакованное BCD 87 mov Dl,09h ;Неупакованное BCD 9 aad;AX=0057h=87 div DL ;AX=0609h, тобто 9 і 6 в залишку
Приклад mov ЕАХ, 0fffffffh ;Младшая частина ділимого mov Edx,0 ;Старшая частина ділимого mov Ebx,256 ;Делитель div EBX ;Частное у Eax=000fffffh ;Залишок в Edx=000000ffh
386+ ENTER Створення стекового кадру для параметрів процедури
Команди enter і leave використовуються багатьма мовами високого рівня для управління доступом до локальних змінних вкладених процедур. Команда enter має два операнди. Перший (16-бітове безпосереднє значення) визначає число байтів, що виділяються в стеку для локальних змінних. Для 32-розрядних застосувань місце в стеку виділяється подвійними словами (по 4 байт), для 16-розрядних - словами (по 2 байт). Другий операнд (8-бітовос безпосереднє значення) задасть так званий лексичний рівень процедури, що характеризує ступінь її вкладеності. Залежно від значення лексичного рівня, команда enter виконується по-різному. При лексичному рівні, рівному 0, реалізується невкладена форма команди enter. В цьому випадку після входу в процедуру (командою call) із збереженням в стеку адреси повернення, в стек заноситься поточний вміст регістра ЕВР, в ЕВР копіюється поточне значення покажчика стека, а покажчик стека зміщується на число байтів, задане першим операндом команди enter . Створювана на сте-ке структура носить назву стекового кадру, а регістр ЕВР виконує в даному випадку функцію покажчика стекового кадру. Підпрограма має можливість звертатися до своїх локальних змінних по адресах Esp-4 і Esp-8 (для випадку резервування місця під дві змінні). Занісши в стек по цих адресах деякі дані (отримані як параметри виклику через регістри загального призначення або створені самостійно) підпрограма може потім багато разів до них звертатися, не боячись їх затирання в процесі використання стека. Оскільки команда enter набудувала покажчик стека на область, що знаходиться за межами локальних змінних, програма може використовувати команди push для збереження в стеку тимчасових даних. Команда leave, що розміщується в самому кінці процедури, перед завершуючою командою ret, копіює вміст ЕВР в ESP, звільняючи (у логічному плані) область локальних змінних, і знімає із стека збережений там початковий вміст ЕВР. Після цього командою ret можна повернутися в зухвалу процедуру. Оскільки перший параметр команди enter має розмірність слова, процедура в принципі має можливість зарезервувати в стеку для своїх локальних змінних до 64 Кбайт стекового простору. Лексичні рівні, відмінні від 0, використовуються в тих випадках, коли по правилах мови високого рівня кожна вкладена процедура має право звертатися до локальних змінних всіх вищерозміщених процедур, але не до процедур, що знаходяться на паралельних з нею гілках вкладеності. Іншими словами, зона видимості змінних розповсюджується на всі вкладені процедури, але дві підпрограми, що викликаються з однієї і тієї ж (вищерозміщеною) процедури, "не бачать" один одного. У таких випадках головній процедурі призначається лексичний рівень 1, всі підпрограми, що викликаються з неї, набувають значення лексичного рівня 2, підпрограми, що викликаються з цих процедур, мають рівень 3 і так далі Команди enter при ненульовому значення другого параметра створюють в стеку стекові кадри з складнішою структурою. Відмінність такого стекового кадру від розглянутого вище полягає в тому, що в нього, окрім області локальних змінних, входять також покажчики стекових кадрів всіх вищерозміщених процедур. В результаті будь-яка підпрограма може за допомогою свого покажчика (тобто вмісту ESP) звернутися до власних! змінним, а використовуючи покажчики кадрів вищерозміщених процедур, що зберігаються в стеку, "дотягнутися" і до їх локальних змінних. Як і раніше команди leave звільняють стек від стекових кадрів разом з тими, що всіма знаходяться в них даними. Приклад ;Зухвала процедура call subrl ;Подпрограмма subrl subrl proc enter2048,0 ;Место під локальні дані . . . ;Робота з локальними даними leave ret Зверніть увагу на додаткові посиланняГоловний розділСторінки, близькі за змістомзагрузка...
|
Сторінки, близькі за змістом ![]() Асемблер (англ. assembler) — загальноприйнята назва транслятора з автокоду. Асемблер переводить початкову програму, написану на автокоді, в переміщувану програму на мові машинній. Оскільки асемблер здійснює трансляцію на мову завантажувача, при завантаженні програми необхідна налаштування умовних адрес, тобто адрес, значення яких залежать від розташування даної програми в пам'яті ЦВМ і від її зв'язків з іншими незалежно трансльованими програмами. |
|
Copyright © 2008—2026 Портал Знань.
При використанні матеріалів посилання, для інтернет-ресурсів — гіперпосилання, на Znannya.org обов'язкове.
Зв'язок
|
НТУУ "КПІ" Інженерія програмного забезпечення КПІ Лабораторія СЕТ |
|