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 (продовження)


Информация о работе «Вивід вмісту каталогу y середовищі MS DOS»
Раздел: Информатика, программирование
Количество знаков с пробелами: 56313
Количество таблиц: 3
Количество изображений: 3

Похожие работы

Скачать
213419
24
23

... ·  пошуковий механізм, який користувачі використовують як інтерфейс для взаємодії з базою даних. Засоби пошуку типу агентів, павуків, кроулерів і роботів використовуються для збору інформації про документи, які знаходяться в мережі Інтернет. Це спеціальні програми, які займаються пошуком сторінок в мережі, збирають гіпертекстові посилання з цих сторінок і автоматично індексують інформацію, яку ...

Скачать
206879
0
16

... . Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив ...

Скачать
139853
0
2

... ів» (Tools Palette), яка дозволяє (як у PageMaker) переключатися між виділеними рамками та редагувати їх вміст. При запуску програми ця панель не з’являється і її потрібно спеціально викликати із меню «Графика» (Graphics) — погодьтесь, це досить неочікуване місце для цієї команди. Програма підтримує тільки один рівень відкату, у той час як багато інших пакетів підтримують до ста таких рівнів. ...

Скачать
148745
30
12

... обміну даними з ПЭВМ у процесі виконання програми користувача; 11.      Вкажіть типи буферних схем, використаних в УУМС-2. Їх призначення та особливості роботи. 12.      Дайте визначення адресного простору мікропроцесорної системи та розпишіть його розподіл в УУМС-2. Адресний простір УУМС складається з областей, состав яких показаний у табл.2. Варто звернути увагу, що внутрішні адресні області ...

0 комментариев


Наверх