←предыдущая следующая→
1 2 3 4 5 6 7
Язык ассемблер для IBM PC и программирования, Высшая шко-
ла, 1992г
Приложение
;----------------------------------------
; Курсовой проект по дисциплине
; "Системное программное обеспечение"
; студента гр.410703 Федосенко Д.В.
; (c)1997 БГУИР
;----------------------------------------
.MODEL TINY
.CODE
ORG 100h
begin: jmp start
HelpStr db 13,10,'KP v1.0, Copyright (c) 1997, БГУИР, Федосенко Д.В.'
db 13,10,13,10,'При запуске без параметров выводит подказку'
db 13,10,'Запуск с параметром должен иметь вид: kp диск:
\каталог\маска [/D] [/M]'
db 13,10,'Где маска (при использовании /D) - любые символы и
имена, включая * и ?'
db 13,10,' (при использовании /M) - название
подкаталога.'
db 13,10,'/D - вывод директория по маске
/M - создание подкаталога по маске'
db 13,10,'Например:kp C:\LANG\BP\*.* /D - вывод всех файлов
и каталогов из C:\LANG\BP'
db 13,10,' kp C:\* /D - вывод только каталогов из
корневого каталога диска C:'
db 13,10,' kp C:\UTIL /M - создание подкаталога UTIL
в корневом каталоге диска С:'
db 13,10,' kp /D - вывод всех файлов и каталогов по
текущему пути'
db 13,10,'Если ВЫ используете /M, то указывать название
подкаталога обязательно!',13,10,'$'
stringT db 'К байт всего на данном диске',13,10,'$'
stringF db 'К байт свободно на диске',13,10,'$'
stringU db 13,10,'Вывод содержимого каталога $'
err_m1 db 13,10,'Ошибка номера функции! $'
err_m2 db 13,10,'Файл не найден! $'
err_m3 db 13,10,'Путь доступа не найден! $'
err_m4 db 13,10,'Открыто слишком много файлов! $'
ok_make db 13,10,'Подкаталог создан! $'
no_make db 13,10,'Подкаталог не создан, т.к. вы не указали его имя!'
db 13,10,'Для вывода подсказке запустите программу без
параметров.',10,13,'$'
str_f db 13,10,'Вы не указали ключ! $'
str_k db 13,10,'Вы указали неверный ключ! $'
totalKB dd 0 ; Ячейка для хранения объема диска
freeKB dd 0 ; Ячейка для хранения размера свободного места
space db ' $' ; Строка разделения
temp dw 0 ; Рабочая переменная
path db 65 dup (0) ; Текущий каталог (пока не определен - пустой)
NewDTA db 21 dup (0) ; Описываем структуру DTA
AttrF db 0 ; Атрибут файла
TimeF dw 0 ; Время создания файла
DateF dw 0 ; Дата создания файла
SizeF dd 0 ; Размер файла
NameF db 13 dup (0) ; Имя файла вместе с расширением
start:
push cs ; Заносим во все регистры сегмент кода
pop ds ;
push cs ;
pop es ;
;Проверяем строку параметров
mov cl,ds:[80h] ; Число символов параметров
cmp cl,0 ; Не равно-ли число параметров нулю ?
je help ; Если параметров нет, переходим
cmp cl,1 ; Если один параметр, например файл запущен
je help ; по Ctrl-Enter в NC, то тоже выходим
mov al,ds:[82h] ; Проверяем на ввод без маски
cmp al,'/' ; Наклонная черта ?
jne not_help ; Нет - выходим
mov al,ds:[83h] ; Да - смотрим дальше
cmp al,'M' ; Если введено /M
je not_m
cmp al,'D' ; Если введно /D
je noparam
jmp not_help
help:
mov ah,9 ; Вывод подсказки
lea dx,HelpStr
int 21h
ret ; Выход в DOS
not_m:
mov ah,9 ; Подкаталог не созданб т.к. вы не
lea dx,no_make ; указали имя
int 21h
ret ; Выход в DOS
not_help: ; Если маска введена
mov ch,0
mov di,81h ; Адрес первого символа параметра
mov al,' ' ; Сканировать будем до первого пробела
CheckParam:
repe scasb ; Запускаем сканирование строки
jne IsParam
IsParam: ; Если пробел найден
mov si,di ; Запоминаем адрес
dec si ; Уменьшаем на единицу
lea di,path ; Устанавливаем адрес строки параметров
inc cl
MoveParam:
lodsb ; Загружаем один символ строки параметров
cmp al,' ' ; Проверяем, не равен ли он пробелу
je EndMoveParam ; Если равен, значит конец строки
stosb ; Иначе пересылаем в строку параметров - path
loop MoveParam ; Цикл до конца строки
EndMoveParam:
push ax ;сохраним на всякий случай
lodsb ;загружаем еще один символ
cmp al,'/' ;если это /
je okk
mov ah,9 ;иначе вываливаемся с error
lea dx,str_F
int 21h
int 20h
okk: lodsb ;загружаем еще один символ
cmp al,'D' ;если это /D
je Dire ;то запуск DirE
cmp al,'M' ;если это /M
je MakeE ;то запускаем MakeE
mov ah,9 ;иначе вываливаемся с error
lea dx,str_K
int 21h
int 20h
DirE: pop ax
mov al,0 ; Добавляем символ NUL к строке параметров
mov [di],al
mov ah,9 ; Функция вывода строки
lea dx,stringU ; В DX - адрес строки
int 21h ; Выводим строку "Текущий каталог"
mov ah,40h ; Выводим маску поиска
mov bx,01
mov cx,50
lea dx,path
int 21h
call crlf ; Перевод строки, возврат каретки
jmp skip_curdir ; Обходим определение текущего каталога
NoParam: ; Если не заданы параметры
call curdir ; Определяем текущий каталог
skip_curdir:
lea dx,NewDTA ; Устанавливаем указатель на свою область DTA
mov ah,1Ah
int 21h
call WLabel ; Выводим метку диска
mov ah,4eh ; Функция находит первый каталог с маской *.*
mov cx,10h ; В CX - атрибут каталога - 10h
lea dx,path ; В DX - путь для поиска (был определен выше)
int 21h
jc NowFiles ; Если ни одного
←предыдущая следующая→
1 2 3 4 5 6 7
|
|