1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Чтение с жёсткого диска

Тема в разделе "WASM.OS.DEVEL", создана пользователем svas, 28 май 2007.

  1. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    Нужно написать программу.
    Засовываешь дискету, включаешь компьютер и показывается сколько у тебя разделов на жёстком диске и какие.
    Не могу считать с жёсткого диска.
    Хочу считать МБР, но постоянно возвращается ошибка

    mov dl, DISK
    mov dh, 0
    mov ch, 0
    mov cl, 1
    mov ax, 0x290
    mov es, ax
    mov bx, 0
    mov al, 1
    mov ah, 0x02
    int 0x13
    jc _read_error

    В dl что только не совал. (DISK - константа). Заношу туда 0 - с дискеты читается нормально, заношу что-нибудь другое - ошибка. Как считать МБР с жёсткого?
    Кстати, тестировал на VMware. Может из-за этого?
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    если у тебя винт один, вероятнее всего его номер будет 80h
    в любом случае, можешь в цикле последовательно перебирать номера от 80h до FFh
     
  3. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Кури описание 13 инта.
    Код (Text):
    1. 02H Читать секторы
    2.      Вход: DL = номер диска (0=диск A...; 80H=тв.диск 0; 81H=тв.диск 1)
    3.            DH = номер головки чтения/записи
    4.            CH = номер дорожки (цилиндра)(0-n) ◄═╗
    5.            CL = номер сектора (1-n) ◄═══════════╩══ См. замечание ниже.
    6.            AL = число секторов (в сумме не больше чем один цилиндр)
    7.            ES:BX => адрес буфера вызывающей программы
    8.            0:0078 => Таблица параметров дискеты (для гибких дисков)
    9.            0:0104 => Таблица параметров тв.диска (для твердых дисков)
    10.    Выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
    11.           ES:BX буфер содержит данные, прочитанные с диска
    12.  
    13.           Замечание: на сектор и цилиндр отводится соответственно 6 и 10 бит:
    14.                  1 1 1 1 1 1
    15.                 ╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
    16.             CX: ║c c c c c c c c C c S s s s s s║
    17.                 ╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜
    18.                                  ╚═╩═══► исп. как старшие биты номера цилиндра
    19.  
    20. ╔══════════════════════════════════════════════════════════════════════════════╗
    21. ║                      Таблица параметров твердого диска               еще  ↓  ║
    22. ╚══════════════════════════════════════════════════════════════════════════════╝
    23. Эта 16-байтовая структура находится по адресу вектора прерывания INT 41H
    24. 4-байтовый адрес в 0:0104). Параметры для второго твердого диска (если он есть)
    25. находятся по адресу вектора INT 46H. Эти таблицы задают некоторые важные пере-
    26. менные для операций с твердыми дисками.
    27.  
    28.  ■XT■  Переключатели на плате контроллера задают один из четырех типов устройств
    29.        для каждого твердого диска. Во время загрузки BIOS устанавливает INT 41H
    30.        и INT 46H в соответствии с состоянием этих переключателей.
    31.  
    32.  ▌AT▐  Векторы INT 41H и INT 46H устанавливаются согласно значению "Тип твердого
    33.        диска" (это переменная CMOS-памяти , загружаемая программой "Setup").
    34.  
    35. Смещ.  Длина Содержимое
    36. ▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
    37.            ┌───────┐
    38. +0      2  │       │ максимальное число цилиндров
    39.            ├───┼───┘
    40. +2      1  │   │     максимальное число головок
    41.            ├───┴───┐
    42. +3      2  │       │ starting reduced-write current cylinder
    43.            ├───┴───┤
    44. +5      2  │       │ starting write precompensation cylinder
    45.            ├───┼───┘
    46. +7      1  │   │     maximum ECC data burst length
    47.            ├───┤                          ╔═ bit 7: disable disk-access retries
    48. +8      1  │   │     drive step options ◄═╣  bit 6: disable ECC retries
    49.            ├───┤                          ╚═ bits 2-0: drive option
    50. +9      1  │   │     стандартное значение таймаута
    51.            ├───┤
    52. +0aH    1  │   │     значение таймаута для форматирования
    53.            ├───┤
    54. +0bH    1  │   │     значение таймаута для контроля устройства
    55.             ├───┴───┬───────┐
    56.  +0cH    4  │       │       │ (резерв)
    57.             └───┴───┴───┴───┘
    58. ────────────────────────────────────────────────────────────────────────────────
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    тема слегка не по разделу=\
    80h,81h, ...
     
  5. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    А если не переходить в защищённый режим, удасться ли считать информацию о всех разделах (расширенных)?
    Поместиться ли номер цилиндра в 10 бит?
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    CHS адресация ограничена 64 * 1024 * 256 * 512 = 8Gb
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А причем тут защищенный режим? Ф-ии BIOS доступны только в реальном режиме. Правда, есть какое-то 32битное расширение ф-ий BIOS, но не все BIOSы его поддерживают. Можно еще взглянуть на код ошибки (он хранится в AH). Помимо VMWare можно использовать Bochs -- у него есть возможность отладки. И еще потестить на реальной машине, загрузившись с дискеты.

    Ну, все-таки 63 :).
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    да, забыл, что с единицы начинается
     
  9. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    Так значит не получится у меня в реальном режиме прочитать информацию о всех расширеных разделах, если жёсткий больше 8-ми ГБ?
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    svas
    напрямую с протами работай, там адресовать 256 Тбайт можешь ;)
     
  11. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    А как? Мне нужна вся информация о разделах. Может поможете?
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    http://www.wasm.ru/article.php?article=atazen01
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    На современных компьютерах получится - их BIOS поддерживает функции 4xh прерывания 13h. Через порты можно работать в любом режиме, но это немного сложнее.