- •Просте макровизначення
- •Використання параметрів у макрокомандах
- •Вивід на екран.
- •Процедура підготовки даних до виводу на екран
- •Блок – схема алгоритму перетворення шістнадцяткового значення у ascii – код
- •Процедура переводу з шістнадцяткової в десяткову систему числення
- •Блок – схема алгоритму перетворення шістнадцяткового значення в десяткове
- •Ввід з клавіатури
- •Процедура вводу даних з клавіатури
- •Блок – схема алгоритму перетворення ascii – коду в шістнадцяткове значення
- •Процедура переводу з десяткової в шістнадцяткову систему числення
- •Блок – схема алгоритму перетворення десяткового значення в шістнадцяткове
- •Контрольні запитання:
- •Завдання:
- •Приклад виконання.
Вивід на екран.
1. Використання групи функцій переривання DOS INT 21H, при цьому номер функції цього переривання вказується в регістрі AH:
AH=02: Вивід символу. Для виводу символу на екран в поточну позицію курсору необхідно помістити ASCII код даного символу в pегістр DL. Коди табуляції, повернення каретки й кінця рядка діють звичайним чином.
AH=09 Вивід на екран рядка в базовій версії DOS.
Використання даної функції вимагає визначення текстового повідомлення в області даних, установки в регістрі AH значення 09 (виклик функциии DOS) і виклику переривання INT 21H. У процесі виконання операції кінець повідомлення визначається за ознакою закінчення рядка($).
2. Звертання до пристрою виводу(монітору), як до файлу.
Це здійснюється шляхом використання функцій 40h переривання 21h
При цьому у регістр CX заноситься кількість байт для виводу, а в регістр DX - адреса області виводу. У результаті успішного виконання операції виводу очищається прапорець переносу (CF) і в регістр AX встановлюється кількість виведених символів. При неуспішній операції встановлюється прапорець CF, а код помилки (в даному випадку 6) заноситься в регістр AX. Оскільки регістр AX може містити як довжину даних, так і код помилки, то єдиний спосіб визначити наявність помилки – перевірити прапорець CF.
Процедура підготовки даних до виводу на екран
Як видно з попереднього опису функцій друку на екран, єдино можливими даними для виводу є ASCII коди. Тому отримані в результаті обчислень шістнадцяткові значення слід перетворити у відповідні їм ASCII – коди, а вже потім застосувати одну з функцій 21h переривання. Очевидно, що для виводу шістнадцяткових значень будуть використані цифри від 0 до 9 та латинські букви A, B, C, D, E, F (або a,b,c,d,e,f). Відомо, що ASCII коди цих символів становлять:
цифра |
ASCII-код десяткова |
ASCII-код шістнадцяткова |
0 |
48 |
30 |
1 |
49 |
31 |
2 |
50 |
32 |
3 |
51 |
33 |
4 |
52 |
34 |
5 |
53 |
35 |
6 |
54 |
36 |
7 |
55 |
37 |
8 |
56 |
38 |
9 |
57 |
39 |
символ |
ASCII-код десяткова |
ASCII-код шістнадцяткова |
A |
65 |
41 |
B |
66 |
42 |
C |
67 |
43 |
D |
68 |
44 |
E |
69 |
45 |
F |
70 |
46 |
символ |
ASCII-код десяткова |
ASCII-код шістнадцяткова |
a |
97 |
61 |
b |
98 |
62 |
c |
99 |
63 |
d |
100 |
64 |
e |
101 |
65 |
f |
102 |
66 |
Отже:
щоб отримати ASCII - код цифри слід до її значення додати 30h (або 48d);
щоб отримати ASCII - код великої латинської літери до значення треба додати 37h (або 55d) (наприклад, для шістнадцяткового значення Сh, код повинен становити 43h, тобто Сh+37h, або в десятковому еквіваленті 12+55=67);
щоб отримати ASCII - код малої латинської літери до значення треба додати 57h або 87d. (наприклад, для шістнадцяткового значення Dh, код малої літери повинен становити 64h, тобто Dh+57h, або в десятковому еквіваленті 13+87=100).
При виводі на екран необхідно врахувати те, що в одному байті знаходиться дві шістнадцяткові цифри (або букви), тоді як для формування ASCII кодів використовується лише одна, тобто слід виділити спочатку старшу цифру а далі – молодшу (щоб відображення відповідало значенню). Для того щоб виділити старшу цифру в байті треба обнулити чотири молодші двійкові розряди (попередньо зберігши весь байт) а потім зсунути чотири старші на місце молодших. Далі, щоб виділити молодшу цифру, слід обнулити старші розряди. Якщо байт даних знаходиться в регістрі AL, то відповідні команди Асемблера будуть:
mov ah,al
and ah,0F0h
shr ah,4
and al,0Fh
тепер в регістрі AH знаходиться старша, а в регістрі AL – молодша цифра значення.
Крім того, значення може міститися у двох, трьох і більше байтах. В такому випадку перевід треба починати з найстаршого байту (оскільки саме він буде виводитися першим) і зчитувати дані з пам’яті зменшуючи лічильник байтів. Якщо значення, яке буде виводитися розміщене в пам’яті не по одному байту, то слід використати оператор приведення типу PTR. Наприклад якщо в сегменті даних міститься директива A dw 2356h, то команда MOV AL, BYTE PTR A дозволить занести в однобайтний регістр AL значення 56h, а MOV AH, BYTE PTR A+1 занесе в регістр AH значення 23h
