Форум программистов, компьютерный форум, киберфорум
ОС на 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. Показов 3740. Ответов 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 / 4574 / 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
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru