А
Б В
Г Д
Е Ж
З И
К Л
М Н
О П
Р С
Т У
Ф Х
Ц Ч
Ш Э
Ю Я
Реферат: Разработка контроллера на однокристальном микропроцессоре
Разработка контроллера на однокристальном микропроцессоре
Министерство образования и науки Республики Беларусь Белорусский Государственный Университет Информатики и Радиоэлектроники ______________________________________________________________________ Факультет Компьютерного Проектирования Пояснительная записка к курсовому проекту по теме "Разработка коммандного процессора" Выполнил студент гр.410703 Федосенко Д.В. Руководитель работы Ширинский В.П. Минск 1996 каталога, флаг CF устанавливает- ся в 0. При неуспешной операции флаг CF устанавливается в 1, а в ре- гистр AX помещается код ошибки, зависящий от операции (таблица 1.1), в нашем случае, если не найден указанный диск или путь, то в AX возвра- щается код ошибки 03. В имени создаваемого подкаталога не могут быть использованы следующие символы: " : ; / \ | ? * + = [ ] . , Таблица 1.1 ЪДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї і N і Описание ошибки і ГДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і 01 і Ошибка номера функции і і 02 і Файл не найден і і 03 і Путь доступа не найден і і 04 і Открыто слишком много файлов і і 05 і Доступ не разрешен і і 06 і Ошибка файлового номера і і 07 і Блок управления памятью разрушен і і 08 і Hедостаточно памяти і і 09 і Ошибка адреса блока памяти і і 10 і Ошибка оборудования і і 11 і Ошибка формата і і 12 і Ошибка кода доступа і і 13 і Ошибка данных і і 15 і Ошибка дисковода і і 16 і Попытка удалить оглавление і і 17 і Hе то устройтво і і 18 і Hет больше файлов і АДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ Для организации работы, нам понадобится знание структуры записи файла каталогов, которая приведена в таблице 1.2. Таблица 1.2 ЪДДДВДДДДДДДДДДВДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДї і N і Смещение і Длина і Значение поля і і і (байт) і (байт)і і ГДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і1 і 0 і 8 і Имя файла і ГДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і2 і 8 і 3 і Расширение имени файла і ГДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і3 і 11 і 1 і Байт атрибутов файлов і ГДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і4 і 12 і 10 і Зарезервировано для DOS і ГДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і5 і 22 і 2 і Время і ГДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і6 і 24 і 2 і Дата і ГДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і7 і 26 і 2 і Стартовый номер кластера і ГДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і8 і 28 і 4 і Размер файла і АДДДБДДДДДДДДДДБДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ Вторая функция курсового проекта (команда DIR), будет реализова- на с помощью 21-го прерывания. Функции 21-го прерывания, которые мы будем использовать, рассмотрены в 4 главе. Открыто слишком много файлов! і і ok_make і Подкаталог создан! і і no_make і Подкаталог не создан, т.к. вы не указали его имя! і і і Для вывода подсказке запустите программу без параметров. і і str_f і Вы не указали ключ! і і str_k і Вы указали неверный ключ! і і totalKB і Ячейка для хранения объема диска і і freeKB і Ячейка для хранения размера свободного места і і temp і Рабочая переменная і і path і Текущий каталог (пока не определен - пустой) і і NewDTA і Описываем структуру DTA і і AttrF і Атрибут файла і і TimeF і Время создания файла і і DateF і Дата создания файла і і SizeF і Размер файла і і NameF і Имя файла вместе с расширением і АДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ Процедуры, входящие в курсовой проект: ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї і Процедура высчитывает и выводит время создания файла/каталога і і WrtTime і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Процедура высчитывает и выводит дату создания файла/каталога і і WrtDate і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Забивает пробелами поле, в которое записывается имя файла (NameF) і і Это необходимо для того, чтобы не было наложений имен файлов при выводе і і ClrName і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Выводит имя каталога на экран і і WrtDir і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Выводит имя файла на экран і і WrtFile і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Выводит метку текущего диска і і WLabel і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Производит перевод строки и возврат каретки і і crlf і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Выводит на экран текущий каталог і і curdir і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Получает информацию о диске. Номер диска берет из строки поиска і і После вызова в AX - количество секторов в кластере і і в BX - число свободных кластеров і і в CX - число байтов в секторе і і в DX - число кластеров на диске і і GetInfo і і і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Выводит размер текущего диска в Килобайтах і і totsize і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Выводит размер свободного пространства і і текущего диска в Килобайтах і і fresize і ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Процедура вывода числа в десятичном формате і і Decimal і АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ льзуемые функции этого прерывания следующие: Параметры Описание Входные: AH 02H - Вывод на дисплей DL символ для посылки на стандартное устройство Выходные: нет ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Входные: AH 09H - Вывод строки на дисплей DS:DX Адрес строки, заканчивающаяся знаком '$' (ASCII 24H) Выходные: нет ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Входные: AH 1aH - Установка адреса DTA. DS:DX адресс DTA области Выходные: нет ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Входные: AH 19H - Получить информацию о текущем диске Выходные: AL DOS current default drive number (0=A, 1=B, и т.д.) ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Входные: AH 36H - Получить информацию о свободном месте на диске DL drive number (0=default, 1=A, и т.д.) Выходные: AX ffffH если DL было invalid drive number иначе количество секторов верно BX количество свободных секторов (allocation units) CX байт на сектор (обычно 512) DX общее количество секторов на диске Доп.информация: Выходная информация обычно подсчитывается как общий размер диска и количество свободного места на диске: Если AX = ffffH, то вы не правильно указали диск. Иначе, свободного места в байтах = (AX * CX * BX) общий размер в байтах = (AX * CX * DX) Если сектора по 512 байт, более просто подсчитывать КБ: свободного места в КБ = (AX * BX) / 2 общий размер в КБ = (AX * DX) / 2 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Входные: AH 3fH - Создать подкаталог Функция описывалась нами ранее. ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Входные: AH 47H - Информация о текущем директории DL drive number (0=default, 1=A, etc.) DS:SI address of a local buffer to hold a pathname (64 bytes) Выходные: AX передается ошибка (Таблица 1.1) ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Входные: AH 4fH - Hайти следующий совпадающий файл DS:DX адресс данных с предыдущего 4eH поиска файла ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Входные: AH 4eH - Hвайти первый совпадающий файл DS:DX строка пути к файлу ASCIIZ CX атрибут файлы для поиска ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Кроме 21h прерывания мы использовали функцию 0eH прерывания INT 10H: Данная функция обеспечивает вывод символа на монитор в режиме те- летайпа. Для выполнения этой функции в AL помещают выводимый символ, в BL цвет текста и номер строницы в BH. Hапример, символы: CR (0dH), LF (0aH), звуковой сигнал (07H) и т.д. Данная функция автоматически кур- сор, переводит символы на следующую строку, выполняет прокрутку экра- на и сохраняет текущие атрибуты экрана. Также мы использовали прерывание INT 20H для выхода в DOS. Оно не имеет параметров. Полный текст программы приведен в Приложении. :40 rcdsim.com 6604 13/09/95 03:00:00 loadcd.exe 0352 13/09/95 03:00:00 rcdpc.sys 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 ; Если ни одного каталога нет, ищем файлы call WrtDir ; Выводим имя первого найденного каталога FindNextDir: mov ah,4fh ; Функция продолжает поиск, начатый ф-цией 4eh int 21h jc NowFiles ; Если больше каталогов нет, ищем файлы call WrtDir ; Выводим найденный каталог jmp FindNextDir ; Переходим на поиск следующего NowFiles: mov ah,4eh ; Функция находит первый файл с маской *.* mov cx,27h ; В CX - атрибут файла - 27h (RO+Hid+Sys+Arc) lea dx,path ; В DX - путь для поиска файлов int 21h jc halt ; Если файлов нет, то на выход call WrtFile ; Если файл найден, выводим его имя FindNextFile: mov ah,4fh ; Функция продолжает поиск файлов int 21h jc halt ; Если больше файлов нет, то на выход call WrtFile ; Выводим имя файла на экран jmp FindNextFile ; Переход на поиск следующего файла halt: call crlf ; Перевод строки, возврат каретки call totsize ; Вывод объема диска call fresize ; Вывод оставшегося места ret ; Выход в DOS ;------------- создание подкаталога --------------------------------- MakeE: pop ax ; восстанавливаемng 1яЕ ax mov al,0 ; Добавляем символ NUL к строке параметров mov [di],al mov ah,40h ; Выводим маску поиска mov bx,01 mov cx,50 lea dx,path int 21h mov ah,39h ; функция создания подкаталога lea dx,path int 21h ; выполнить cmp ax,01h ; проверка на ошибку #1 je p_err1 cmp ax,02h ; проверка на ошибку #2 je p_err2 cmp ax,03h ; проверка на ошибку #3 je p_err3 cmp ax,04h ; проверка на ошибку #4 je p_err4 mov ah,9h ; Ошибки нет! lea dx,ok_make ; Вывод строки - Подкаталог создан int 21h int 20h ; Выход в DOS ;-------- Обработка ошибок -------------------------------- p_err1: mov ah,9h lea dx,err_m1 int 21h int 20h p_err2: mov ah,9h lea dx,err_m2 int 21h int 20h p_err3: mov ah,9h lea dx,err_m3 int 21h int 20h p_err4: mov ah,9h lea dx,err_m4 int 21h int 20h ; Выход в DOS ;------------------------------------------------------------------------ ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;:: Процедура высчитывает и выводит время создания файла/каталога ::: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: WrtTime proc near mov ah,9 lea dx,space int 21h mov ax,TimeF shr ax,11 call DecWrt mov ax,0e3ah int 10h mov ax,TimeF shl ax,5 shr ax,10 call DecWrt mov ax,0e3ah int 10h mov ax,TimeF shl ax,11 shr ax,10 call DecWrt ret WrtTime endp ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::: Процедура высчитывает и выводит дату создания файла/каталога ::: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: WrtDate proc near mov ah,9 lea dx,space int 21h mov ax,DateF shl ax,11 shr ax,11 call DecWrt mov ax,0e2fh int 10h mov ax,DateF shl ax,7 shr ax,12 call DecWrt mov ax,0e2fh int 10h mov ax,DateF shr ax,9 add ax,80 call DecWrt ret WrtDate endp ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Забивает пробелами поле, в которое записывается имя файла (NameF) :: ; Это необходимо для того, чтобы не было наложений имен файлов при выводе :: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ClrName proc near lea si,NameF ; Получаем адрес имени файла mov cx,1 rp: cmp cx,13 ; Если CX=13, то имя обработано полностью je vihod ; поэтому выходим mov al,0 ; Заносим код символа 0 (пустой символ) mov [si],al ; Записываем пустой символ в строку NameF inc si ; Увеличиваем адрес строки inc cx ; Увеличиваем счетчик записаных символов jmp rp ; Повторяем цикл vihod: ret ClrName endp ;:::::::::::::::::::::::::::::::::::::: ;::: Выводит имя каталога на экран :::: ;:::::::::::::::::::::::::::::::::::::: WrtDir proc near cmp AttrF,10h ; Проверяем атрибут: если 10h, то каталог jne exit1 ; Иначе на выход mov ah,40h ; Функция вывода строки mov bx,01 mov cx,12 ; Выводим 13 символов lea dx,NameF ; В DX - адрес строки вывода int 21h mov ah,9 lea dx,dirstr int 21h call WrtDate call WrtTime call crlf ; Перевод строки, возврат каретки exit1: call ClrName ; Чистим поле вывода ret dirstr db '$' WrtDir endp ;::::::::::::::::::::::::::::::::::::::: ;::: Выводит имя файла на экран :::::::: ;::::::::::::::::::::::::::::::::::::::: WrtFile proc near cmp AttrF,10h ; Проверяем атрибут: если не файл, то выходим je exit2 lea si,NameF ; Загружанм адрес строки в SI mov cx,1 loop1: cmp cx,13 ; Проверяем, если CX=13, то вывод закончен je exit2 ; выходим mong 1яЕ v al,[si] ; Заносим в AL выводимый символ cmp al,65 ; Сравниваем его с 'A' jl skip1 ; Если меньше, то не переводим в нижний регистр cmp al,90 ; Сравниваем AL с 'Z' jg skip1 ; Если больше, то не переводим в нижний регистр add al,32 ; Переводим символ в нижний регистр skip1: mov dl,al mov ah,02 ; Функция вывода символа на экран int 21h inc si ; Увеличиваем адрес inc cx ; Увеличиваем сченчик jmp loop1 ; Переход на следующий символ exit2: call ClrName ; Чистим поле вывода mov ax,word ptr SizeF mov dx,word ptr SizeF+2 call Decimal call WrtDate call WrtTime call crlf ret WrtFile endp ;::::::::::::::::::::::::::::::::::::::: ;::: Выводит метку текущего диска :::::: ;::::::::::::::::::::::::::::::::::::::: WLabel proc near call ClrName ; Чистим поле вывода mov ah,9 ; Функция вывода строки на экран lea dx,StringL ; В DX - адрес строки int 21h lea si,path4 mov ah,19h ; Получаем текущий диск int 21h add al,41h ; Переводим его в букву mov [si],al ; Заносим во временную строку lea si,path ; Путь поиска lea di,path4 ; Временная строка mov al,[si] ; Берем первый символ пути поиска cmp al,65 ; Буква диска 'A'? jl not_xchg ; Если меньше, выходим cmp al,122 ; Буква диска 'z'? jg not_xchg ; Если больше, выходим cmp al,91 ; Если '[' - выход je not_xchg cmp al,92 ; Если '\' - выход je not_xchg cmp al,93 ; Если ']' - выход je not_xchg cmp al,94 ; Если '^' - выход je not_xchg cmp al,95 ; Если '_' - выход je not_xchg cmp al,96 ; Если '`' - выход je not_xchg mov [di],al not_xchg: mov ah,4eh ; Ищем файл mov cx,08h ; с атрибутом 08h, т.е. метку тома lea dx,path4 ; В DX - путь для поиска int 21h mov ah,40h ; Функция вывода строки на экран mov bx,01 mov cx,13 ; Выводим 13 символов lea dx,NameF ; В DX - адрес строки int 21h call crlf ; Перевод строки, возврат каретки call crlf ; Перевод строки, возврат каретки call ClrName ; Чистим поле вывода ret StringL db 'Метка диска $' path4 db 'c:\*.*',0 ; Первый символ будет заменен на текущий диск WLabel endp ;:::::::::::::::::::::::::::::::::::::::::::::::::::::: ;:::: Производит перевод строки и возврат каретки ::::: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::: crlf proc near mov ax,0e0dh ; Функция вывода символа int 10h ; Выводим символ 13 на экран mov ax,0e0ah ; Функция вывода символа int 10h ; Выводим символ 10 на экран ret crlf endp ;:::::::::::::::::::::::::::::::::::::::::: ;::: Выводит на экран текущий каталог ::::: ;:::::::::::::::::::::::::::::::::::::::::: curdir proc near mov ah,9 ; Функция вывода строки lea dx,stringC ; В DX - адрес строки int 21h ; Выводим строку "Текущий каталог" lea si,path mov ah,19h ; Получаем текущий диск int 21h add al,41h ; Переводим его в букву mov [si],al inc si mov al,58 ; Добавляем символ ':' mov [si],al inc si mov al,92 ; Добавляем символ '\' mov [si],al mov ah,47h ; Функция получения текущего каталога mov dl,00 lea si,path+3 ; Добавляем к диску каталог int 21h lea si,path ; Производим посимвольный вывод полного пути a10loop: cmp byte ptr [si],0 je a20exit mov al,[si] mov dl,al mov ah,02 int 21h inc si jmp a10loop a20exit: ; Добавляем к текущему пути маску *.* для поиска каталогов и файлов dec si ; Уменьшаем адрес на 1 и получаем последний mov al,[si] ; символ, а не NUL ng 1яЕ inc si ; Возвращаем назад SI cmp al,92 ; Проверяем, если посл. символ - слэш, то выход je skip_slash mov al,92 ; Иначе добавляем символ '\' mov [si],al inc si skip_slash: mov al,42 ; Добавляем символ '*' mov [si],al inc si mov al,46 ; Добавляем символ '.' mov [si],al inc si mov al,42 ; Добавляем символ '*' mov [si],al inc si mov al,0 ; Добавляем символ NUL mov [si],al call crlf ret stringC db 13,10,'Текущий каталог $' curdir endp Div1024 proc near mov cx,10 dd20: shr ax,1 shr dx,1 jnc dd30 or ah,10000000b dd30: loop dd20 ret Div1024 endp ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;:: Получает информацию о диске. Номер диска берет из строки поиска ::: ;:: После вызова в AX - количество секторов в кластере ::: ;:: в BX - число свободных кластеров ::: ;:: в CX - число байтов в секторе ::: ;:: в DX - число кластеров на диске ::: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: GetInfo proc near mov dl,0 ; В DL заносим 0, т.е. текущий диск lea si,path ; Получаем букву диска из пути поиска mov al,[si] sub al,40h ; Переводим ее в цифру cmp al,0 ; Номер диска 0 ? jl not_1 ; Если меньше, выходим cmp al,26 ; Номер диска 26 ? jg again ; Если больше, то идем на проверку строчных букв jmp mov_val ; Переход на обработку again: sub al,32 ; Если буква диска строчная, уменьшаем еще раз cmp al,0 ; Номер диска 0 ? jl not_1 ; Если меньше, выходим cmp al,26 ; Номер диска 26 ? jg not_1 ; Если больше, выходим mov_val: mov dl,al ; Заносим номер диска not_1: mov ah,36h ; Функция получения информации о диске int 21h ret GetInfo endp ;:::::::::::::::::::::::::::::::::::::::::::::::::: ;:: Выводит размер текущего диска в Килобайтах :::: ;:::::::::::::::::::::::::::::::::::::::::::::::::: totsize proc near call GetInfo mov temp,dx ; Запоминаем число кластеров mul cx ; Умножаем число секторов на размер сектора mul temp ; Умножаем все на количество кластеров call Div1024 ; Делим на 1024 и получаем размер в Кбайтах mov word ptr totalKB,ax ; Запоминаем младшее и старшее слово mov word ptr totalKB+2,dx ; полученного результата call Decimal mov ah,9 lea dx,stringT int 21h ret totsize endp ;::::::::::::::::::::::::::::::::::::::::::::::: ;::: Выводит размер свободного пространства :::: ;::: текущего диска в Килобайтах :::: ;::::::::::::::::::::::::::::::::::::::::::::::: fresize proc near call GetInfo mul cx mul bx call Div1024 mov word ptr freeKB,ax mov word ptr freeKB+2,dx call Decimal mov ah,9 lea dx,stringF int 21h ret fresize endp DecWrt proc near lea si,outst ; очищаем строку mov cl,0 mov [si],cl mov [si+1],cl lea si,outst mov cl,48 mov [si],cl mov cx,0010 lea si,outst+1 a20: cmp ax,0010 jb a30 xor dx,dx div cx or dl,30h mov [si],dl dec si jmp a20 a30: or al,30h mov [si],al mov ah,40h ; выводим строку mov bx,01 mov cx,02 lea dx,outst int 21h ret outst db ' ' DecWrt endp ;::::::::::::::::::::::::::::::::::::::::::::::::::: ;:: Процедура вывода числа в десятичном формате :::: ;::::::::::::::::::::::::::::::::::::::::::::::::::: Decimal proc C uses es di bx cx dx ds mov bx,10 push cs pop es push ax ; Заполняем массив DecString байтами 00 xor ax,ax ; cld ; mov cx,3 ; lea di,DecStr ; rep stosw ; pop ax ; lea ng 1яЕ di,DecStr+5 ; DI адресует последний байт массива std div bx push ax mov ax,dx or al,30h ; Преобразуем в ASCII-символ. stosb pop ax c10: xor cx,cx c20: cmp ax,bx ; Делимое в AX, делитель в BX. jb c30 ; Частное накапливается в CX. sub ax,bx ; Деление методом вычитания inc cx ; (страхует от переполнения) jmp c20 c30: or al,30h ; Переводим в ASCII stosb ; Заносим в DecString mov ax,cx cmp ax,bx jae c10 or al,0 jz c50 or al,30h stosb c50: mov ah,9 lea dx,space int 21h mov ah,9 lea dx,DecStr int 21h ret DecStr db 6 dup (0) db '$' Decimal endp end begin
|