logo search
Pract / Prakt4

Ділення в 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