ошибка в MBR

Тема в разделе "WASM.ASSEMBLER", создана пользователем FaNt0m, 1 авг 2008.

  1. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Написал простенький загрузчик на тасме, читающий диск в CHS-mode. Работает нормально.
    Код (Text):
    1.         xor ax,ax
    2.         mov ss,ax
    3.         mov sp,6c00h
    4.         sti
    5.         push ax
    6.         pop es
    7.         push ax
    8.         pop ds
    9.         cld
    10.         push 1000h
    11.         mov si,7c23h
    12.         mov di,1000h
    13.         mov cx,01ddh
    14.         rep movsb
    15.         ret
    16. ;----------------------------------------  
    17. ;0000:1000h    
    18.         mov bx,7c00h
    19.         mov ax, 0201h
    20.         mov dl, 80h
    21.        
    22.         mov dh, 01h  ;        
    23.         mov ch,0      ;частный случай загрузки с 63-го сектора
    24.         mov cl,1       ;
    25.        
    26.         int 13h
    27.         push 7c00h
    28.         ret
    29. ;----------------------------------------
    30.         end        start
    А вот, тот же загрузчик, но для в LBA-mode. Не работает. Комп просто виснет.. Не скажете, в чем дело?

    Код (Text):
    1. xor ax,ax
    2.         mov ss,ax
    3.         mov sp,6c00h
    4.         sti
    5.         push ax
    6.         pop es
    7.         push ax
    8.         pop ds
    9.         cld
    10.         push 1000h
    11.         mov si,7c23h
    12.         mov di,1000h
    13.         mov cx,01eah
    14.         rep movsb
    15.         ret
    16. ;----------------------------------------  
    17. ;0000:1000h    
    18.         mov ah,42h
    19.         mov dl,0
    20.         mov si,1014h          
    21.         int 13h
    22.         push 7c00h
    23.         ret
    24.        
    25.         dap:
    26. packet_size       db 10h      ; размер пакета 10h байт
    27. reserved    db 00h      ; заначка для будущих расширений
    28. n_sec              db 01h      ; читаем один сектор
    29. buf_seg     db  0        ; сюда будет занесен сегмент буфера-приемника
    30. buf_off                dw 7c00h  ; смещение буфера-приемника
    31. x_sec              dd 63       ; сюда будет занесен номер сектора для чтения
    32. dd 0
    33. ;----------------------------------------
    34.         end        start             ; конец программы
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Неправильно формируется структура данных для LBA-чтения. Правильно так:
    Код (Text):
    1. packet_size db 10h
    2. reserved    db 0
    3. n_sec       dw 1
    4. buf_off     dw 7C00h
    5. buf_seg     dw 0
    6. x_sec       dd 63
    7.            dd 0
     
  3. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Все равно не пашет((
    diamond, ну почему же неправильно? размер пакета указан: 10h. А у вас получается: db+db+dw+dw+dw+dd+dd=1Eh байт! Или я чего-то недопонимаю?
     
  4. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Все равно не пашет((
    diamond, ну почему же неправильно? размер пакета указан: 10h. А у вас получается: db+db+dw+dw+dw+dd+dd=1Eh байт(даже если последний dd не учитывать, то все равно, 16h)! Или я чего-то недопонимаю?
     
  5. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
  6. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Заработало!!! Проблема оказалась в моей невнимательности... Спасибо.
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Кто так пишет!
    Код (Text):
    1.         mov si,1014h          
    2.         int 13h
    Научись использовать символические ссылки. Кроме того поддержку EDD и возможность использовать функции чтения/записи нужно проверять обязательно, причем в отдельности для каждого используемого диска. Также нужно проверять результат выполнения функции.
     
  8. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Дело в том, что код разбит на 2 части, каждая из которых загружается по разным смещениям(7С00h и 1000h сщоотв.). Поэтому ссылки использовать нельзя.
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Код (Text):
    1.         xor ax,ax
    2.         mov ss,ax
    3.         mov sp,6c00h
    4.         sti
    5.         push ax
    6.         pop es
    7.         push ax
    8.         pop ds
    9.         cld
    10.         push 1000h
    11.         mov si,7c23h
    12.         mov di,1000h
    13.         mov cx,01eah
    14.         rep movsb
    15.         ret
    Здесь правильнее использовать дальнюю передачу управления (retf):
    Код (Text):
    1. push ax
    2. push di
    3. rep movsb
    4. retf
     
  10. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Почему-то когда я меняю номер сектора для чтения с 63 на 09318480h опять ничего не работает(( Может быть нужно перейти в защищенный режим, ведь адрес 09318480h 32-разрядный... Какие есть мнения?
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    fasm:
    Код (Text):
    1. relpart equ 1000h
    2.  
    3. org 7C00h
    4.  
    5. cld
    6. xor ax,ax
    7. mov ds,ax
    8. mov si,relpartbase
    9. mov es,ax
    10. mov di,relpart
    11. cli
    12. mov ss,ax
    13. mov sp,di
    14. sti
    15. push ax
    16. push di
    17. mov cx,(relpartsize+1)/2
    18. rep movsw
    19. retf
    20.  
    21. align 2
    22.  
    23. relpartbase: org relpart
    24. ...
    25. relpartsize=$-$$ ; -relpart
    26.  
    27. org relpartbase+relpartsize
    28. times 7DBEh-$ nop ; или просто rb 7DBEh-$
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ты сначала жесткий диск переведи в защищенный режим :))) А если бы ты полностью задействовал 64-разрядный номер сектора, тогда вообще жесткий диск нужно было переводить в long mode :)))
     
  13. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Вероятно, 63 - это начало первого раздела, и он primary, а 9318480h - это начало какого-то другого раздела, который вовсе даже не primary, а лежит где-то в extended-разделе. Вероятно, ошибка не в коде из MBR как таковом, а в том, что этот код передаёт управление бутсектору логического тома на extended разделе, который в таком случае не обязан правильно работать.

    В частности, на FAT-разделе поле по смещению +1C, число скрытых секторов, для томов на extended-разделе указывает не абсолютный номер сектора, а относительно начала extended-раздела. Поскольку обычно FAT-загрузчик использует значение этого поля как базу при чтении остальных данных, то прочтёт он не то, что запросто может привести к повисанию.
     
  14. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    А если серьезно, то у тебя на диске сектора с этим номером может не быть вообще (каков объем диска?) или его содержимое таково, что тебе кажется, что ты не смог его прочесть. Как ты вообще определяешь, что ничего не работает? Загружаешь неизвестно что и передаешь туда управление?
     
  15. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Ясно)) Спасибо.
     
  16. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Откуда вообще взято значение 9318480h? Из таблицы разделов? Тогда это может быть EBR, extended boot record, которая может вообще не содержать кода. Каким-то образом определено начало логического диска? Тогда могут быть проблемы, описанные в #13. Ещё каким-то образом?
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    diamond, откуда такая инфа? Как же я тогда гружу Винды из расширенного раздела?
     
  18. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Сектор с таким номером присутствует ТОЧНО. Проверял в WinHEX. Действительно, это есть начало непримари раздела. Вот только код этот работает когда ось еще не загружена, а процессор вообще не знает, что такое раздел и жесткий диск вообще, и функции int 13h это тож мало волнует(если верить КК)
     
  19. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Бут-сектор тома обычно находится сразу после EPR, проверь WinHex'ом и попробуй загрузить сектор 9318481h.
     
  20. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Читал, что переход в защищенный режим осуществляется через int 2fh... Не дос ли это функция и нет ли у кого примера такого перехода?