С Новым годом! Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/16: Рейтинг темы: голосов - 16, средняя оценка - 4.50
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919
TASM

Чтение сектора CD-ROM функцией BIOS (ah=42h int 13h)

31.03.2021, 00:15. Показов 3679. Ответов 7

Студворк — интернет-сервис помощи студентам
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
.MODEL SMALL
.STACK 5000h
.DATA
    debug_found  db "debug found!", 13, 10, 0
    drive_not_ready db "Drive not ready!", 0
    bootdev     db 4    ; Boot device number
    buffer db 10240 dup(0)     ; Disk buffer begins
   
.CODE
 
START:
 
    mov ax, @DATA
    mov ds, ax
 
    mov   ch, 00h   ; номер дорожки
    mov   cl, 00h   ; номер сектора
 
    mov   dh, 00h   ; номер головки  (стороны диска)
    mov   dl, 00h   ; номер НГМД
 
    ; Готовим адрес буфера в ES:BX
    mov   ax, ds
    mov   es, ax
    mov   bx, OFFSET buffer
 
    ; Готовим код функции
    mov   ah, 02h   ; код функции - чтение сектора
    mov   al, 01h   ; читаем 1 сектор
 
    stc
    ; Вызываем прерывание
    int   13h
 
    jnc search_dir          ; If read went OK, skip ahead
 
    mov si, offset drive_not_ready      
    call print_string
 
    mov ah,4ch
    int 21h
 
search_dir:
    mov si, offset debug_found
    call print_string
 
    mov ah,4ch
    int 21h
 
print_string:               ; Output string in SI to screen
 
    mov ah, 0Eh         ; int 10h teletype function
 
.repeat:
    lodsb               ; Get char from string
    cmp al, 0
    je .done            ; If char is zero, end of string
    int 10h             ; Otherwise, print it
    jmp short .repeat
 
.done:
    
    ret
 
END START
Написал небольшую програмку читает 1 сектор с диска, у меня 4 жестких диска, 1 сд диск, 1 виртуальный привод, какой не указываю для чтения выдает в любом случае Drive not ready, то есть у меня вопрос- как прочитать сектор с диска. Я работаю под Win32 если что.

Добавлено через 1 час 45 минут
Я разобрался в чем проблема dl для жесткого диска должен быть 80h и больше для других hdd, для CD/DVD должен быть 0E0h и больше для следующих приводов как пишет википедия.

Я сижу под WinME там можно к дискам обращаться. Попробывал mov dl,0 дисковод заработал, попробывал жесткий диск mov dl, 80h тоже программа работает выдает debug found! то есть нормально все, но мне надо обратиться к CD диску, я написал mov dl, 0E0h и никакого результата, хотя привод есть и диск в него вставлен. Как мне обратиться к CD диску?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.03.2021, 00:15
Ответы с готовыми решениями:

Чтение DVD функцией 42h прерыванием 13h
Никак не могу разобраться с функцией 42h прерывания 13h. Уже код готовый списывал - всё равно никак. Помогите пожалуйста. Это мне нужно...

Одолеть 42h int 13h
Прошу форумчан указать на ошибку! Пытаюсь оседлать загрузчик с флешки и камнем преткновения стала функция 42h int 13h. Ну никак не могу...

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

7
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.03.2021, 10:01
Цитата Сообщение от kurlyak Посмотреть сообщение
Я сижу под WinME там можно к дискам обращаться.

Не по теме:

Windows 10 тоже умеет.
Открываете том CreateFile()ом и читаете ReadFile()ами, как любой файл.

1
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919
31.03.2021, 10:27  [ТС]
Я хочу потестить обращение к диску через int 13h
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
31.03.2021, 10:51
Цитата Сообщение от kurlyak Посмотреть сообщение
хочу потестить обращение к диску через int 13h
Насколько понимаю, это Вы сможете сделать только из-под ДОСа. Загрузите чистый ДОС и тестите себе...
1
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919
31.03.2021, 12:14  [ТС]
Вобщим, зачем мне тестить INT13 я взял загрузчик NetBSD с CD rom, делаю себе такой код, и вот там есть INT 13h ah= 0x42 я наконец созрел как прочитать CD rom, но мой загрузчик не работает. Вот код я давно на ассемблере не программировал - пожалуйста посмотрите синтаксические ошибки. Не знаю я вобщим созревал долго может тему надо переместить или новую открыть потому что этот код на nasm, и выдает сообщение Error Reading.

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
BITS 16
 
start:
    mov ax, 07C0h       ; Set up 4K stack space after this bootloader
    add ax, 288     ; (4096 + 512) / 16 bytes per paragraph
    mov ss, ax
    mov sp, 4096
 
    mov ax, 07C0h       ; Set data segment to where we're loaded
    mov ds, ax
 
    mov si, text_string ; Put string position into SI
    call print_string   ; Call our string-printing routine
 
    call read_sectors
 
    mov si, text_string3    ; Put string position into SI
    call print_string   ; Call our string-printing routine
 
    jmp $           ; Jump here - infinite loop!
 
    text_string db 'Loading OK!', 13, 10, 0
    text_string2 db 'Error Reading', 13, 10, 0
    text_string3 db 'Reading OK', 13, 10, 0
 
edd_packet:
    edd_len:    dw  16
    edd_nsecs:  dw  0   ;   /* Number of sectors to transfer */
    edd_offset: dw  0
    edd_segment:dw  0
    edd_lba:    dq  0
    
    boot_drive  db  0
    
read_sectors:
    mov ax, 16  ;   start at sector #define VD_LBA      16  /* LBA of Volume Descriptor (VD) */
    mov dh, 01h ;       /* Number of sectors to read */
    mov bx, buffer 
    pusha
    mov [edd_lba], ax;
    shr bx, 04h     ; Convert buffer addr to seg:0 */
    mov [edd_segment], bx 
    mov [edd_nsecs], dh
    mov byte [edd_nsecs], 32;   /* Read 32 sectors - 64k bytes */
    mov dl, byte [boot_drive] 
    mov si, edd_packet
    mov ah, 0x42 
    push dx ;       /* bios shouldn't kill %dh, but ... */
    int 13h
    pop dx      ;   /* ... better safe than sorry! */
    jc  read_fail
    
    popa
    ret
 
read_fail:
 
    mov si, text_string2    ; Put string position into SI
    call print_string   ; Call our string-printing routine
 
    ret
 
print_string:           ; Routine: output string in SI to screen
    mov ah, 0Eh     ; int 10h 'print char' function
 
.repeat:
    lodsb           ; Get character from string
    cmp al, 0
    je .done        ; If char is zero, end of string
    int 10h         ; Otherwise, print it
    jmp .repeat
 
.done:
    ret
 
 
    times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
    dw 0xAA55       ; The standard PC boot signature
 
buffer:             ; Disk buffer begins (4k after this, stack starts)
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.03.2021, 15:06
Цитата Сообщение от kurlyak Посмотреть сообщение
этот код на nasm, и выдает сообщение Error Reading.
Таким образом, синтаксических ошибок нет.
1
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919
31.03.2021, 17:30  [ТС]
Лучший ответ Сообщение было отмечено politoto как решение

Решение

Я компилирую при помощи nasm под Win32, потом беру этот bin, делаю образ ISO при помощи cdimage.exe Микрософтовской програмы. У меня бывает я ставлю:

Assembler
1
boot_drive: db  080h
или еще

Assembler
1
boot_drive: db  0E0h
то работает то не работает. Но когда 0 стоит это же вроде гибкий диск. А так как я загружаюсь с CD то надо другое значение ставить. Я ставлю оно то работает то не работает. Иногда бывает выводит Reading OK. Но в основном Error Reading - это какой то баг.

Добавлено через 48 минут
Кажись заработало, я правильно буфер установил

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
read_sectors:
    
    mov bx, buffer 
    pusha
    mov [edd_segment], ds 
    mov [edd_offset], bx 
    mov si, edd_packet
    mov ah, 042h 
    int 13h
    jc  read_fail
 
    popa
    ret
и диск указал cd rom

Assembler
1
boot_drive: db  0E0h
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.03.2021, 17:36
kurlyak, и сразу можно не прекращать попытку чтения.
В случае ошибки выдать сообщение и повторить попытку 1-2 раза.
Для механических сменных носителей ошибки чтения - это нормально.
Вдруг пылинка пролетала как раз в момент чтения над нужным сектором?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.03.2021, 17:36
Помогаю со студенческими работами здесь

Приведите пример применения команды для BIOS INT, выполняющей чтение одного сектора
Добрый день! Помогите, пожалуйста, с задачей в tasm.. Напишите команды для BIOS INT 13H, выполняющие чтение одного сектора, в...

Реализация функции 42h прерывания 13h на FASM
Реализация функции 42h прерывания 13h на FASM. Как это реализовать? Номер устройства при загрузке в регистре dl. Я думаю что так: ...

Напишите команды для BIOS INT 13h, выполняющие запись трех секторов из области OUTDISK на диск B, головку 0, дорожку 8,
Нужна помощь в написании программы. Задание: Напишите команды для BIOS INT 13h, выполняющие запись трех секторов из области OUTDISK на...

Int 13h и пародия на ОС
Здравствуйте! Решил написать ОС с по-настоящему красивыми обоями. Имеется первичный загрузчик loader0.asm: org 0x7C00 section...

Форматирование дискеты(1.44) int 13h
Здравствуйте! Есть задание: Форматировать дорожку № 7 нижней поверхности дисковода с размером секторов 256. Все необходимые для...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru