3.1.3. Модуль BINASC.asm
Мови високого рівня надають програмісту можливість безпосередньо зчитувати і виводити числові значення. Нажаль, мова асемблера таких інструментів не має. В основній програмі значна частина роботи пов’язана з виводом із деякого буфера даних на екран . Однак дані в буфері зберігаються у вигляді двійкових слів того чи іншого типу. З'являється необхідність перетворення двійкових даних у ASCII-рядки, щоб у подальшому їх можна було вивести на екран. Дану проблему і покликані вирішити функції модуля BINASC.asm. Модуль складається із чотирьох функцій: допоміжних функцій HexDigit (перетворення чотирьохбітового значення у ASCII-цифру) і NumToAscii (перетворення беззнакового двійкового числа у ASCII-рядок), а також двох функцій BinToAscHex і BinToAscDec, які встановлюють систему числення і викликають вищезгадані функції.
Слід зазначити, що функція BinToAscDec зручна для перетворення і подальшого виводу чисел типу "слово" у вигляді десяткового числа.
Функцію BinToAscHex можна використовувати для виводу подвійного слова у вигляді шістнадцятирічного числа, послідовно перетворюючи і виводячи спочатку молодші два, а потім і старші байти, на екран.
Це дозволяє вирішити проблему обробки чотирьохбайтових даних, оскільки звичайні регістри є двохбайтовими і перетворення такого числа у, наприклад, десяткове представлення є проблематичним.
Код програмного модуля BINASC.asm приведено нижче:
IDEAL
MODEL small
ASCnull EQU 0 ; нульовий ASCII-символ
DATASEG
CODESEG
PUBLIC HexDigit, NumToAscii
PUBLIC BinToAscHex, BinToAscDec
; -------------------------------------------------------------------------------------------
; HexDigit перетворює чотирьохбітове значення в ASCII-цифру
; -------------------------------------------------------------------------------------------
; Вхід dl значення від 0 до 15
; Вихід dl шістнадцятирічний еквівалент ASCII-цифри
; Регістри dl
; -------------------------------------------------------------------------------------------
PROC HexDigit
cmp dl, 10 ; перевірка, чи є dl < 10
; (тобто менше шістнадцятирічного 'А')
jb @@10 ; якщо так, то перехід
add dl, 'A'-10 ; перетворити в A, B, C, D, E або F
ret ; повернення до викликаючої програми
@@10:
or dl, '0' ; перетворити в числа від 0 до 9
ret ; повернення до викликаючої програми
ENDP HexDigit
; -------------------------------------------------------------------------------------------
; NumToAscii перетворює беззнакове двійкове значення у ASCII-рядок
; згідно із заданою системою числення
; -------------------------------------------------------------------------------------------
; Вхід ax двохбайтове число, яке перетворюється
; bx основа системи числення результату (2 – двійкова,
; 10 – десяткова, 16 – шістнадцятирічна)
; cx мінімальна кількість цифр, що виводяться
; di адреса рядка для результату
; Вихід di вказує на новостворений рядок із результатом
; Регістри не має
; -------------------------------------------------------------------------------------------
PROC NumToASCII
push dx ; збереження змінюваних регістрів
push di
push si
xor si, si ; встановити лічильник цифр у стеку в 0
jcxz @@20 ; якщо cx = 0, то перехід
@@10:
xor dx, dx ; обнуління dx; ax розширюється до
; 32-х-бітного dxax
div bx ; в ax результат ділення на bx, в dx залишок
call HexDigit ; перетворення числа в dl в ASCII-пару
push dx ; збереження цифри в стеку
inc si ; збільшення лічильника цифр у стеку
loop @@10 ; виконувати цикл, доки не оброблена
; мінімальна кількість цифр
@@20:
inc cx ; встановити cx=1, якщо не усі цифри
; оброблені
or ax, ax ; перевірка ax на обробку всіх цифр
jnz @@10 ; якщо ax≠a, продовження перетворень
mov cx, si ; в cx поміщується кількість цифр у стеку
jcxz @@40 ; пропуск наступного циклу, якщо cx=0
cld ; автоматичне збільшення di
@@30:
pop ax ; в ax поміщується цифра із стеку
stosb ; запис цифри в рядок і збільшення di
loop @@30 ; в циклі вивід cx цифр
@@40:
mov [byte di], ASCnull ; записується 0 у кінець рядка
pop si ; відновлення регістрів
pop di
pop dx
ret ; повернення до викликаючої програми
ENDP NumToASCII
; -------------------------------------------------------------------------------------------
; BinTo AscHex перетворює двійкове значення в шістнадцятирічні
; ASCII-рядки
; -------------------------------------------------------------------------------------------
; Вхід ax двохбайтове значення, що перетворюється
; cx мінімальна кількість чисел, що виводиться
; di адреса рядка для результату
; Вихід di вказує на рядок із сформованим результатом
; Регістри не має
; -------------------------------------------------------------------------------------------
PROC BinToAscHex
mov bx, 16 ; в bx встановити основу шістнадцятирічної
; системи числення - 16
call NumToAscii ; перетворення числа із ax в ASCII-рядок,
; на який вказує di
ret ; повернення до викликаючої програми
ENDP BinToAscHex
; -------------------------------------------------------------------------------------------
; BinTo AscHex перетворює двійкове значення в десяткові ASCII-рядки
; -------------------------------------------------------------------------------------------
; Вхід ax двохбайтове значення, що перетворюється
; cx мінімальна кількість чисел, що виводиться
; di адреса рядка для результату
; Вихід di вказує на рядок із сформованим результатом
; Регістри не має
; -------------------------------------------------------------------------------------------
PROC BinToAscDec
mov bx, 10 ; в bx встановити основу десяткової
; системи числення – 10
call NumToAscii ; перетворення числа із ax в ASCII-рядок,
; на який вказує di
ret ; повернення до викликаючої програми
ENDP BinToAscDec
END
Таким чином програмний модуль BINASC.asm дає нам спеціальні функції, що дозволяють перетворити і вивести на екран дані із DTA, що описують файли.
... · пошуковий механізм, який користувачі використовують як інтерфейс для взаємодії з базою даних. Засоби пошуку типу агентів, павуків, кроулерів і роботів використовуються для збору інформації про документи, які знаходяться в мережі Інтернет. Це спеціальні програми, які займаються пошуком сторінок в мережі, збирають гіпертекстові посилання з цих сторінок і автоматично індексують інформацію, яку ...
... . Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив ...
... ів» (Tools Palette), яка дозволяє (як у PageMaker) переключатися між виділеними рамками та редагувати їх вміст. При запуску програми ця панель не з’являється і її потрібно спеціально викликати із меню «Графика» (Graphics) — погодьтесь, це досить неочікуване місце для цієї команди. Програма підтримує тільки один рівень відкату, у той час як багато інших пакетів підтримують до ста таких рівнів. ...
... обміну даними з ПЭВМ у процесі виконання програми користувача; 11. Вкажіть типи буферних схем, використаних в УУМС-2. Їх призначення та особливості роботи. 12. Дайте визначення адресного простору мікропроцесорної системи та розпишіть його розподіл в УУМС-2. Адресний простір УУМС складається з областей, состав яких показаний у табл.2. Варто звернути увагу, що внутрішні адресні області ...
0 комментариев