Advertisement
Guest User

Untitled

a guest
May 26th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;1 зарезервированный сектор
  2. ;Размер кластера 1 сектор
  3. ;Размер сектора 512 байт
  4. .386
  5. dseg segment use16
  6.     disk db ?
  7.     filenum dw ?
  8.     sectnum dw ?
  9.     outbuf db 6 dup(' '), '$'
  10.    
  11.     foldSize dw ?   ;(в записях по 32 байта) 224 обычно для ROOT
  12.     sectbuf db 512*32 dup (0FFh)    ;Буфер для считывания содержимого директорий
  13.    
  14.     msg0 db 'Enter disk name: $'
  15.     msg1 db 0dh, 0ah, 'ERROR. Wrong file path.', 0dh, 0ah, '$'
  16.     msg2 db 0dh, 0ah, 'ERROR. Cannot read sector.', 0dh, 0ah, '$'
  17.     msg3 db 0dh, 0ah, '<!--Program ended successfully-->', 0dh, 0ah, '$'
  18.     msg4 db 0dh, 0ah, 'Sectors in ROOT: $'
  19.     msg5 db 0dh, 0ah, 'Entries in ROOT: $'
  20.    
  21.     ;Константы для умножения/деления
  22.     by2w dw 2
  23.     by16 db 16
  24. dseg ends
  25.  
  26. cseg segment use16
  27.     assume ds:dseg, cs:cseg
  28. m0: mov ax, dseg
  29.     mov ds, ax
  30. restart:
  31.     mov ah, 9
  32.     lea dx, msg0 ;MSG::Enter path.
  33.     int 21h
  34.     mov ah, 1h ;INPUT::path.
  35.     int 21h
  36.    
  37.     call ParsePath
  38.     cmp al, 1
  39.     jne short er
  40.  
  41. ;Чтение BOOT сектора
  42.     lea bx, sectbuf
  43.     mov cx, 1
  44.     mov dx, 0
  45.     call readSectors
  46.     cmp al, 1
  47.     jne short et
  48.    
  49. ;Чтение FAT таблицы и каталога ROOT
  50.     call read_ROOT
  51.     cmp al, 1
  52.     jne short et
  53.     call searchInFolder
  54.    
  55.     mov ax, filenum
  56.     div by16 ; AX * 32 / 512
  57. ;Если остаток больше 0, увеличиваем результат на 1
  58.     cmp ah, 0
  59.     je m1
  60.     inc al
  61.     mov ah, 0 ;ah=0, т.к. dcm работает с ax
  62. ;--------------
  63. m1: call dcm
  64.     mov ah, 9
  65.     lea dx, msg4
  66.     int 21h
  67.     mov dx, di  ;di указывает на начало строки (пропускаем пробелы)
  68.     int 21h
  69.    
  70.     mov ax, filenum
  71.     call dcm
  72.     mov ah, 9
  73.     lea dx, msg5
  74.     int 21h
  75.     mov dx, di  ;di указывает на начало строки (пропускаем пробелы)
  76.     int 21h
  77.    
  78.    
  79.     mov ah, 9
  80.     lea dx, msg3 ;MSG::Success
  81.     int 21h
  82.     jmp short ex
  83. er: mov ah, 9
  84.     lea dx, msg1 ;ERR::Wrong path.
  85.     int 21h
  86.     jmp restart
  87. et: mov ah, 9
  88.     lea dx, msg2 ;ERR::Can't read.
  89.     int 21h
  90. ex: mov ah, 8   ;getch()
  91.     int 21h
  92.     mov ah, 4ch
  93.     int 21h
  94.  
  95. ;Преобразование символа в номер диска
  96. ;OUT: AL=1 - ОК, disk=номер диска
  97. ParsePath proc near
  98. ;-Преобразование в верхний регистр
  99.     cmp al, 61h
  100.     jl short mj
  101.     cmp al, 7Ah
  102.     jg short mj
  103.     sub al, 20h
  104. mj:
  105. ;---------------------------------
  106.     sub al, 'A'
  107.     cmp al, 0 ;2 ;C:\
  108.     jl short ea
  109.     cmp al, 25 ;Z:\
  110.     jg short ea
  111.     mov disk, al
  112.     mov al, 1
  113. ea: ret
  114. ParsePath endp
  115.  
  116. ;Чтение CX секторов с сектора #DX в буфер BX
  117. readSectors proc
  118.     mov al, disk
  119.     int 25h
  120.     pop ax
  121.     jc short e1
  122.     mov al, 1
  123. e1: ret
  124. readSectors endp
  125.  
  126. ;Чтение ROOT в sectbuf[]
  127. read_ROOT proc
  128.     mov ax, word ptr sectbuf[11h]
  129.     mov foldSize, ax
  130.     div by16 ; AX * 32 / 512
  131.     movzx cx, al ;= кол-во секторов
  132.    
  133.     mov ax, word ptr sectbuf[16h]
  134.     mul by2w
  135.     inc ax
  136.     mov dx, ax ;= первый сектор
  137.    
  138.     lea bx, sectbuf
  139.     call readSectors
  140.     ret
  141. read_ROOT endp
  142.  
  143. ;Подсчет элементов в ROOT.
  144. ;IN: foldSize, sectbuf[]
  145. ;OUT: filenum
  146. searchInFolder proc
  147.     mov filenum, 0
  148.     mov si, 0
  149.    
  150.     mov cx, foldSize
  151. l1: mov al, sectbuf[si] ;Первый байт записи
  152.     cmp al, 0h  ;Конец Root
  153.     je short calced
  154.     add si, 32
  155.     inc filenum
  156.     loop l1
  157. calced: ret
  158. searchInFolder endp
  159.  
  160. ;Преобразование ax в строку 10-ого вида
  161. ;Исходный код в dx:ax
  162. dcm proc near
  163.     lea di, ds:outbuf + 5   ;di - адрес последнего символа
  164.     mov bx, 10          ;делитель
  165.     cmp ax, 0           ;проверим на отрицательность
  166.     jz short mb         ;если число = 0
  167. ;деление, преобразование остатков из dx в символы и запись в массив символов
  168. mc: mov dx, 0       ;сбрасываем dx
  169.     div bx          ;деление на 10
  170.     mov [di], dl    ;остаток записываем в конечный массив
  171.     add byte ptr [di], '0'
  172.     dec di
  173.     cmp ax, 10      ;сравним частное с 10
  174.     jae short mc    ;деление, если  частное => 10
  175.     mov [di], al    ;записываем остаток в конечный массив
  176.     add byte ptr [di], '0'
  177.     jmp short md
  178. mb: mov byte ptr [di], '0'
  179. md: ret
  180. dcm endp
  181.  
  182. cseg ends
  183. end m0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement