 |
::
Меню :: |
 |
|
|
 |
::
Друзі :: |
 |
|
|
 |
::
Лічильники :: |
 |
|
|
|
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 після віднімання
Команда
das коректує результат віднімання в регістрі AL двох упакованих двійково-десяткових
(BCD) чисел (по одній цифрі в кожному півбайті), щоб отримати пару
правильних упакованих десяткових цифр. Команда використовується услід за операцією віднімання
упакованих двійково-десяткових чисел. Якщо для віднімання була потрібна
позика, встановлюється прапор CF. Команда впливає на прапори
SF, ZF, AF, PF
і CF.
Приклад 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)
Команда dec віднімає 1 з операнда, як який можна указувати
регістр (окрім сегментного) або елемент пам'яті розміром як в байт, так і в слово.
Не допускається використовувати як операнд безпосереднє значення. Операнд
інтерпретується як число без знаку. Команда впливає на прапори
OF, SF, ZF, AF і PF.
Приклад 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
Допустиме використання
32-бітових операндів і додаткових режимів адресації 32-розрядних процесорів.
Приклад
mov
EAX, 0
dec EAX ;EAX=FFFFFFFFh
DIV Ділення
цілих чисел без знаку
Команда
div виконує ділення цілого числа без знаку, що знаходиться в регістрах
АХ (у разі ділення на байт) або Dx:ax (у разі ділення на слово), на операнд-джерело
(ціле число без знаку). Розмір ділимого в два рази більше розмірів дільника
і залишку.
Для однобайтових операцій ділиме поміщається в регістр АХ; після виконання
операції приватне записується в регістр 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 в залишку
Допустиме використання
32-бітових операндів і додаткових режимів адресації 32-розрядних процесорів.
При цьому, якщо дільник представляє 32-бітову величину, то можливий тільки
один варіант команди ділення, коли ділиме знаходиться в парс регістрів
Edx:eax.
В цьому випадку приватне буде поміщене в регістр ЕАХ, залишок - в
EDX.
Приклад
mov ЕАХ, 0fffffffh ;Младшая частина ділимого
mov Edx,0 ;Старшая частина ділимого
mov Ebx,256 ;Делитель
div EBX ;Частное у Eax=000fffffh
;Залишок в Edx=000000ffh
386+ ENTER
Створення стекового кадру для параметрів процедури
Команда enter, що зазвичай є першою командою процедури,
виділяє заданий об'єм стекового простору для локальних (автоматичних)
параметрів процедури, надаючи процедурі покажчик на виділену область (як такий
покажчик використовується регістр ЕВР) і зміщуючи покажчик стека ESP так, щоб він
указував на початок вільного стекового простору. В результаті процедура має
можливість звертатися по ходу свого виконання до своїх локальних параметрів і, в той
же час, користуватися простором стека, що залишився, для
тимчасового збереження в нім будь-яких даних за допомогою команд push і pop. Команда leave в
кінці процедури виконує зворотні дії, повертаючи стек в початковий стан
і знищуючи область локальних змінних. Локальними, як відомо, називаються якраз
ті змінні, які існують тільки протягом часу виконання деякої
процедури, і автоматично зникають після це завершення.
Команди 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
-
|
 |
::
Наша кнопка :: |
 |
|
 |
Отримати код:
|
Підтримайте наш сайт і розмістіть нашу
кнопку на своєму ресурсі. |
|
|
 |
::
Популярне :: |
 |
|
|
 |
:: Посилання :: |
 |
|
|
|