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

Вывод на экран количества разделов на жестком диске

26.12.2016, 16:10. Показов 1480. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пытаюсь понять и написать программу для работы жестким диском под DOS. Суть в том что мне нужно вывести на экран сколько у меня разделов на жестком диске, вопрос такой как это сделать? Может кто встречался с данной задачей

Все что я пока смог сделать это считать сектор MBR, чтобы в отладчике увидеть саму таблицу

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
dseg  segment use16
    buffer db 512 dup (?)       ;область для размещение содержимого сектора  
    errr   db 'Attention sector read error! $' 
    nerrr   db 'there is no error! $' 
 
    ;Пакет дискового адреса 
    paket db 16         ;длинна пакета 
      db 0  
      db 1          ;кол-во секторов для чтения
      db 0
      dw buffer         ;внутрисегментная адресация области буфера 
      dw dseg       ;значение указателя сегмента данных
      dq 0          ;номер сектора в LBA
 
dseg  ends
cseg  segment use16
 
assume ds:dseg, cs:cseg
 
m1:
mov cx, dseg
mov ds, cx
 
;подготовка параметров для вызова функции 42h прервыания 13h
    mov ah,42h  
    mov dl,80h  ;номер устройства
    lea si,paket    ;смещение пакета диского адреса в сегмент данных
    
    int 13h
    jc  short eerr
    jnc short nerr
 
;завершение исполнения
exit:   mov ah,4ch
    int 21h
 
;сообщение об ошибки чтения сектора
eerr:
    mov   ah,9
    lea   dx,errr
    int   21h
    jmp   short exit 
 
;нет ошибки чтения сектора
nerr:
    mov   ah,9
    lea   dx,nerrr
    int   21h
    jmp   short exit 
cseg ends
end m1
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2016, 16:10
Ответы с готовыми решениями:

Вывод на экран информации о жестком диске
Доброго времени суток, товарищи. Заранее прошу прощения если не в том разделе пишу, но вопрос...

Перераспределение разделов на жёстком диске
Обновлял Windows с 7-ки до 10-ки. При обновлении получилось так, что теперь винда находится на...

Создание разделов в жестком диске
Поставил диск дополнительный диск Samsung SP0411N 40GB NTFS C помощью PartitionMagic 8.0...

Максимальное количество разделов на жестком диске
Здравствуйте, я прочитал, что у Microsoft Windows в таблице разделов резервируется место для 128...

10
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
26.12.2016, 18:21 2
C таблицей разделов знаком?
Достаточно проверить байт "BootID" по смещению [ParTable+5].
Он описывает флаг раздела. Если нуль - то нет раздела:
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
;fasm-code
;------------
org  100h
jmp  start
 
;---- DATA ----
mes0    db  13,10,'Read MBR..: $'
mes1    db  'OK!'
        db  13,10,'Part count: $'
err     db  'Error!$'
 
; 512 байт для чтения сектора MBR
buff    db   446 dup(0)
part1   db   16 dup(0)
part2   db   16 dup(0)
part3   db   16 dup(0)
part4   db   16 dup(0)
sign    db   02 dup(0)
 
;---- CODE ----
start:  mov   dx,mes0
        call  Message
 
        mov   ax,0201h       ; читаем MBR
        mov   bx,buff
        mov   cx,1
        mov   dx,80h         ; диск(0)
        int   13h
        jc    Error          ; если ошибка
 
        mov   dx,mes1
        call  Message
 
        lea   si,[part1+4]   ; адрес первого флага
        mov   cx,4           ; всего разделов
        mov   al,'0'         ; всего дисков в дефолте
@find:  cmp   byte[si],0     ; проверка очередного флага
        jz    @next
        inc   al             ; счётчик, если не нуль
@next:  add   si,16          ; адрес сл.флага..
        loop  @find
 
        int   29h            ; выводим кол-во найденных!
 
@exit:  xor   ax,ax
        int   16h
        int   20h            ; на выход!
 
;------- Процедуры ------------------------------------//
Message:
        mov  ah,9
        int  21h
        ret
 
Error:  mov   dx,err
        call  Message
        jmp   @exit
1
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 119
26.12.2016, 18:50  [ТС] 3
Спасибоо вам, а еще вопрос а если мне нужно в добавок к этому вывести тип каждого раздела FAT или FAT32 к примеру, то как сделать проверку?
0
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
26.12.2016, 19:33 4
Цитата Сообщение от guard_2007 Посмотреть сообщение
вывести тип каждого раздела
Вот тебе коды типов разделов.
Делай внутри программы структуру с этими данными, и выбирай строку по результату проверки из этой структуры.
0
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 119
26.12.2016, 23:41  [ТС] 5
А еще вопрос, этот исполняемый файл был с расширением com, я просто для своей среды не могу его у себя запустить т.к у меня все исполняемые файл с расш. exe

Добавлено через 3 часа 7 минут
Переписал код под свою среду отладки, после запуска программы у меня выводится строчка part count но не выводится количество разделов

Вот код, где я мог ошибиться или что то не заметить?

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
.386
dseg  segment use16
    buffer db 446 dup (0)
    part1   db   16 dup(0)
    part2   db   16 dup(0)
    part3   db   16 dup(0)
    part4   db   16 dup(0)
    sign    db   02 dup(0)
 
    errr   db 'Attention sector read error! $'  
    razdel  db  'Part count: $'
 
    ;Пакет дискового адреса 
    paket db 16         ;длинна пакета 
      db 0  
      db 1          ;кол-во секторов для чтения
      db 0
      dw buffer         ;внутрисегментная адресация области буфера 
      dw dseg       ;значение указателя сегмента данных
      dq 0          ;номер сектора в LBA
 
dseg  ends
cseg  segment use16
 
assume ds:dseg, cs:cseg
 
m1:
mov cx, dseg
mov ds, cx
 
    mov ah,42h  
    mov dl,80h  ;номер устройства
    lea si,paket    ;смещение пакета диского адреса в сегмент данных
    
    int 13h
    jc  short eerr
 
find:  cmp   byte ptr [si],0     ; проверка очередного флага
        jz    next
        inc   al             ; счётчик, если не нуль
next:  add   si,16          ; адрес сл.флага..
        loop  find
 
        jmp razdell
        
 
;завершение исполнения
exit:   mov ah,4ch
    int 21h
 
;сообщение об ошибки чтения сектора
 
razdell:
        mov   ah,9
    lea   dx,razdel
    int   21h
    jmp   short exit 
 
 
eerr:
    mov   ah,9
    lea   dx,errr
    int   21h
    jmp   short exit 
 
 
cseg ends
end m1
0
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
27.12.2016, 06:28 6
Цитата Сообщение от guard_2007 Посмотреть сообщение
но не выводится количество разделов
..так нету-же у тебя вывода на экран, поэтому и не выводит.
Видимо ты вообще далёк от ассемблера. INT-29h выводит на экран с регистра(AL).
И где счётчик в СХ для "LOOP", и куда указывает(SI)?
Короче, попробуй так, и не ленись читать маны:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
;tasm-code
;-----------------------
; вставляй от сюда
        int 13h
        jc    short eerr
 
        mov   ah,9
        lea   dx,razdel1
        int   21h
 
        lea   si,part1+4
        mov   cx,4
        mov   al,'0'
find:   cmp   byte ptr [si],0     ; проверка очередного флага
        jz    next
        inc   al             ; счётчик, если не нуль
next:   add   si,16          ; адрес сл.флага..
        loop  find
        int   29h
 
;завершение исполнения
exit:   mov   ah,4ch
        int   21h
0
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 119
27.12.2016, 10:06  [ТС] 7
Да только учусь на нем работать, большое вам человеческое спасибо
0
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
27.12.2016, 14:48 8
Цитата Сообщение от guard_2007 Посмотреть сообщение
большое вам человеческое спасибо
Ну если так, то вот тебе вариант "на коленке" со-строковым выводом..
Под TASM переделаешь сам:
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
;fasm-code
;--------------
org  100h
jmp  start
 
;---- DATA ----
mes0    db  13,10,'Read MBR....: $'
mes1    db  'OK!'
        db  13,10,'Part count..: $'
mes2    db  13,10,'Partition(1): $'
err     db  'Error!$'
 
; 512 байт загрузочный сектор MBR -----------------------
buff    db   446 dup(0)
part1   db   016 dup(0)
part2   db   016 dup(0)
part3   db   016 dup(0)
part4   db   016 dup(0)
sign    db   002 dup(0)
;-----------------------------
m01     db   'FAT-12/CHS/32M disk $'
m02     db   'FAT-16/CHS/32M disk $'
m03     db   'FAT-32/CHS/8Gb/Extended $'
m04     db   'FAT-16/CHS/8Gb disk $'
m05     db   'NTFS/CHS $'
m06     db   'FAT-32/CHS $'
m07     db   'FAT-32/LBA $'
m08     db   'VFAT/LBA $'
m09     db   'FAT-32/CHS/Extended $'
m10     db   'FAT/LBA/WinNT $'
m11     db   'NTFS/LBA/WinNT $'
m12     db   'GPT $'
m13     db   'UEFI/System $'
m14     db   'EFAT $'
; Таблица переходов -------------------------------------
table   dw   01h,m01
        dw   04h,m02
        dw   05h,m03
        dw   06h,m04
        dw   07h,m05
        dw   0Bh,m06
        dw   0Ch,m07
        dw   0Eh,m08
        dw   0Fh,m09
        dw   86h,m10
        dw   87h,m11
        dw  0EEh,m12
        dw  0EFh,m13
        dw  0F7h,m14
tabSize  =   ($-table)/4
 
;---- CODE ----
start:  mov   dx,mes0
        call  Message
 
        mov   ax,0201h
        mov   bx,buff
        mov   cx,0001h
        mov   dx,0080h
        int   13h           ; читать MBR!
        jc    Error
        mov   dx,mes1
        call  Message
 
; считаем кол-во разделов
        lea   si,[part1+4]
        mov   cx,4
        mov   al,'0'
@find:  cmp   byte[si],0
        je    @next
        inc   al
@next:  add   si,16
        loop  @find
        int   29h
 
; показываем типы найденных разделов
        lea   si,[part1+4]
        mov   di,4              ; всего партишен
@comp:  xor   ah,ah             ;
        lodsb                   ; АХ= текущий флаг
        add   si,15             ;    ..(смещаем указатель)
        mov   cx,tabSize        ; длина таблицы
        mov   bx,table          ; её адрес
@type:  cmp   ax,[bx]           ; совпало?
        jnz   @miss             ;
 
        mov   dx,mes2           ; да!
        call  Message           ;
        mov   dx,[bx+2]         ; адрес мессаги в сл.слове
        call  Message           ; выводим на экран!
        jmp   @otherPart        ; сл.партишен..
 
@miss:  add   bx,4              ; флаг не совпал! смещаемся в таблице
        loop  @type             ; сравнить со всеми флагами
 
@otherPart:                     ;
        inc   byte[mes2+12]     ; меняем цифру в мессаге
        dec   di                ; все/4 партишены проверили?
        jnz   @comp             ; нет..
;------------------------
 
@exit:  xor   ax,ax
        int   16h
        int   20h               ; выход!
 
;------- Процедуры ------------------------------------//
Message:
        mov  ah,9
        int  21h
        ret
 
Error:  mov   dx,err
        call  Message
        jmp   @exit
Миниатюры
Вывод на экран количества разделов на жестком диске  
1
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 119
28.12.2016, 22:40  [ТС] 9
Для меня ваш вариант оказался немного трудным и не понятным, поэтому я решил сделать свой, немного попроще

И вопрос такой как мне органировать красивый вывод списка моих партишенов для моего варианта, я никак не могу разобраться с этим?


Пробовал через аски коды, но это такое мучение


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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
.386
dseg  segment use16
    buffer db 446 dup (0)
    part1   db   16 dup(0)
    part2   db   16 dup(0)
    part3   db   16 dup(0)
    part4   db   16 dup(0)
    sign    db   02 dup(0)
 
    errr   db 'Attention sector read error! $'  
    razdel db 13,10,'Part count: $'
 
    ;Пакет дискового адреса 
    paket db 16         ;длинна пакета 
      db 0  
      db 1          ;кол-во секторов для чтения
      db 0
      dw buffer         ;внутрисегментная адресация области буфера 
      dw dseg       ;значение указателя сегмента данных
      dq 0          ;номер сектора в LBA
 
    rest    db 'Razshireniy.razdel. $'
    txtntfs db 'NTFS $'
    txtfat16    db 'FAT16 $'
    txtfat32    db 'FAT32 $'
 
dseg  ends
cseg  segment use16
 
assume ds:dseg, cs:cseg
 
m1:
mov cx, dseg
mov ds, cx
 
    mov ah,42h  
    mov dl,80h  ;номер устройства
    lea si,paket    ;смещение пакета диского адреса в сегмент данных
    
    int 13h
    jc  short eerr
 
        mov   ah,9
    lea   dx,razdel
    int   21h
 
        ea si,part1+4
        mov   cx,4
        mov   al,'0'
find:   cmp   byte ptr [si],0     ; проверка очередного флага
        jz    next
        inc   al             ; счётчик, если не нуль
next:   add   si,16          ; адрес сл.флага..
        loop  find
        int   29h
 
; показываем типы найденных разделов
 
n1: 
    lea si,buffer   ;копирую свою таблицу разделов в рег. si
    add si,01c2h    ;адресное смещение 
    mov cx,4
    mov dl,0h   
srav:   cmp cx,0
    jz  exit    ;выход из проверки
    
    mov bl,ds:[si]
 
    cmp bl,07h  ;ntfs
    jz  ntfs
c1: cmp bl,06h  ;fat16
    jz  fat16
c2: cmp bl,0bh  ;FAT32
    jz  fat32
c3: cmp bl,0fh  ;расширенный раздел
    jz  rashraz
c4: 
        dec cx
    add si,10h
    jmp srav
 
;завершение исполнения
exit:   mov ah,4ch
    int 21h
 
eerr:
    mov   ah,9
    lea   dx,errr
    int   21h
    jmp   short exit 
 
 
;вывод сообщений о найденных типах разделов
 
ntfs:   
 
    mov   ah,9
    lea   dx,txtntfs
    int   21h
 
    jmp   c1
 
fat16:
 
    mov   ah,9
    lea   dx,txtfat16
    int   21h
    jmp   c2
 
fat32:
 
    mov   ah,9
    lea   dx,txtfat32
    int   21h
    jmp   c3
 
rashraz:
    mov   ah,9
    lea   dx,rest
    int   21h
    jmp   c4
 
 
cseg ends
end m1
0
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509
28.12.2016, 23:16 10
а еще разделов может быть больше чем 4 шт
0
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
28.12.2016, 23:38 11
tahir_, он MBR читает, а там потолок 4. Это расширенных может быть сколь угодно..
Другое дело GPT, где разделов и 128 не предел.
1
28.12.2016, 23:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2016, 23:38
Помогаю со студенческими работами здесь

Не открывается один из разделов на внешнем жестком диске
Внешний жесткий диск Seagate expansion usb 500gb, разбит на два раздела один в формате FAT32 другой...

Ошибка при создании разделов на жестком диске
Помогите пожалуйста с такой проблемой: есть ноут и на нем стоял винчестер sata seagate 1tb 5200 об....

HP pavilion g6 sr1312 Создание разделов на жестком диске
У меня ноутбук HP pavilion g6 sr1312 Когда купил на жестком диске уже было 4 раздела Но разбиты...

Почему на жестком диске так много разделов восстановления?
Объясните мне, пожалуйста, может с ноутбуком что-то не так? Винчестер на 1Тб, 200 с чем-то Гб -...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru