С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 09.10.2017
Сообщений: 7

Вывести количество свободных кластеров в fat, Диск C

15.10.2017, 21:24. Показов 2208. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: вывести информацию о количестве свободных кластеров
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
.model small 
.stack 100h 
.data
 
INT25Block struc 
    sectorno  dw ?  ; номер сектора 2^32 секторов
    nsectors  dw ?  ; количество считываемых секторов 
    offs      dw ?  ; смещение – часть дальнего указателя на буфер 
    segm      dw ?  ; сегмент – часть дальнего указателя на буфер
    
INT25Block ends
; блок параметров и буфер данных 
block INT25Block <> 
buf  db 512 dup (?)
count dw 0
.code 
 
Cikl proc near
xor si, si
DEC si
DEC si
m2:
add si, 2
cmp si, 514
JZ exit
cmp word ptr [block.offs+si], 0
JNZ m2
INC count
JMP m2
exit:
Ret 
Cikl endp
 
OUTPUT proc near
 
mov ax, count
m4:
mov bx, 10
div bx
mov dl, ah
mov ah, 02h
int 21h
cmp ax, 0
jnz m4
Ret
OUTPUT endp
 
main:
mov ax, @data 
mov ds, ax
mov di, 1
 
m1:
mov block.sectorno , di ;номер считываемого сектора 
mov block.nsectors, 1 ; количество считываемых секторов 
mov block.offs, offset buf  ; смещение дальнего указателя на буфер 
mov block.segm, ds          ; сегмент дальнего указателя на буфер
mov al, 02h        ; AL==00h логический диск0-A:, 1-B:, 2-C:,... 
mov cx, 0FFFFh     ; признак расширенной функции 
lea bx, block      ; DS:BX – адрес блока описания операции чтения 
int 25h            ; вызываем сервис 
 
call Cikl
inc di
cmp di, 252
JNZ m1
 
;mov ah, 02h
;mov dl, word PTR[count]
;int 21h
call OUTPUT
 
end main
может кто подскажет, в чем ошибка?
Не считает почему то, хотя по логике должно
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.10.2017, 21:24
Ответы с готовыми решениями:

Вычисление количества свободных кластеров
Помогите написать программу для вывода на экран количества свободных кластеров на диске.

Посчитать, сколько кластеров на диске и полученное количество занести в файл
доброе время суток задали сделать программу, которая бы считала сколько кластеров на диске и полученное количество данных о количестве...

Количество свободных кластеров в FAT16
как узнать, сочетать сколько свободных кластеров в FAT16

4
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
15.10.2017, 22:44
Цитата Сообщение от Phan_Nick Посмотреть сообщение
mov al, 02h ; AL==00h логический диск0-A:, 1-B:, 2-C:,...
для выбора диска(С) нужно в AL положить не два, а 80h
диски нумеруются начиная с 80h
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
15.10.2017, 23:45
А где это можно увидеть? У Ральфа Брауна только 0-A, 1-B, etc.
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
16.10.2017, 06:21
южный мост имел два контроллёра дисков - FDD и HDD
для адресации их каналов выделялся байт, младшая половина которого 00-7Fh перенаправлялась на Floop-контроллёр, а старшая половина 80-FFh - на контроллёр жёсткого диска. Рулит знаковый бит. От сюда и нумерация у функций прерываний.

Добавлено через 6 часов 3 минуты
свободные кластеры можно получить fn.DOS - 36h
она специально для этого введена:
Code
1
2
3
4
5
6
7
8
9
10
11
12
INT-21h, AH = 36h - Дать свободную память диска
------------------------------------------------
Вход  :  AH = 36H
         DL = номер диска (1=A,2=B,80h=C,81h=D)
Выход :  AX = 0ffffH, если DL содержал неверный номер диска,
              секторов на кластер, если нет ошибок
         BX = доступных кластеров
         CX = байт на сектор
         DX = всего кластеров на диске
 
Описание: Свободная память в байтах = (AX * CX * BX)
              всего памяти в байтах = (AX * CX * DX)
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
16.10.2017, 08:09
Лучший ответ Сообщение было отмечено Phan_Nick как решение

Решение

- УПС!!! Оказывается DOS требует последовательной нумерации дисков - С:\=3. Нуль - текущий.
Это биос со-своим INT-13h напрямую обращается к портам контроллёра дисков, и соответственно нумеруются они по старшему биту: С=80h. DOS работает через драйвер.

Сейчас опробовал.., при DL=1 флоп щёлкает, при остальных значениях - нет.
2 - это второй канал флопа, 3 - HDD(0), 4 - HDD(1):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;fasm-code..
;------------
org     100h
jmp     start
 
disk    db   13,10,'------------------------'
        db   13,10,'Disk (A,B,C,D)......: $'
mes0    db   13,10,'   Sector size......: $'
mes1    db   13,10,'   Sector to Cluster: $'
mes2    db   13,10,'   Free Clusters....: $'
mes3    db   13,10,'   Total Cluster....: $'
err     db   '  <-- DISK ERROR!!!$'
 
start:  mov   bp,4         ; кол-во дисков
 
;---- запрос на ввод буквы диска
@dsk:   mov   dx,disk
        call  Message      ;
        xor   ax,ax        ;
        int   16h          ;
        and   al,0dfh      ; переводим в вехний регистр
        int   29h          ;
 
        sub   al,40h       ; делаем из буквы цифру
        mov   dl,al        ; номер диска для fn.36h
 
;---- Дать свободную память диска!
        mov   ah,36h       ;
        int   21h          ;
        or    ax,ax        ;
        jns   @ok          ;
        mov   dx,err       ; ошибка диска!
        call  Message      ;
        jmp   @next        ; сл.попытка
 
;---- Вывод инфы на экран
@ok:    push  dx bx ax cx  ; запомнить выхлоп функции
        mov   dx,mes0      ;
        call  Message      ;
        pop   ax           ; СХ = размер сектора
        call  hex2asc      ;
 
;---- АХ = секторов в кластере
        mov   dx,mes1      ;
        call  Message      ;
        pop   ax           ;
        call  hex2asc      ;
 
;---- ВХ = свободно кластеров
        mov   dx,mes2      ;
        call  Message      ;
        pop   ax           ;
        call  hex2asc      ;
 
;---- Всего кластеров на диске
        mov   dx,mes3      ;
        call  Message      ;
        pop   ax           ;
        call  hex2asc      ;
 
;---- Все диски показали?
@next:  dec   bp           ;
        jnz   @dsk         ; нет..
 
@exit:  xor   ax,ax        ;
        int   16h          ;
        int   20h          ;
 
;---- ПРОЦЕДУРЫ ----------------------------------//
Message:                   ; мессага
   mov   ah,9
   int   21h
   ret
;------------
hex2asc:                   ; вывод на экран числа(АХ/EAX)
   mov   ebx,10            ; система счисления для вывода
   xor   ecx,ecx
isDiv:
   xor   edx,edx
   div   ebx
   push  edx
   inc   ecx
   or    eax,eax
   jnz   isDiv
isOut:
   pop   eax
   cmp   al,9
   jle   noHex
   add   al,7
noHex:
   add   al,30h
   int   29h
   loop  isOut
ret
Миниатюры
Вывести количество свободных кластеров в fat, Диск C  
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.10.2017, 08:09
Помогаю со студенческими работами здесь

Используя функции GetDriveType и GetDiskFreeSpace определить тип диска и количество свободных кластеров на диске
Доброго времени суток.Нужна помощь в исправлении кода по 2м АР функциям .Используя функции GetDriveType и GetDiskFreeSpace определить тип...

Добавить физический диск FAT в VirtualBox
вправьте/пересадите пожалуйста руки. Попытки добавить раздел диска в VirtualBox привели к вот этому.

Как флэшку или жесткий диск конвертировать в FAT
Был жесткий диск и флешка с магазина, воспроизводил DVD . После форматирования открывает только комп. DVDюшник не видит файлов на носителях...

Файловые системы: FAT-16, FAT-32, NTFS и маленькие текстовые файлы.
Здравствуйте, форумчане:) есть такой вопрос: какое влияние оказывает выбор файловой системы (FAT 16, FAT 32, NTFS) для запоминания...

Количество секторов, кластеров и серийник диска
необходимо определить кол-во секторов, кластеров, байт в кластере и серийник диска перерыл функции из серии &quot; DriveInfo HardDisk =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru