Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
12.05.2015
Размер:
141.82 Кб
Скачать

Перетворення цілочисельних даних з машинної форми в символьну форму

Нехай початкове двійкове число знаходиться в регістрі 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.

Соседние файлы в папке SP_ukr