Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;1 зарезервированный сектор
- ;Размер кластера 1 сектор
- ;Размер сектора 512 байт
- .386
- dseg segment use16
- disk db ?
- filenum dw ?
- sectnum dw ?
- outbuf db 6 dup(' '), '$'
- foldSize dw ? ;(в записях по 32 байта) 224 обычно для ROOT
- sectbuf db 512*32 dup (0FFh) ;Буфер для считывания содержимого директорий
- msg0 db 'Enter disk name: $'
- msg1 db 0dh, 0ah, 'ERROR. Wrong file path.', 0dh, 0ah, '$'
- msg2 db 0dh, 0ah, 'ERROR. Cannot read sector.', 0dh, 0ah, '$'
- msg3 db 0dh, 0ah, '<!--Program ended successfully-->', 0dh, 0ah, '$'
- msg4 db 0dh, 0ah, 'Sectors in ROOT: $'
- msg5 db 0dh, 0ah, 'Entries in ROOT: $'
- ;Константы для умножения/деления
- by2w dw 2
- by16 db 16
- dseg ends
- cseg segment use16
- assume ds:dseg, cs:cseg
- m0: mov ax, dseg
- mov ds, ax
- restart:
- mov ah, 9
- lea dx, msg0 ;MSG::Enter path.
- int 21h
- mov ah, 1h ;INPUT::path.
- int 21h
- call ParsePath
- cmp al, 1
- jne short er
- ;Чтение BOOT сектора
- lea bx, sectbuf
- mov cx, 1
- mov dx, 0
- call readSectors
- cmp al, 1
- jne short et
- ;Чтение FAT таблицы и каталога ROOT
- call read_ROOT
- cmp al, 1
- jne short et
- call searchInFolder
- mov ax, filenum
- div by16 ; AX * 32 / 512
- ;Если остаток больше 0, увеличиваем результат на 1
- cmp ah, 0
- je m1
- inc al
- mov ah, 0 ;ah=0, т.к. dcm работает с ax
- ;--------------
- m1: call dcm
- mov ah, 9
- lea dx, msg4
- int 21h
- mov dx, di ;di указывает на начало строки (пропускаем пробелы)
- int 21h
- mov ax, filenum
- call dcm
- mov ah, 9
- lea dx, msg5
- int 21h
- mov dx, di ;di указывает на начало строки (пропускаем пробелы)
- int 21h
- mov ah, 9
- lea dx, msg3 ;MSG::Success
- int 21h
- jmp short ex
- er: mov ah, 9
- lea dx, msg1 ;ERR::Wrong path.
- int 21h
- jmp restart
- et: mov ah, 9
- lea dx, msg2 ;ERR::Can't read.
- int 21h
- ex: mov ah, 8 ;getch()
- int 21h
- mov ah, 4ch
- int 21h
- ;Преобразование символа в номер диска
- ;OUT: AL=1 - ОК, disk=номер диска
- ParsePath proc near
- ;-Преобразование в верхний регистр
- cmp al, 61h
- jl short mj
- cmp al, 7Ah
- jg short mj
- sub al, 20h
- mj:
- ;---------------------------------
- sub al, 'A'
- cmp al, 0 ;2 ;C:\
- jl short ea
- cmp al, 25 ;Z:\
- jg short ea
- mov disk, al
- mov al, 1
- ea: ret
- ParsePath endp
- ;Чтение CX секторов с сектора #DX в буфер BX
- readSectors proc
- mov al, disk
- int 25h
- pop ax
- jc short e1
- mov al, 1
- e1: ret
- readSectors endp
- ;Чтение ROOT в sectbuf[]
- read_ROOT proc
- mov ax, word ptr sectbuf[11h]
- mov foldSize, ax
- div by16 ; AX * 32 / 512
- movzx cx, al ;= кол-во секторов
- mov ax, word ptr sectbuf[16h]
- mul by2w
- inc ax
- mov dx, ax ;= первый сектор
- lea bx, sectbuf
- call readSectors
- ret
- read_ROOT endp
- ;Подсчет элементов в ROOT.
- ;IN: foldSize, sectbuf[]
- ;OUT: filenum
- searchInFolder proc
- mov filenum, 0
- mov si, 0
- mov cx, foldSize
- l1: mov al, sectbuf[si] ;Первый байт записи
- cmp al, 0h ;Конец Root
- je short calced
- add si, 32
- inc filenum
- loop l1
- calced: ret
- searchInFolder endp
- ;Преобразование ax в строку 10-ого вида
- ;Исходный код в dx:ax
- dcm proc near
- lea di, ds:outbuf + 5 ;di - адрес последнего символа
- mov bx, 10 ;делитель
- cmp ax, 0 ;проверим на отрицательность
- jz short mb ;если число = 0
- ;деление, преобразование остатков из dx в символы и запись в массив символов
- mc: mov dx, 0 ;сбрасываем dx
- div bx ;деление на 10
- mov [di], dl ;остаток записываем в конечный массив
- add byte ptr [di], '0'
- dec di
- cmp ax, 10 ;сравним частное с 10
- jae short mc ;деление, если частное => 10
- mov [di], al ;записываем остаток в конечный массив
- add byte ptr [di], '0'
- jmp short md
- mb: mov byte ptr [di], '0'
- md: ret
- dcm endp
- cseg ends
- end m0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement