Рефераты. Вивід вмісту каталогу y середовищі MS DOS

2.2.2. Інші функції переривання INT 21h, що необхідні для використання у програмі, що розробляється

2h функція INT 21h [6]

Вхід: AH 02h

DL код символу, що виводиться на вивід

Вихід: символ на екрані

В AH поміщується код функції, в DL код символу, що необхідно вивести на екран.

Слід відмітити, що при наявності в DL коду 8 (ASCII код Backspace) функція переміщує курсор вліво на одну позицію.

Для виконання переходу на новий рядок слід послідовно вивести символи із кодами 13 і 10 на екран [5].

Приклад:

mov ah, 2 ; номер функції

mov dl, 13 ; вертикальна табуляція

int 21h

mov dl, 10 ; зсув каретки

int 21h

Даний фрагмент коду переводить курсор на новий рядок.

40h функція INT 21h [6]

Вхід: AH 40h

BX описувач файлу

DS:DX адреса буфера, що містить дані, що записуються

CX число байт, що записуються

Вихід: AX код помилки, якщо CF=1

AL число реально зчитаних байт

Дана функція записує CX байт даних в файл, або пристрій, заданий описувачем в BX. В AH поміщується номер функції, BX містить описувач [6]:

0 Стандартний пристрій вводу (звичайна клавіатура)

1 Стандартний пристрій виводу (звичайний екран)

2 Стандартний пристрій помилок (CON-екран)

3 Стандартний пристрій AUX (COM 1)

4 Стандартний принтер (LPT1)

Регістрова пара DS:DX адресується на буфер. В CX міститься кількість записуваних байт.

Функція повертає в AX код помилки при умові, що CF встановився в 1, або кількість реально зчитаних байтів в AL.

Для нас дана функція цікава як інструмент для виводу даних на екран, тому в BX має бути занесено 1.

Приклад:

mov ah, 40h ; код функції

mov bx, 1 ; вивід на екран

mov dx, offset sstring ; в dx зміщення рядка виводу

mov cx, FFh ; в cx кількість символів, що виводяться

int 21h

Даний фрагмент коду виводить на екран рядок символів, що містяться в змінній sstring.

4Ch функція INT 21h [6]

Вхід: AH 4Ch

AL код виходу

Вихід: не має

Функція завершення програми (EXIT). Повертає управління від породженого процесу його батьківському процесу. Встановлює код виходу (його можна опитати функцією WAIT (4Dh)).

В AХ міститься номер функції, в AL - код виходу:

0 нормальне завершення

1 завершення через Ctrl-Break (INT 23h)

2 завершення по критичній помилці пристрою (INT 24h)

3 завершення через функцію KEEP (31h)

Приклад:

mov ax, 04ch ; в al - код виходу

int 21h ; в ah - номер функції

Даний фрагмент коду задає нормальне завершення роботи програми (повертається код виходу - 0).

3. Розробка задачі на мові асемблер

3.1. Допоміжні процедури

Очевидно, що основна програма потребує допоміжні процедури для отримання необхідних параметрів, які задає користувач в командному рядку при визові програми. Серед них: процедури вводу/виводу даних на консоль, обробки ASCII рядків, а також перетворення числових даних у ASCII формат для подальшого їх виведення на екран. Для цього були розроблені спеціальні модулі PARAMS.asm, STRIO.asm та BINASC.asm, які містять необхідні процедури. Розглянемо їх окремо.

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

Страницы: 1, 2, 3, 4, 5, 6, 7



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.