
Перетворення цілочисельних даних з машинної форми в символьну форму
Нехай початкове двійкове число знаходиться в регістрі dx, а результат перетворення повинен бути в область пам'яті term. Оскільки максимальне позитивне число зі знаком, яке може бути представлене в 16-розрядному регістрі, це двійкове число 0111111111111111, то відповідний йому десятковий терм має вигляд '32767', шістнадцятковий - '7fffh', вісімковий - '77777o', двійковий - '0111111111111111b'.
Таким чином визначається значення довжини терма - результату, яке повинне бути завантажене в лічильник символів. Потрібно також враховувати, що перша позиція терма повинна бути відведена під символ знаку.
Розрізнюють два основних методи перетворень цілочисельних даних при їх підготовці до відображення:
перетворення зі старших розрядів;
перетворення з молодших розрядів.
Алгоритм перетворення:
1. Ініціалізація лічильника символів і покажчика адреси області пам'яті term.
2. Аналіз знаку машинного числа, отримання модуля початкового числа і запис символа мінуса при від’ємному числі.
3. Виділення цифри числа у відповідній системі числення і формування коду ASCII отриманої цифри і запис його в область пам'яті term.
4. Декремент лічильника і при ненульовому його значенні, перехід на блок 3.
Реалізація блоку 1 для машинного числа в форматі слова.
У залежності від системи числення в лічильник цифр треба завантажити:
--------------------------------------------------------------
Система числення Значення лічильника цифр n
--------------------------------------------------------------
10 5
16 4
8 5
2 15
---------------------------------------------------------------
Реалізація блоку 2.
Аналіз знаку машинного слова зводиться до аналізу його старшого біта, наприклад, за допомогою команди or, and або test:
or dx, dx ; контроль знаку
jns plus
neg dx ; зміна знаку
mov term, '-' ; формування знаку в символьній формі
plus: ; ...
Реалізація блоку 3 різна в залежності від типу терма: якщо терм двійковий, вісімковий або десятковий, потрібно виділяти по одній цифрі і додавати до нього код 30h. Виділяти цифру в двійковій формі простіше усього зсувом праворуч на один розряд.
std ; завдання напряму у бік менших адрес
mov di, offset(term+n-1) ; завантаження адреси останньої цифри
xor al, al
shr dx, 1 ; зсув двійкового числа
adc al, 30h ; формування символа цифри
stosb ; запис символу в пам'ять
Якщо константа вісімкова або шістнадцяткова, то виділяти треба по одній цифрі, зсуваючи початкове число на 3 або 4 розряди відповідно.
Якщо терм десятковий, то для виділення десяткової цифри початкове двійкове число потрібно ділити на 10, і залишок від ділення буде представляти цифру одиниць.
Наприклад, якщо слово, що перетворюється, знаходиться в регістрі ax, то перетворення десяткової константи можна виконати так:
mov si, offset(term+n-1) ; завантаження адреси останньої цифри
mov bx, 10 ; завантаження основи системи числення
l1: xor dx, dx ; розширення ділимого
div bx ; виділення чергової цифри
add dl, 30h ; формування цифри із залишку
mov [si], dl ; збереження символу цифри
dec si ; зменшення адреси
test ax, ax ; контроль частки
jnz l1
Якщо ж двійкове число представлене байтом, то для його перетворення в десятковий терм досить виконати команду AAM.