Рефераты. Вивід вмісту каталогу y середовищі MS DOS

Слід зазначити, що функція 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, що описують файли.

3.2. Розробка основної програми DR.asm

Модулі PARAMS.asm, STRIO.asm і BINASC.asm складають функціональну базу програмних інструментів для розробки основної програми. Згідно із поставленою задачею, програма має знаходити файли, задані маскою, копіювати DTA, що їх описує, у власний буфер, обробляти отримані дані і виводити необхідну інформацію на екран, а потім переходити до наступного файлу, що відповідає масці, доки не обробить всі.

Таким чином задачу можна розбити на 3 частини:

1) Отримання конфігураційних даних із консолі і, при їх відсутності, встановлення стандартної маски файлів;

2) Пошук файлів, що відповідають масці, і заповнення внутрішнього буферу їх DTA (процедура DirEgine);

3) Саме обробка DTA, вивід даних на екран (процедура Action).

Спираючись на викладені міркування, було створено основну програму DR.asm:

IDEAL

MODEL small

STACK 256

FileName EQU 30 ; зміщення імені файлу в буфері dirData

DATASEG

exCode DB 0 ; код виходу

defaultSpec DB '*.*', 0 ; стандартній ASCII-шаблон маски

DTAseg DW ? ; сегмент для DTA

DTAofs DW ? ; зміщення для DTA

dirData DB 43 DUP (?) ; буфер для запису вмісту каталогу

buffer DB 6 DUP (?) ; буфер для збереження проміжних

; ASCII-рядків

point DB ' * ',0 ; ASCII-шаблон зірочки

tit1 DB 'The DIRWUER wersion 1.0',10,13, 'Romanov Alexander Urievich. KIT-13A NTU"KhPI"',10,13,'Copyright (C) 2005 by Romanov Alexander',0 ; інформація о програмі

tabl DB 'Filename OnR Skr Sys Tom Kat Arh Time

Data Size',0 ; заголовок таблиці

CODESEG

EXTRN GetParams:Proc, GetOneParam:Proc, ParamCount:Proc

із params.obj

EXTRN StrLength:Proc, StrWrite:Proc

EXTRN NewLine:Proc, WriteSimv:Proc, StrWrite2:Proc

; із strio.obj

EXTRN BinToAscHex:Proc, BinToAscDec:Proc

; із Binasc.obj

Start:

mov ax, @data ; встановлює в ax адресу сегмента даних

mov es, ax ; встановлює в es адресу сегмента даних

; ------Отримання даних із командного рядка

call GetParams ; отримати параметри із командного рядка

; (ds=PSP)

call NewLine ; перехід на новий рядок

; ------Виведення інформації о програмі

mov di,offset tit1 ; адреса рядка з інформацією о програмі

call StrWrite ; вивід інформації о програмі на консоль

call NewLine ; перехід на новий рядок

; ------Вибір маски

call ParamCount ; отримання в cx число параметрів

mov di, offset defaultSpec ; встановити di вказівником на

; стандартний шаблон маски

or cx, cx ; перевірка cx на наявність 0

jz @@10 ; якщо cx=0, перехід

xor cx, cx ; обнуління cx (номер параметру)

call GetOneParam ; отримати адресу параметра

; ------Виклик підпрограми обробника

@@10:

Страницы: 1, 2, 3, 4, 5, 6, 7



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.