
- •Просте макровизначення
- •Використання параметрів у макрокомандах
- •Вивід на екран.
- •Процедура підготовки даних до виводу на екран
- •Блок – схема алгоритму перетворення шістнадцяткового значення у ascii – код
- •Процедура переводу з шістнадцяткової в десяткову систему числення
- •Блок – схема алгоритму перетворення шістнадцяткового значення в десяткове
- •Ввід з клавіатури
- •Процедура вводу даних з клавіатури
- •Блок – схема алгоритму перетворення ascii – коду в шістнадцяткове значення
- •Процедура переводу з десяткової в шістнадцяткову систему числення
- •Блок – схема алгоритму перетворення десяткового значення в шістнадцяткове
- •Контрольні запитання:
- •Завдання:
- •Приклад виконання.
Блок – схема алгоритму перетворення шістнадцяткового значення у ascii – код
Як видно з блок-схеми, при утворенні ASCII – коду, до значення завжди треба додавати не менше ніж 30h. Тому для скорочення кількості необхідних операторів переходу, варто перетворити процедуру додавання наступним чином:
Для реалізації таких дій на Асемблері необхідно використовувати умовні переходи. До того ж, при перетворенні більше ніж одного байту, для скорочення кількості необхідних операторів варто використати оператор циклу, або створити підпрограму перетворення одного байту і викликати її необхідну кількість разів.
Процедура переводу з шістнадцяткової в десяткову систему числення
Для того щоб вивести на екран десятковий результат, маючи в пам’яті шістнадцяткове значення , треба перевести це значення в 10-ву систему числення, а потім до кожної десяткової цифри додати 30h, отримавши таким чином ASCII- код.
Для переходу від системи числення з більшою основою до системи числення з меншою основою використовується ділення основу поки результат не буде менший за цю основу. Остачі, які будуть лежати в межах від 0 до 9 утворюють десяткове число. Наприклад, якщо треба перетворити шістнадцяткове число 965 в десяткову систему систему слід ділити його на 0А(h):
965(h) : 0А(h) = F0 (частка) 5(остача)
F0(h) : 0А(h) = 18 (частка) 0(остача)
18(h) : 0А(h) = 2 (частка) 4(остача)
Взявши остачі в порядку від останньої до першої і починаючи з останньої частки, маємо 2405 в десятковій системі числення.
Блок – схема алгоритму перетворення шістнадцяткового значення в десяткове
Ввід з клавіатури
1. Використання групи функцій переривання DOS INT 21H, при цьому номер функції цього переривання вказується в регістрі AH:
AH=01: Ввід символу з клавіатури з еховідображенням. Дана функція повертає значення в регістрі AL. Якщо вміст AL не дорівнює нулю, то воно являє собою стандартний ASCII- cимвол, наприклад, букву або цифру. Нульове значення в регістрі AL свідчить про те, що на клавіатурі була натиснута спеціальна функціональна клавіша, наприклад, Номе, F1 або PgUp. Для визначення скен-коду клавіш, необхідно повторити виклик функції Дана функція реагує на запит Ctrl/Break.
AH=07: Прямий ввід із клавіатури без еховідображення. Дана функція працює аналогічно функції 01 із двома відмінностями: введений символ не відображається на екрані, тобто немає еха, і відсутня реакція на запит Ctrl/Break.
AH=08: Ввід із клавіатури без еховідображення. Дана функція діє аналогічно функції 01 з однією відмінністю: введений символ не відображається на екрані.
AH=0Ah - буферизований ввід стрічки з еховідображенням;
Для використання даної функції область вводу вимагає наявності cписку параметрів, що містить поля, які необхідні при виконанні команди INT. По-перше, повинна бути визначена максимальна довжина тексту, що вводить. Це необхідно для попередження користувача звуковим сигналом, якщо набрано занадто довгий текст; символи, що перевищують максимальну довжину не приймаються. По-друге, у списку параметрів повинне бути певне поле, куди команда повертає дійсну довжину уведеного тексту в байтах. . По-третє, повинно бути виділено місце під введені символи. Для запиту на ввід необхідно помістити в регістр AH номер функції - 10 ( 0AH), у регістр DX завантажити адресу списку параметрів і виконати INT 21H. Команда INT очікує поки користувач не введе із клавіатури текст, перевіряючи при цьому, щоб кількість введених символів не перевищувало максимального значення, зазначеного в списку параметрів. Для вказівки кінця вводу користувач натискає клавішу Enter. Код цієї клавіші (0Dh) також заноситься в поле вводу. Таким чином, дійсна довжини тексту, що вводиться, є на одиницю менша від максимально передбаченої.
AH=0Bh: Перевірка стану клавіатури. Дана функція повертає FFh у регістрі AL, якщо ввід із клавіатури можливий, у іншому випадку - 00. Цей засіб пов’язане з функціями 01, 07 і 08, які не очікують вводу з клавіатури.
2. Посимвольний ввід шляхом звертання до драйвера BIOS за допомогою переривання INT 16H
Команда BIOS INT 16H виконує спеціальну операцію, яка відповідно до коду в регістрі AH забезпечує наступні три функції вводу клавіатури.
AH=00: Читання символу. Дана функція поміщає в регістр AL черговий ASCII символ, введений із клавіатури, і встановлює скен код у регістрі AH.. Якщо на клавіатурі натиснута одна з спеціальних клавіш, наприклад, Номе або F1, то в регістр AL заноситься 00. Автоматичного еховідображення символу на екран не відбувається.
AH=01: Визначення наявності введеного символу. Дана функція скидає прапорець нуля (ZF=0), якщо є символ для читання з клавіатури; черговий символ і скен-код будуть поміщені в регістри AL і AH, відповідно і даний елемент залишиться в буфері.
AH=02: Визначення поточного стану клавіатури.
3. Звертання до клавіатури, як до файлу.
Це здійснюється шляхом використання функцій 3Fh переривання 21h
При цьому у регістр CX заноситься кількість байт для вводу, а в регістр DX - адреса області вводу. У результаті успішного виконання операції вводу очищається прапорець переносу (CF) і в регістр AX встановлюється дійсна кількість байт, що беруть участь в операції. При неуспішній операції встановлюється прапорець CF, а код помилки (в даному випадку 6) заноситься в регістр AX. Оскільки регістр AX може містити як довжину даних, так і код помилки, то єдиний спосіб визначити наявність помилки – перевірити прапорець CF, хоча помилки читання із клавіатури й виводу на екран - не часті.
Після введеного тексту безпосередньо слідує символ повороту каретки (0Dh), що був введений, і символ кінця рядка (0Ah), що не був введений. Тому, максимальна кількість символів і розмір області вводу повинні передбачати місце для двох додаткових символів. Якщо буде введено менше символів ніж максимальне значення, то в пам'яті, після введених символів збережуться колишні значення. У результаті успішної операції буде очищений прапорець CF (що можна перевірити) і в регістрі AX буде встановлена кількість байт, введених із клавіатури(кількість введених символів +2).