mov bx, offset Action ; поміщення в bx адреси процедури Action
call DirEngine ; виклик процедури DirEngine розгляду
; каталогу
; ------Завершення роботи
Exit:
call NewLine ; перехід на новий рядок
mov ah, 04Ch ; в ah номер функції виходу із програми
mov al, [exCode] ; в al код виходу
int 21h ; виклик DOS, завершення програми
; -------------------------------------------------------------------------------------------
; DirEngine перегляд каталогу
; Вхід cx:bx адреса підпрограми Action
; ds:di адреса ASCII-рядка для пошуку (маска)
; Вихід викликає процедуру Action при кожному знаходженні
; файла, що відповідає масці
Регістри ax, cx, dl, di
PROC DirEngine
; ------Виведення заголовку таблиці
push di ; збереження di у стеку
mov di,offset tabl ; в di зміщення рядка заголовка таблиці
; ASCII
call StrWrite ; вивід на екран заголовка таблиці
call NewLine
pop di ; відновлення di
; ------Отримання поточного DTA
push es ; збереження змінюваних регістрів
push bx
mov ah, 2Fh ; в ah номер функції DOS отримання DTA
int 21h ; отримати поточний DTA
mov [DTAseg], es ; збереження адреси сегмента DTA
mov [DTAofs], bx ; збереження адреси зміщення DTA
pop bx ; відновлення регістрів
pop es
; ------Встановлення нового DTA в глобальному 43-байтовому буфері dirData
mov dx, offset dirData ; адреса змінної dirData поміщується
; в ds:dx
mov ah, 1Ah ; а ah номер функції DOS встановлення
; DTA
int 21h ; встановлення нового DTA
; ------Перевірка каталогу на співпадіння імен файлів із маскою в ds:dx
mov ah, 4Eh ; в ah номер функції DOS першого
; пошуку
mov cx, 10h ; атрибут файлів і директорій
mov dx, di ; поміщення адреси рядка в ds:dx
jmp short @@20 ; пропуск наступної дії
@@10:
mov ah, 4Fh ; в ah номер функції DOS продовження
@@20:
int 21h ; пошук першого/наступного входження
jc @@99 ; вихід при помилці, або закінченні
call bx ; виклик процедури Action
jmp @@10 ; повтор дій
@@99:
; ------Відновлення початкової адреси DTA
push ds ; збереження ds у стеку
mov ds, [DTAseg] ; встановлення старої адреси DTA в ds:dx
mov dx, [DTAofs]
mov ah, 1Ah ; в ah номер функції DOS встановлення
int 21h ; повернення до старої DTA
pop ds ; відновлення ds
ret ; завершення процедури
ENDP DirEngine
; Action виводить дані про файл із буфера dirData
; Вхід dirData DTA файла
; Вихід виводить дані про файл (назву, атрибути, дату/час створення,
; розмір)
; Регістри ax, dl, di, cx
PROC Action
push bx ; збереження регістрів
; ------Вивід імені файлу
mov di, offset dirData + FileName ; в di зміщення початку імені файлу
call StrWrite ; вивід імені на екран
call StrLength ; отримання в cx довжини імені
sub cx, 15 ; виявлення на скільки довжина імені
neg cx ; файлу менше поля із 15 символів
mov dl, ' ' ; в dl символ пробілу
call WriteSimv ; вивести на екран необхідну, для
; доповнення поля із 15 символів,
; кількість разів
; ------Вивід атрибутів файлу
mov al,[offset dirData + FileName -9]; в al поміщується байт атрибуту
mov cx,6 ; в cx кількість значущих бітів у байті
; атрибуту
@@01:
shr al,1 ; зсув al вправо,
; в CF поміщується молодший біт
jb @@02 ; якщо CF=1, то перехід
mov dl, ' ' ; в dl поміщується пробіл (символ виводу)
push cx ; збереження cx в стеку
mov cx,4 ; поміщення в cx кількості символів для
; виводу (4)
call WriteSimv ; вивід 4-х пробілів
pop cx ; відновлення cx
jmp @@03 ; перехід
@@02:
mov di,offset point ; в di поміщується зміщення змінної point
push cx ; збереження cx
call StrWrite ; вивід на екран зірочки
@@03:
loop @@01 ; виконувати цикл, доки cx?0 (6-ть разів)
; ------Вивід години створення файлу
mov bx,[offset dirData + FileName-8] ; в bx поміщується слово часу
; створення файлу
mov ax,bx ; в ax поміщуються слово години
and ax,0f800h ; накладання маски
shr ax,11 ; зсув результату (отримали години)
mov cx,1
mov di,offset buffer ; di вказує на пустий буфер buffer
call BinToAscDec ; передача в змінну buffer 10-кового
; ASCII-представлення числа з ax
mov cx,2 ; в cx ширина поля виводу
call StrWrite2 ; вивід ASCII-представлення числа з ax
mov cx,1 ; встановлення в cx кількості виводів
mov dl, ':' ; передача в dl символу, що виводиться
call WriteSimv ; вивід один раз символу із dl
; ------Вивід хвилин створення файлу
mov ax,bx ; в ax поміщується слово хвилини
and ax,7e0h ; накладання маски
shr ax,5 ; зсув результату (отримали хвилини)
; ------Вивід секунд створення файлу
mov ax,bx ; в ax поміщується слово секунди
and ax,1fh ; накладання маски
shl ax,1 ; помноження на 2 (отримання секунд із
; двохсекундних одиниць)
mov cx,3 ; в cx ширина поля виводу
call StrWrite2 ; вивід ASCII представлення числа з ax
mov dl, ' ' ; передача в dl символу, що виводиться
; ------Виведення дня створення файлу
mov bx,[offset dirData + FileName-6] ; в bx слово дати створення
; файлу
mov ax,bx ; в ax слово дня створення файлу
and ax,01fh ; накладання маски
mov cx,1 ; встановлення мінімальної довжини
; перетворюваного рядка
mov di,offset buffer ; в di зміщення пустого буферу
call BinToAscDec ; заповнення буферу buffer 10-ковим
; ASCII-представленням числа з ax
call StrWrite2 ; вивід ASCII представлення номера дня
mov cx,1 ; в cx кількість виводів
mov dl, '\' ; в dl символ для виводу
call WriteSimv ; вивід символу із dl задану кількість разів
; ------Вивід місяця створення файлу
mov ax,bx ; в ax слово місяця створення файлу
and ax,1e0h ; накладання маски
shr ax,5 ; зсув результату (отримання місяця)
; ------Вивід року створення файлу
Страницы: 1, 2, 3, 4, 5, 6, 7