4. Розробка задачі на мові високого рівня із використанням асемблерних фрагментів коду
Як показала третя глава, розробка програми чисто на асемблері є складним процесом і потребує розробки супутніх (допоміжних) модулів для реалізації моментів, що не пов’язані із основним алгоритмом задачі (таких, як вивід на екран, перетворення двійкових даних у ASCII-рядки, тощо). Мови високого рівня дають можливість реалізувати все автоматично [3]. Такий стан речей спонукає розробити програму, в якій основний алгоритм пошуку DTA і необхідних файлів, що відповідають масці, реалізовані асемблерними вставками, а задачі, пов’язані із розробкою інтерфейсу і виводу даних на екран, реалізовані, наприклад, мовою Pascal.
4.1. Розробка програми на Pascal
Мова Pascal дає можливість створити вказівник типу "запис" (поля "запису" описують атрибут, час, дату, розмір і ім'я файлу) прямо на стандартний буфер DTA, не створюючи власного і не виконуючи зайвих дій по встановленню нової адреси буфера DTA і відновлення старої після завершення програми. Вивід інформації про файл довіряється процедурі, яка обробляє поля вказівника на DTA і виводить дані стандартними функціями Pascal.
На початку програми є сенс запитувати користувача про бажання задати власну маску для файлів, або лишити стандартну ("*.*").
Згідно із зазначеними змінами було розроблено програму DIRWUER.pas, приведену нижче:
{DIRWUER.pas}
Uses crt;
{------FindFirst – шукає перше входження файлу, що відповідає заданій масці}
Function FindFirst (Path : PChar) : Boolean; assembler;
asm
mov ah, 4Eh {в ah номер функції першого пошуку}
mov cx, 3fh {в cx маска для всіх атрибутів файлу}
mov dx, word ptr Path {dx вказує на маску файлу}
int 21h {виклик функції першого пошуку файлу}
mov al, 0 {в al поміщується 0 – код помилки (false)}
jc @Failed {якщо помилка, повернути код помилки,}
inc al {інакше повернути 1 – true }
@Failed:
end;
{------FindNext шукає наступне входження файлів, маска і атрибути яких були задані при попередньому пошуку.}
Function FindNext : Boolean; assembler;
asm
mov ah, 4Fh {в ah номер функції наступного пошуку }
{файлу}
int 21h {пошук наступного файлу за параметром,}
{заданим функцією 4Eh}
mov al, 0 {в al поміщується 0 – код помилки (false)}
jc @Failed {повернути код помилки, якщо помилка}
inc al {інакше повернути 1 – true }
@Failed:
end;
Type
DTA = record {запис описує структуру DTA-буфера}
Reserved : Array[0..$14] of Byte; {резервна область пам'яті}
Attrib : Byte; {поле атрибуту}
Time : Word; {поле часу створення}
Date : Word; {поле дати}
Size : Longint; {розмір}
Name : Array[0..$C] of Char; {ім'я файлу із розширенням}
end;
PDTA = ^DTA; {вказівник на буфер DTA}
{------GetDTAAddress повертає адресу буфера DTA}
Function GetDTAAddress : PDTA; assembler;
asm
mov ah, 2Fh {в ah номер функції пошуку DTA}
int 21h {отримання в as:bx адреси DTA }
push es {в dx через стек передаються дані із es}
pop dx
mov ax, bx {передача в ax даних із bx}
{в dx:ax повертається результат}
end;
Var
DTAAddress : PDTA;
s : string;
Path : PChar;
i : byte;
Label 1;
{------Процедура виводу даних о файлі/директорії згідно із інформацією в DTA}
Procedure ShowEntry;
Begin
Write(DTAAddress^.Name:13,' '); {вивід імені файлу із розширенням}
for i: = 0 to 5 do
if (DTAAddress^.Attrib and (1 shl i)) <>0
then write(' * ') {вивід зірочок навпроти файлів }
else write(' '); {із відповідними атрибутами}
{------Вивід часу створення файлу}
Write(' ',((DTAAddress^.Time and $0f800)shr 11):2);
Write(':',((DTAAddress^.Time and $07e0)shr 5):2,':');
Write(((DTAAddress^.Time and $1f)shl 1):2);
{------Вивід дати створення файлу}
Write(' ',(DTAAddress^.Date and $1f):2,'/');
Write(((DTAAddress^.Date and $01e0)shr 5):2,'/');
Write((((DTAAddress^.Date and $0f800)shr 9)+$07bc):4);
Writeln(' ',DTAAddress^.Size:7); {вивід розміру файлу}
end;
BEGIN
ClrScr; {очистка екрану}
{------Вивід інформації о програмі}
Writeln('The DIRWUER wersion 1.0');
Writeln('Romanov Alexander Urievich. KIT-13A KHPI');
Writeln('Copyright (C) 2005 by Romanov Alexander');
DTAAddress := GetDTAAddress; {встановлення вказівника}
{на адресу DTA}
1:
Write('Input the mask (default: *.*; exit: q): '); {запит на введення маски}
Readln(s); {отримання відповіді}
if s='' then Path:='*.*' {якщо відповіді не має,}
{встановлення стандартної маски}
else if s='q' then halt {якщо відповідь 'q', завершення}
{роботи програми}
else Path:=Addr(s[1]); {встановлення заданої маски}
if FindFirst (Path) then {знаходження першого файлу}
begin
Write('Filename OnR Skr Sys Tom ');
Writeln('Kat Arh Time DataSize'); {вивід заголовка таблиці}
ShowEntry; {вивід на екран даних про файл}
while FindNext do ShowEntry; {доки знайдено наступний файл,}
{виводити дані про нього на екран}
end
else writeln('Failed');{інакше, при незнаходженні}
{жодного файлу, виводиться}
{повідомлення про їх відсутність}
goto 1; {перехід на початок}
END.
Схема алгоритму програми приведена в додатках (Додаток Б).
Програма реалізує запит на введення маски файлу і, згідно із реакцією користувача, встановлює стандартну маску, або введену користувачем. При відповіді q – програма завершується.
Після задання маски встановлюється вказівник на DTA-буфер, після чого програма реалізує пошук файлів, що відповідають масці і вивід даних на екран. Потім програма повертається до початкового кроку запиту нової маски файлів для наступних дій.
Результати роботи програми проілюструємо наступним чином:
The DIRWUER wersion 1.0
Romanov Alexander Urievich. KIT-13A KHPI
Copyright (C) 2005 by Romanov Alexander
Input the mask (default: *.*; exit: q):
Filename OnR Skr Sys Tom Kat Arh Time Data Razmer
. * 11:59:18 11/5 /2005 00
.. * 11:59:18 11/5 /2005 00
BLW32.DLL * 12:12:0 14/5 /1996 52020
DEBUG.EXE * * 22:22:0 5 /5 /1999 0518A
USA.BLL * 12:12:0 14/5 /1996 18DCD
MYREP.CBA * 18:48:42 25/1 /2002 01F
DIRECT * 12:27:54 11/5 /2005 00
CATALOG3.CAB * * 22:22:0 5 /5 /1999 425C3
SUHELPER.BIN * * 22:22:0 5 /5 /1999 05C0
SAVE32.COM * * 22:22:0 5 /5 /1999 0398
ASD.LOG * * 13:8 :20 11/8 /2004 0162
IO.SYS * * * 22:22:0 5 /5 /1999 364B6
MSDOS.SYS * * * * 18:30:28 16/7 /2004 0697
08-APRIL.MP3 * 11:42:44 7 /12/2003 B11100
DR.EXE * 12:14:28 11/5 /2005 05A1
DR.BAT * 12:54:34 4 /5 /2005 09B
DIRWUER.EXE * 13:48:38 13/ 5/2005 6256
Input the mask (default: *.*; exit: q): *.b??
Filename OnR Skr Sys Tom Kat Arh Time Data Razmer
USA.BLL * 12:12: 0 14/ 5/1996 101837
SUHELPER.BIN * * 22:22: 0 5/ 5/1999 1472
DR.BAT * 12:54:34 4/ 5/2005 155
Input the mask (default: *.*; exit: q): direct/*.*
Filename OnR Skr Sys Tom Kat Arh Time Data Razmer
. * 12:27:54 11/ 5/2005 0
.. * 12:27:54 11/ 5/2005 0
BINASC.ASM * 11: 3:40 8/ 5/2005 768
PARAMS.ASM * 13:31:20 6/ 5/2005 1252
TD.EXE * 14:39:40 24/12/2002 492784
Input the mask (default: *.*; exit: q): q
Аналізуючи отримані результати, зазначимо, що за умовчанням (перший приклад) програма DIRWUER.exe виводить увесь вміст директорії, в якій вона розташована. Інші приклади демонструють різноманітні засоби задання масок файлів із використанням символів "*" і "?", а також задання шляху до директорії, вміст якої необхідно вивести. Відповідь "q" завершує програму.
Таким чином DIRWUER.exe є повноцінною програмою, яка реалізує вивід інформації о файлах, що відповідають заданій масці. Відмінність програми DIRWUER.exe від DR.exe полягає в покращеному інтерфейсі і більш ефективній роботі із буфером DTA, що стало можливим при використанні мови високого рівня Pascal, як оболонки при написанні програми.
Висновки
За результатами дослідження виводу вмісту каталогу у середовищі MS DOS було проаналізовано деякі аспекти його роботи із файлами і консоллю і створено дві повноцінні програми мовами асемблер і Pascal, які дозволяють реалізувати перегляд дерева каталогів і отримувати всю інформацію про файли, що в них містяться.
Слід зазначити, що у тому разі, коли програма, написана мовою асемблер, має розмір лише 1441 байт, то програма, створена за допомогою мови Pascal, займає вже 6256 байт, тобто більше, ніж у чотири рази. Однак витрати на написання цих програм співвідносяться приблизно у тій же пропорції, але в інший бік, оскільки ті задачі, які мовою Pascal були вирішені вбудованими методами, мовою асемблер треба було виконувати власноруч.
Таким чином, мета даного курсового проекту вважається виконаною: було досліджено особливості програмування мовами різного рівня, а також на конкретному прикладі виводу вмісту каталогу у середовищі MS DOS продемонстровані переваги та недоліки, котрі при цьому виникають.
Список використаних джерел
1. Методические указания к лабораторным работам № 10–№ 18 по курсу "Архитектура вычислительных систем" / Составит. А.И. Поворознюк, И.С. Зыков. – Харьков: ХПИ. – 88 с.
2. Поворознюк А.И. Архитектура компьютеров. Архитектура микропроцессорного ядра и системных устройств: Учеб. пособие. Ч.2. – Харьков: Торнадо, 2004. – 355 с.
3. Пустоваров В.И. Язык Ассемблера в программировании информационных и управляющих систем. – М.: ЭНТРОП, 1997. – 304 с.
4. Сван Т. Освоение Turbo Assembler. – К.: Диалектика, 1996. – 544 с.
5. Белецкий Я. Турбо Ассемблер: Версия 2.0: Учеб. пособие для студентов вузов / Пер. с польск. В.В. Яценко. М.: Машиностроение, 1994. – 160 с.
6. Rollins D. TECH Help. Электронный справочник. Версия 1.2. / Адапт. С.М. Абель. – Flambeaux Software. –© 1985–1987.
7. Norton P. Peter Norton's DOS Guide. – New Delhi: Prentice Hall of India Private Limited, 1996. – 744 p.
Додатки
Додаток А
Схема алгоритму DR.asm
Додаток Б
Схема алгоритму DIRWUER.pas
Схема алгоритму DIRWUER.pas (продовження)
... · пошуковий механізм, який користувачі використовують як інтерфейс для взаємодії з базою даних. Засоби пошуку типу агентів, павуків, кроулерів і роботів використовуються для збору інформації про документи, які знаходяться в мережі Інтернет. Це спеціальні програми, які займаються пошуком сторінок в мережі, збирають гіпертекстові посилання з цих сторінок і автоматично індексують інформацію, яку ...
... . Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив ...
... ів» (Tools Palette), яка дозволяє (як у PageMaker) переключатися між виділеними рамками та редагувати їх вміст. При запуску програми ця панель не з’являється і її потрібно спеціально викликати із меню «Графика» (Graphics) — погодьтесь, це досить неочікуване місце для цієї команди. Програма підтримує тільки один рівень відкату, у той час як багато інших пакетів підтримують до ста таких рівнів. ...
... обміну даними з ПЭВМ у процесі виконання програми користувача; 11. Вкажіть типи буферних схем, використаних в УУМС-2. Їх призначення та особливості роботи. 12. Дайте визначення адресного простору мікропроцесорної системи та розпишіть його розподіл в УУМС-2. Адресний простір УУМС складається з областей, состав яких показаний у табл.2. Варто звернути увагу, що внутрішні адресні області ...
0 комментариев