Ділення в ascii-форматі
Команда AAD (ASCII Adjust for Division - корекція для ділення ASCII-кодів) виконує коректування ASCII коду діленого до безпосереднього ділення. Однак, спочатку необхідно очистити ліві трійки ASCII-кодів для одержання розпакованого десяткового формату. Команда AAD може оперувати із двохбайтовим діленим в регістрі AX. Припустимо, що регістр AX містить ділене 3238 в ASCII- форматі,а регістр CL містить дільник 37 також в ASCII- форматі. Наступні команди виконують корекцію для подальшого ділення:
AND CL,0FH | ;Перетворити CL у розпакований формат | АХ |
AND AX,0F0FH | ;Перетворити AX у розпакований формат | 0208 |
AAD | ;Перетворити у двійковий | 001C |
DIV CL | ;Поділити на 7 | 0004 |
Команда AAD множить вміст AH на 10 (0Ah), додає результат 20 (14h) до регістра AL і очищає регістр AH. Значення 001C є шістнадцятковим еквівалентом десяткового числа 28. Дільник може бути тільки однобайтовий від 01 до 09. Наступний приклад виконує ділення чотирибайтового діленого на однобайтовий дільник. У програмі організований цикл обробки діленого справа наліво. Остача від ділення залишається в регістрі AH і команда AAD коректує її в регістрі AL. Остаточний результат: частка 00090204, а в регістрі AH остача 02.
Якщо дільник більше одного байта, то необхідно утворити інший цикл для обробки дільника, але доцільніше перетворити у двійковий формат і ділити в ньому.
TITLE ASCDIV (COM) Ділення в ASCII-форматі
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
BEGIN: JMP SHORT MAIN
DIVDND DB '3698' ;Елементи даних
DIVSOR DB '4'
QUOTNT DB 4 DUP(0)
MAIN PROC NEAR
MOV CX,04 ; 4 цикли
SUB AH,AH ; Стерти лівий байт діленого
AND DIVSOR,0FH ; Забрати трійку в дільнику
LEA SI,DIVDND
LEA DI,QUOTNT
A20:
MOV AL,[SI] ; Загрузити ASCII байт
; (можна LODSB)
AND AL,0FH ; Забрати трійку
AAD ; Корекція для ділення
DIV DIVSOR ; Ділення
MOV [DI],AL ; Зберегти частку
INC SI
INC DI
LOOP A20 ; Повторити 4 рази
RET
MAIN ENDP
CODEGS ENDS
END BEGIN
Yandex.RTB R-A-252273-3