Все про Assembler українською мовою на сайті net.kr.ua

 

:: Меню ::

Головна
Введення
Архітектура реального режиму
Основи програмування
Команди і алгоритми
Розширені можливості сучасних мікропроцесорів
Система команд процесорів Intel
Книга для гостей
Контакти
Добавити у вибране

:: Друзі ::

 
 

:: Лічильники ::

=

 

 

 

 

fff00e50

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

-

:: Наша кнопка ::

Отримати код:

Підтримайте наш сайт і розмістіть нашу кнопку на своєму ресурсі.


:: Популярне ::

-


:: Посилання ::

-


 

 

 


Copyright © net.kr.ua, 2019-2025 (assem.us)