Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
NASM

Как прочитать диск с помощью int 13h

22.10.2025, 22:35. Показов 1554. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу свою ОС, просто как тестовый проект ради изучения языка. Начал с написания PBR. Пытаюсь прочитать 1 сектор диска. Там находится вторая часть PBR после байтов 0x55AA. Почитав интернет, рабочий метод чтения диска я не нашел. Каждый код, который я использую, записывает неверные данные в мой адрес. Предварительно перед чтением диска я конечно же проверяю этот адрес и он всегда пустой.
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
    ...
    mov dl, al
    push ax
    xor ax, ax
    mov ah, 0x41
    mov bx, 0x55aa
    int 0x13
    jc .rderror
    cmp bx, 0xaa55
    jne .rderror
    test cx, 1
    jz .rderror
    pop ax
    push ax
    mov dl, al
    mov ah, 0x42
    mov si, DAP
    int 0x13
    jc .rderror
    mov si, 0x7F00 ; в этот адрес я гружу сектор
    mov di, ldrtext ; те самые байты, которые должны находиться в начале этого сектора
    mov cx, 6
    repe cmpsb
    jz .verifnoerror ; грузимся дальше
    ... ; ошибка
DAP:
    db 0x10
    db 0x00
    dw 0x0001
    dw 0x7F00
    dw 0x0000
    dq 0x01
Для тех, кому нужен полный код (pbr применяется только если файловая система - FAT32):
Кликните здесь для просмотра всего текста
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
126
127
128
129
130
131
132
133
134
org 0x7c00
bits 16
 
jmp firstaosldr
nop
times 0x5A-($-$$) db 0
firstaosldr:
    xor ax, ax
    mov ds, ax
    mov ss, ax
    mov sp, 0x7c00
    mov al, dl
    push ax
    mov ah, 00h
    mov al, 10h
    int 10h
    mov ax, 03h
    int 10h
    mov si, ldrtext
    call printtext
    mov si, chkmemtext
    call printtext
    mov si, 0x7E00
    mov cx, 0xFFFF
    xor ax, ax
.chkmem:
    lodsb
    cmp al, 00h
    jne .errorchkmem
    cmp si, cx
    jnb .okchkmem
    jmp .chkmem
.errorchkmem:
    mov si, chkmemerrtext
    call printtext
    jmp .stop
.okchkmem:
    mov si, oktext
    call printtext
    mov si, rddsktext
    call printtext
    pop ax
    cmp al, 0x80
    jb .hddwarn
    cmp al, 0xE0
    jne .nohddwarn
.hddwarn:
    mov si, nohddwarntext
    call printtext
.nohddwarn:
    mov dl, al
    push ax
    xor ax, ax
    mov ah, 0x41
    mov bx, 0x55aa
    int 0x13
    jc .rderror
    cmp bx, 0xaa55
    jne .rderror
    test cx, 1
    jz .rderror
    pop ax
    push ax
    mov dl, al
    mov ah, 0x42
    mov si, DAP
    int 0x13
    jc .rderror
    mov si, 0x7F00
    mov di, ldrtext
    mov cx, 6
    repe cmpsb
    jz .verifnoerror
    mov si, 0x7F00
    call printtext
    mov si, ldrtext
    call printtext
    mov si, veriferrtext
    call printtext
    jmp .stop
.verifnoerror:
    mov si, oktext
    call printtext
    mov si, loadtext
    call printtext
    pop ax
    mov dl, al
    xor si, si
    xor di, di
    jmp secondaosldr
.rderror:
    mov si, rderrtext
    call printtext
.stop:
    mov si, stoptext
    call printtext
    cli
    hlt
printtext:
    mov ah, 0Eh
.run:
    lodsb
    cmp al, 00h
    je .done
    int 10h
    jmp .run
.done:
    ret
 
DAP:
    db 0x10
    db 0x00
    dw 0x0001
    dw 0x7F00
    dw 0x0000
    dq 0x01
 
ldrtext       db 'AOSLDR',10,13,0
chkmemtext    db 'Chk mem...',10,13,0
chkmemerrtext db 'F: mem is invalid',10,13,0
rddsktext     db 'Rd dsk...',10,13,0
nohddwarntext db "W: boot dev isn't hdd",10,13,0
rderrtext     db 'F: rd err',10,13,0
veriferrtext  db 'F: verify err',10,13,0
oktext        db 'OK',10,13,0
stoptext      db 'Stop...',0
loadtext      db 'Load AOSLDR...',10,13,0
times 0x1FE-($-$$) db 0
db 0x55, 0xAA, 'AOSLDR'
 
secondaosldr:
    nop
 
times 0x400-($-$$) db 0
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2025, 22:35
Ответы с готовыми решениями:

Int 13h. Не могу прочитать с винта за раз блок более 64кб
Я столкнулся с проблемой дело в том что через INT13h я не могу прочитать с винта за раз блок...

Как записать данные в загрузочный сектор без использования int 13h
Подскажите, пожалуйста, как записать данные в загрузочный сектор без помощи 13h прерывания.

Про то как DIV подрезает работу функции 42h int 13h
Привет, ребята! Хочу на Fasm'e сделать загрузчик с флешки, который использует FAT 16. Сам...

31
 Аватар для sporta1982
213 / 59 / 7
Регистрация: 05.10.2023
Сообщений: 502
22.10.2025, 23:20
аж прям вспомнилась дискета 3 дюйма с mbr. А чего там сейчас происходит
0
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 853
23.10.2025, 05:58
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
Начал с написания PBR
Что такое PBR? Вы сами придумали этот акроним или где-то нынче так преподают? Гугл ничего по нему путного не подсказывает. Применительно к теме мне известны только акронимы MBR (Master Boot Record) и VBR (Volume Boot Record). (ЕМНИП, в догугловые времена, а возможно просто до появления жестких дисков, когда единственными носителями на ПК были дискеты, вместо VBR употреблялось просто BR, но память может подводить.) Эти акронимы по крайней мере среди прочих результатов на первой странице результатов поиска гугла есть.

Я конечно могу предположить, что PBR получилось от Partition Boot Record. Но это лишь догадки. Хочется конкретики.
0
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
23.10.2025, 12:13  [ТС]
PBR и есть VBR, в многих постах именно так он называется
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
23.10.2025, 17:15
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
Каждый код, который я использую, записывает неверные данные в мой адрес.
Вы же инициализируете все регистры, в т.ч. сегментные в начале кода?
У вас номер диска точно в AL (mov dl, al)? При старте номер диска находится в DL.
0
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
23.10.2025, 19:01  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
При старте номер диска находится в DL.
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
    xor ax, ax
    mov ds, ax
    mov ss, ax
    mov sp, 0x7c00
    mov al, dl
    push ax
    ; ...
    pop ax
    cmp al, 0x80
    jb .hddwarn
    cmp al, 0xE0
    jne .nohddwarn
    ; ...
.nohddwarn:
    mov dl, al
    push ax
    xor ax, ax
    ; ...
    pop ax
    push ax
    mov dl, al
    mov ah, 0x42
    mov si, DAP
    int 0x13
    jc .rderror
    mov si, 0x7F00
    mov di, ldrtext
    mov cx, 6
    repe cmpsb
    jz .verifnoerror
Добавлено через 59 секунд
Номер диска все время в стэке лежит
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
23.10.2025, 22:44
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
Номер диска все время в стэке лежит
Почему бы вам не записать её в переменную? Меньше простора для ошибок.
Но тут, конечно, проблема не в этом. Код выглядит корректным. И очень странно, если загружаются неверные данные.
Собственно, а как вы понимаете, что загружаются неверные данные?
Может, ошибка не в чтении сектора, а в чём-то другом?

Добавлено через 1 минуту
Добавьте ещё на всякий случай после mov sp, 0x7c00 строки
Assembler
1
2
    jmp 0:start
start:
Добавлено через 3 минуты
А перед repe cmpsbcld.
0
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
24.10.2025, 18:18  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Собственно, а как вы понимаете, что загружаются неверные данные?
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
    ; ...
    mov si, 0x7F00
    mov di, ldrtext
    mov cx, 6
    repe cmpsb
    jz .verifnoerror
    mov si, 0x7F00
    call printtext
    mov si, ldrtext
    call printtext
    mov si, veriferrtext
    call printtext
    jmp .stop
; ...
.stop:
    mov si, stoptext
    call printtext
    cli
    hlt
printtext:
    mov ah, 0Eh
.run:
    lodsb
    cmp al, 00h
    je .done
    int 10h
    jmp .run
.done:
    ret
Добавлено через 1 минуту
Цитата Сообщение от Jin X Посмотреть сообщение
Может, ошибка не в чтении сектора, а в чём-то другом?
Проверка сразу после чтения идет
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
24.10.2025, 18:27
ARRAYBOW, это не показатель. Может, у вас флаг DF установлен и проверка идёт в обратную сторону. Я не вижу у вас cld, например.
Вы пробовали отладку делать?
0
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
24.10.2025, 18:42  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Вы пробовали отладку делать?
Как я сделаю отладку на QEMU?
0
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
24.10.2025, 18:47  [ТС]
Вот что PBR выводит. Слева прочитанные байты, а справа нужные (AOSLDR)
Миниатюры
Как прочитать диск с помощью int 13h  
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
24.10.2025, 19:00
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
Как я сделаю отладку на QEMU?
Думаю, что предусмотрена и отладка загрузчика.

Для BOCHS есть возможность
Как войти в pm
0
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 853
25.10.2025, 09:51
ARRAYBOW, расскажите, в какое место диска (номер сектора) записывается бинарь, который получается при компиляции? Как в эмуляторе настроена загрузка: как с дискеты или как с жёсткого диска?
0
-610 / 35 / 0
Регистрация: 10.03.2025
Сообщений: 485
25.10.2025, 10:54
А может не надо привязывать бут сектор к адресу или даже к диску, вот OS/2
говорят ставилась на любой диск или логический том, находим определенную
сигнатуру файла, например MZ и вуаля.

Респект и уважуха героям делающим ОСь с нуля на еще и на ассемблере
кстати SASM хороший инструмент , поддерживает 4 модели ассемблера
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
25.10.2025, 13:28
ARRAYBOW, у вас не правильно заполнен пакет DAP для чтения функцией 42h - попробуйте так..
Здесь сначала в регистр AX копируется стартовый номер сектора PBR из таблицы разделов диска (смещение 0x01C6), а значит вам нужно поместить свою тестовую строку именно в этот сектор.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
         mov    ax,word[$$+0x01c6]  ;// StartLBA из таблицы разделов диска
 
;// Пакет DAP ----------------
         pushd  0           ;// StartLBA Hight
         push   0 ax        ;// StartLBA Low
         push   0           ;// Buffer Segment
         push   0x0600      ;// Buffer Offset (приёмный буф, измените на свой)
         push   32          ;// Sector Counter (сколько секторов читать)
         push   16          ;// Sizeof Packet
 
         mov    ah,42h         ;// функция 42h = чтение секторов в память
         xor    dh,dh          ;//
         mov    dl,0x80        ;// номер диска
         mov    si,sp          ;// указатель на пакет
         int    13h            ;// сервис диска
         add    sp,16          ;// восстановить стек от 'пушей
0
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
25.10.2025, 16:06  [ТС]
Цитата Сообщение от Argogo Посмотреть сообщение
в какое место диска (номер сектора) записывается бинарь
VBR всегда находится на секторе 0.
Цитата Сообщение от Argogo Посмотреть сообщение
Как в эмуляторе настроена загрузка: как с дискеты или как с жёсткого диска?
С жесткого диска, а именно с vhd. Внутри находится 2 раздела: на 33 мб, FAT32 и с моим VBR и обычный раздел NTFS на 49,96 гб.
Цитата Сообщение от avedeo Посмотреть сообщение
А может не надо привязывать бут сектор к адресу или даже к диску
И как вы себе загрузку представляете? BIOS грузит MBR, а он читает 1 сектор в адрес 0x7C00 и передает управление туда. А там вместо 3 первых байтов и с 0x5A (или 0x54) нули находятся
Цитата Сообщение от avedeo Посмотреть сообщение
находим определенную
сигнатуру файла, например MZ и вуаля.
Для этого нужно писать драйвер для файловой системы, парсер сигнатуры. А без начального загрузчика такое невозможно
Цитата Сообщение от R71MT Посмотреть сообщение
mov    ax,word[$$+0x01c6]
В моем случае не подойдет, т.к. у меня указано org 0x7C00, но я поправлю

Добавлено через 7 минут
Цитата Сообщение от R71MT Посмотреть сообщение
ARRAYBOW, у вас не правильно заполнен пакет DAP для чтения функцией 42h - попробуйте так..
Code
1
2
Data\pbr.asm:68: error: instruction expected, found `pushd 0'
Data\pbr.asm:69: error: comma, colon, decorator or end of line expected after operand
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    pop ax
    mov dl, al
    mov ax, word[$$+0x01c6]
    pushd 0          ;// StartLBA Hight
    push 0 ax        ;// StartLBA Low
    push 0           ;// Buffer Segment
    push 0x7F00      ;// Buffer Offset (приёмный буф, измените на свой)
    push 1           ;// Sector Counter (сколько секторов читать)
    push 16          ;// Sizeof Packet
    mov ah, 42h      ;// функция 42h = чтение секторов в память
    xor dh, dh
    mov si, sp
    int 13h
    jc .rderror
    add sp,16
    xor ax, ax
    mov al, dl
    push ax
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
25.10.2025, 16:18
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
Data\pbr.asm:68: error: instruction expected, found `pushd 0'
ну так сделайте 2 раза push 0

Цитата Сообщение от ARRAYBOW Посмотреть сообщение
В моем случае не подойдет, т.к. у меня указано org 0x7C00, но я поправлю
оффсет и нужно считать от 0х7С00..

Добавлено через 44 секунды
сбросьте сюда первый сектор вашего диска (таблицу разделов)

Добавлено через 5 минут
если nasm не может пушить 2 аргумента в одной строке, то нужно:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    mov   ax, word[$$+0x01c6]
    push  0         ;// StartLBA Hight
    push  0
    push  0 
    push  ax        ;// StartLBA Low
    push  0         ;// Buffer Segment
    push  0x7F00    ;// Buffer Offset (приёмный буф, измените на свой)
    push  1         ;// Sector Counter (сколько секторов читать)
    push  16        ;// Sizeof Packet
 
    mov ah, 42h     ;// функция 42h = чтение секторов в память
    xor dh, dh
    mov si, sp
    int 13h
    add sp,16
 
    jc .rderror
    xor ax, ax
    mov al, dl
    push ax
0
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 853
25.10.2025, 16:46
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
VBR всегда находится на секторе 0.
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
С жесткого диска, а именно с vhd. Внутри находится 2 раздела: на 33 мб, FAT32 и с моим VBR и обычный раздел NTFS на 49,96 гб.
Вы противоречия не находите? У вас в 0 секторе MBR находится, но никак не VBR. Покажите дамп таблицы разделов, можно скрином.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
25.10.2025, 19:57
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
Как я сделаю отладку на QEMU?
Гуглите.
Но на Bochs это сделать проще. Запускаете bochs.exe с параметром -debugger, а в код добавляете "магический" breakpoint xchg bx,bx. После старта происходит остановка в этом месте.
Список команд отладчика Bochs см. тут: https://bochs.sourceforge.io/d... ugger.html
0
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
25.10.2025, 20:52  [ТС]
Цитата Сообщение от Argogo Посмотреть сообщение
Вы противоречия не находите? У вас в 0 секторе MBR находится, но никак не VBR. Покажите дамп таблицы разделов, можно скрином.
Сектор 0 это тот, который грузится через MBR, а 1 сектор я гружу сам
Миниатюры
Как прочитать диск с помощью int 13h  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.10.2025, 20:52
Помогаю со студенческими работами здесь

Как проверить поддержку расширенного режима работы с int 13h из-под Windows?
Всем привет. Необходимо из-под Windows (включая x64) проверить - поддерживает ли BIOS'овский int...

Чтение диска (int 13h ah=02h) - как определить входные параметры?
Добрый день. Я читаю флоппи диск прерыванием 13h AH=2 есть исходный код. Вопрос- какой там алгоритм...

Функция 48h int 13h
Расскажите, пожалуйста, про функцию 48h прерывания 13h. Где про Int 13h находил, там про такую...

DOS виснет на int 13h при чтении MBR жесткого диска
читаю MBR жесткого диска, досю гружу с флешки, как доходит до инт 13 - встает. masm .model small...

Будут ли работать функции прерывания int 13h с виртуальным флоппи диском
Все привет) Меня интересует будут ли работать функции прерывания int 13h с виртуальным флоппи...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru