3.1.1. Модуль PARAMS.asm

Традиційно, програми MS DOS дозволяють користувачу вводити в командному рядку одне чи більше імен файлів і інші дані. Для нас це цікаве можливістю одразу при визові основної програми DR.exe задавати шлях до директорії та маску файлів, які ми бажаємо вивести на екран [7].

Наприклад:

c > DR c:\windows\*.sys

Тобто даний ввід має викликати програму DR.exe, яка виведе усі файли із розширенням .sys, які знаходяться за адресою c:\windows. Мова асемблера не дає нам вбудованих механізмів реалізації даної можливості, тому виникає необхідність розробки власного програмного модуля для роботи із командним рядком.

При завантаженні exe-файлу command.com створює в пам'яті PSP блок (256 байт), у якому, серед іншої інформації, містить текст, який йде після імені програми (хвіст команди). Перед початком виконання програми адреса PSP міститься в регістровій парі ds:es. Хвіст команди починається зі зміщення 80h (до FFh) і займає 128 байт, при чому перший символ знаходиться за зміщенням 81h, а в 80h міститься кількість символів хвоста команди [4, 6].

Ідея модуля PARAMS.asm в тому, що створюється власний 128-ми байтовий буфер, в який (за допомогою функції GetParams) копіюється хвіст команди, а потім виконується обробка отриманих даних за допомогою функції GetOneParam (отримання адреси параметра за номером) і ParamCount (отримання кількості параметрів).

Параметри в хвості команди розділені пробілами, останній символ – символ повернення каретки.

На основі сказаного було розроблено наступний програмний модуль:

IDEAL

MODEL small

TailLen EQU 0080h ; зміщення байта із довжиною рядка

; параметрів

CommandTail EQU 0081h ; зміщення першого символу рядка

; параметрів

DATASEG

numParams DW ? ; кількість параметрів

params DB 128 DUP (?) ; буфер на 128 байт для хвоста команди

CODESEG

PUBLIC ParamCount, GetParams, GetOneParam

; -------------------------------------------------------------------------------------------

; Separators внутрішня процедура для перевірки на пробіли, табуляцію,

; повернення каретки

; ------------------------------------------------------------------------------------------

; Вхід ds:si адреса символу, що перевіряється

; Вихід ZF=1 символ є пробілом, табуляцією чи поверненням каретки

ZF=1 символ не є роздільником

; Регістри не змінюються

; -------------------------------------------------------------------------------------------

PROC Separators

push ax ; збереження у стеку ax

mov al, [si] ; в al поміщується символ із ds:si

cmp al, 020h ; порівняння al із пробілом

je @@10 ; якщо так, то перехід

cmp al, 009h ; порівняння al із табуляцією

je @@10 ; якщо так, то перехід

cmp al, 00Dh ; порівняння al із символом повернення

; каретки

@@10:

pop ax ; відновлення ax

ret ; повернення до викликаючої програми

ENDP Separators

; -------------------------------------------------------------------------------------------

; ParamCount повертає кількість параметрів у хвості команди

; -------------------------------------------------------------------------------------------

; Вхід не має

; Вихід CX кількість параметрів командного рядка

; Регістри CX

; -------------------------------------------------------------------------------------------

PROC ParamCount

mov cx, [numParams] ; отримати значення змінної numParams

ret ; повернення до викликаючої програми

ENDP ParamCount

; -------------------------------------------------------------------------------------------

; GetParams занесення параметрів командного рядка DOS у буфер

; -------------------------------------------------------------------------------------------

; Вхід ds префікс сегмента програми (PSP) (адресує PSP, якщо його

; не змінювали)

; es сегмент даних програми

; Вихід [params] початок буфера заповненого даними

; [numParams] кількість параметрів

; ds сегмент даних програми

; Регістри al, bx, dx, si, di, ds

; -------------------------------------------------------------------------------------------

PROC GetParams

;------Ініціалізація cx і індексних регістрів si і di

push ax ; збереження регістрів

push bx

push dx

push si

push di

xor ch, ch ; обнуління верхньої половини cx

mov cl, [ds:TailLen] ; в cx довжина параметрів

inc cx ; включити символ повернення каретки

mov si, CommandTail ; адреса параметрів поміщується в si

mov di, offset params ; адреса призначення поміщується в di

; ------Пропуск початкових пробілів і табуляції

@@10:

call Separators ; пропуск пробілів і табуляції

jne @@20 ; перехід, якщо пробілів і табуляції не має

inc si ; пропуск символу

loop @@10 ; цикл, доки не скінчиться обробка, або cx=0

; ------Копіювання параметрів рядка в буфер params

@@20:

push cx ; збереження cx у стеку

jcxz @@30 ; пропуск копіювання, якщо cx=0

cld ; збільшення на 1 si і di

rep movsb ; копіювання cx байтів із ds:si в es:di

; ------Перетворення пробілів в 0 і встановлення numParams

@@30:

push es

pop ds ; ds = es

pop cx ; відновлення cx (довжину)

xor bx, bx ; обнуління bx, лічильник параметрів

jcxz @@60 ; пропуск циклу якщо cx=0 (довжина)

mov si, offset params ; поміщення адреси параметрів в si

@@40:

call Separators ; перевірка на пробіли, табуляцію,

; повернення каретки

jne @@50 ; перехід, якщо не знайдено роздільник

mov [byte ptr si], 0 ; заміна роздільника на 0

inc bx ; збільшення лічильника кількості

; параметрів

@@50:

inc si ; переміщення указника на наступний

; символ

loop @@40 ; виконувати в циклі, доки cx ≠ 0

@@60:

mov [numParams], bx ; збереження в numParams кількість

; параметрів

pop ax ; відновлення регістрів

pop bx

pop dx

pop si

pop di

ret ; повернення до батьківської програми

ENDP GetParams

; -------------------------------------------------------------------------------------------

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

; -------------------------------------------------------------------------------------------

; Вхід cx номер параметра (має бути менше значення в numParams)

; Вихід di зміщення ASCII рядка із потрібним параметром

; Регістри di

; -------------------------------------------------------------------------------------------

PROC GetOneParam

push ax ; збереження регістрів ax і cx

push cx

xor al, al ; обнуління al (ініціалізація шуканого

; значення 0)

mov di, offset params ; адреса параметрів рядка

jcxz @@99 ; якщо номер параметра (cx) дорівнює 0,

; то вихід

cmp cx, [numParams] ; порівняння cx із кількістю параметрів

jae @@99 ; вихід, якщо передано неіснуючого

; параметру

cld ; автоматичне збільшення di

@@10:

scasb ; пошук нульового обмежувача

jnz @@10 ; повтор, доки не знайдено 0

loop @@10 ; повтор, доки в cx не буде 0

@@99:

pop cx ; відновлення регістрів cx, ax

pop ax

ret ; повернення до викликаючої програми

ENDP GetOneParam

END

Таким чином, програмний модуль PARAMS.asm є зручним інструментом для реалізації роботи із командним рядком і буде використаний в основній програмі.


Информация о работе «Вивід вмісту каталогу 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 комментариев


Наверх