перейти к полному списку дипломных проектов
Ссылка на скачивания файла в формате .doc находится в конце странички
Основну роботу виконує функція DirEngine, в яку, за допомогою регістру bx, передається зміщення функції Action (для подальшого виклику її за зміщенням)
З'являється необхідність перетворення двійкових даних у 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, що описують файли.
3.2. Розробка основної програми DR.asm
Модулі PARAMS.asm, STRIO.asm і BINASC.asm складають функціональну базу програмних інструментів для розробки основної програми. Згідно із поставленою задачею, програма має знаходити файли, задані маскою, копіювати DTA, що їх описує, у власний буфер, обробляти отримані дані і виводити необхідну інформацію на екран, а потім переходити до наступного файлу, що відповідає масці, доки не обробить всі.
Таким чином задачу можна розбити на 3 частини:
Отримання конфігураційних даних із консолі і, при їх відсутності, встановлення стандартної маски файлів;
Пошук файлів, що відповідають масці, і заповнення внутрішнього буферу їх DTA (процедура DirEgine);
Саме обробка 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:
mov bx, offset Action ; поміщення в bx адреси процедури A
скачать бесплатно РОЗРОБКА ЗАДАЧІ НА МОВІ АСЕМБЛЕР
Содержание дипломной работы
Пройдено великий етап від мов структурного програмування (таких як С) до систем багатомовного програмування, на роль яких претендують такі бренди як С, Java, та ін
В AH поміщується номер функції; регістрова пара вказує на рядок, що задає маску імені файлу; в СХ міститься атрибут файлу
Серед них: процедури вводу/виводу даних на консоль, обробки ASCII рядків, а також перетворення числових даних у ASCII формат для подальшого їх виведення на екран
asm, є зручними і простими інструментами виводу інформації на стандартний пристрій виводу і будуть використані в основній програмі
Основну роботу виконує функція DirEngine, в яку, за допомогою регістру bx, передається зміщення функції Action (для подальшого виклику її за зміщенням)
Після цього DirEngine повертає старий DTA і передає курування основній програмі, яка завершує роботу і повертає код виходу
exe повністю відповідає поставленому завданню про створення програми мовою асемблера, яка виводить вміст директорії, атрибути, розмір і час/дату створення файлів і папок, які в ній містяться
Attrib and (1 shl i)) <>0
then write(' * ') {вивід зірочок навпроти файлів }
else write(' '); {із відповідними атрибутами}
{------Вивід часу створення файлу}
Write(' ',((DTAAddress^
SYS * * * 22:22:0 5 /5 /1999 364B6
MSDOS
Інші приклади демонструють різноманітні засоби задання масок файлів із використанням символів "*" і "?", а також задання шляху до директорії, вміст якої необхідно вивести
Версия 1