DAA Десяткова корекція в регістрі AL після складання
Команда daa коригує результат складання в регістрі AL двох упакованих двійково-десяткових (BCD) чисел (по одній цифрі в кожному полубайте), щоб отримати пару правильних упакованих двійково-десяткових цифр. Команда використовується услід за операцією складання упакованих двійково-десяткових чисел. Якщо результат складання перевищує 99, виникає перенесення і встановлюється прапор CF. Команда впливає на прапори SF, ZF, AF, PF і CF.
mov AL, 87h; Упаковане BCD 87
add AL, 04h; Після складання AL = 8Bh
daa; AL = 91h, тобто упаковане BCD 91
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.
mov AL, 55h; Упаковане BCD 55
sub AL, 19h; Після вирахування AL = 3Ch
das; AL = 36h, тобто упаковане BCD 36
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.
mov AX, 0FFFFh
dec AX; AX = FFFEh
mov CX, 3500h
dec CL; CX = 35FFh
; У полях даних
mem dw 68
; B програмному сегменті
dec mem mem = 67
mov EAX, 0
dec EAX; EAX = FFFFFFFFh
DIV Розподіл цілих чисел без знака
Команда div виконує ділення цілого числа без знака, що знаходиться в регістрах АХ (у разі поділу на байт) або DX: AX (в разі поділу на слово), на операнд-джерело (ціле число без знака). Розмір діленого в два рази більше розмірів дільника і залишку.
Для однобайтових операцій ділиме поміщається в регістр АХ; після виконання операції приватне записується в регістр AL, залишок - в регістр АН.
Для двобайтових операцій ділиме поміщається в регістри DX: AX (в DX - старша частина, в АХ - молодша); після виконання операції приватне записується в регістр АХ, залишок - в регістр DX.
Як операнд-дільник команди div можна указувати регістр (окрім сегментного) або елемент пам'яті; не допускається поділ на безпосереднє значення. Якщо дільник дорівнює 0, або якщо приватне не поміщається в призначений регістр, збуджується переривання з вектором 0. Команда не впливає на прапори процесора.
Команду div можна використовувати для цілочисельного ділення неупакованого двійковій-десяткового числа в регістрі АХ НЕ неупакований двійковій-десятковий дільник, якщо перед нею виконати команду aad (див. Приклад 3).
mov AX, 506; Подільне
mov BL, 50; Дільник
div BL; AL = 0Ah (приватне), AH = 06h (залишок)
; У полях даних
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 Створення стекового кадру для параметрів процедури
; Зухвала процедура
call subrl
; Підпрограма subrl
subrl proc
enter2048,0; Місце під локальні дані
. ; Робота з локальними даними
leave
ret