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 є зручним інструментом для реалізації роботи із командним рядком і буде використаний в основній програмі.
... · пошуковий механізм, який користувачі використовують як інтерфейс для взаємодії з базою даних. Засоби пошуку типу агентів, павуків, кроулерів і роботів використовуються для збору інформації про документи, які знаходяться в мережі Інтернет. Це спеціальні програми, які займаються пошуком сторінок в мережі, збирають гіпертекстові посилання з цих сторінок і автоматично індексують інформацію, яку ...
... . Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив ...
... ів» (Tools Palette), яка дозволяє (як у PageMaker) переключатися між виділеними рамками та редагувати їх вміст. При запуску програми ця панель не з’являється і її потрібно спеціально викликати із меню «Графика» (Graphics) — погодьтесь, це досить неочікуване місце для цієї команди. Програма підтримує тільки один рівень відкату, у той час як багато інших пакетів підтримують до ста таких рівнів. ...
... обміну даними з ПЭВМ у процесі виконання програми користувача; 11. Вкажіть типи буферних схем, використаних в УУМС-2. Їх призначення та особливості роботи. 12. Дайте визначення адресного простору мікропроцесорної системи та розпишіть його розподіл в УУМС-2. Адресний простір УУМС складається з областей, состав яких показаний у табл.2. Варто звернути увагу, що внутрішні адресні області ...
0 комментариев