Написал простенький загрузчик на тасме, читающий диск в CHS-mode. Работает нормально. Code (Text): xor ax,ax mov ss,ax mov sp,6c00h sti push ax pop es push ax pop ds cld push 1000h mov si,7c23h mov di,1000h mov cx,01ddh rep movsb ret ;---------------------------------------- ;0000:1000h mov bx,7c00h mov ax, 0201h mov dl, 80h mov dh, 01h ; mov ch,0 ;частный случай загрузки с 63-го сектора mov cl,1 ; int 13h push 7c00h ret ;---------------------------------------- end start А вот, тот же загрузчик, но для в LBA-mode. Не работает. Комп просто виснет.. Не скажете, в чем дело? Code (Text): xor ax,ax mov ss,ax mov sp,6c00h sti push ax pop es push ax pop ds cld push 1000h mov si,7c23h mov di,1000h mov cx,01eah rep movsb ret ;---------------------------------------- ;0000:1000h mov ah,42h mov dl,0 mov si,1014h int 13h push 7c00h ret dap: packet_size db 10h ; размер пакета 10h байт reserved db 00h ; заначка для будущих расширений n_sec db 01h ; читаем один сектор buf_seg db 0 ; сюда будет занесен сегмент буфера-приемника buf_off dw 7c00h ; смещение буфера-приемника x_sec dd 63 ; сюда будет занесен номер сектора для чтения dd 0 ;---------------------------------------- end start ; конец программы
Неправильно формируется структура данных для LBA-чтения. Правильно так: Code (Text): packet_size db 10h reserved db 0 n_sec dw 1 buf_off dw 7C00h buf_seg dw 0 x_sec dd 63 dd 0
Все равно не пашет(( diamond, ну почему же неправильно? размер пакета указан: 10h. А у вас получается: db+db+dw+dw+dw+dd+dd=1Eh байт! Или я чего-то недопонимаю?
Все равно не пашет(( diamond, ну почему же неправильно? размер пакета указан: 10h. А у вас получается: db+db+dw+dw+dw+dd+dd=1Eh байт(даже если последний dd не учитывать, то все равно, 16h)! Или я чего-то недопонимаю?
З.Ы. формат структуры данных для функции int 13h\42h брал из википедии http://en.wikipedia.org/wiki/INT_13
Кто так пишет! Code (Text): mov si,1014h int 13h Научись использовать символические ссылки. Кроме того поддержку EDD и возможность использовать функции чтения/записи нужно проверять обязательно, причем в отдельности для каждого используемого диска. Также нужно проверять результат выполнения функции.
Дело в том, что код разбит на 2 части, каждая из которых загружается по разным смещениям(7С00h и 1000h сщоотв.). Поэтому ссылки использовать нельзя.
Code (Text): xor ax,ax mov ss,ax mov sp,6c00h sti push ax pop es push ax pop ds cld push 1000h mov si,7c23h mov di,1000h mov cx,01eah rep movsb ret Здесь правильнее использовать дальнюю передачу управления (retf): Code (Text): push ax push di rep movsb retf
Почему-то когда я меняю номер сектора для чтения с 63 на 09318480h опять ничего не работает(( Может быть нужно перейти в защищенный режим, ведь адрес 09318480h 32-разрядный... Какие есть мнения?
fasm: Code (Text): relpart equ 1000h org 7C00h cld xor ax,ax mov ds,ax mov si,relpartbase mov es,ax mov di,relpart cli mov ss,ax mov sp,di sti push ax push di mov cx,(relpartsize+1)/2 rep movsw retf align 2 relpartbase: org relpart ... relpartsize=$-$$ ; -relpart org relpartbase+relpartsize times 7DBEh-$ nop ; или просто rb 7DBEh-$
Ты сначала жесткий диск переведи в защищенный режим )) А если бы ты полностью задействовал 64-разрядный номер сектора, тогда вообще жесткий диск нужно было переводить в long mode ))
Вероятно, 63 - это начало первого раздела, и он primary, а 9318480h - это начало какого-то другого раздела, который вовсе даже не primary, а лежит где-то в extended-разделе. Вероятно, ошибка не в коде из MBR как таковом, а в том, что этот код передаёт управление бутсектору логического тома на extended разделе, который в таком случае не обязан правильно работать. В частности, на FAT-разделе поле по смещению +1C, число скрытых секторов, для томов на extended-разделе указывает не абсолютный номер сектора, а относительно начала extended-раздела. Поскольку обычно FAT-загрузчик использует значение этого поля как базу при чтении остальных данных, то прочтёт он не то, что запросто может привести к повисанию.
А если серьезно, то у тебя на диске сектора с этим номером может не быть вообще (каков объем диска?) или его содержимое таково, что тебе кажется, что ты не смог его прочесть. Как ты вообще определяешь, что ничего не работает? Загружаешь неизвестно что и передаешь туда управление?
Откуда вообще взято значение 9318480h? Из таблицы разделов? Тогда это может быть EBR, extended boot record, которая может вообще не содержать кода. Каким-то образом определено начало логического диска? Тогда могут быть проблемы, описанные в #13. Ещё каким-то образом?
Сектор с таким номером присутствует ТОЧНО. Проверял в WinHEX. Действительно, это есть начало непримари раздела. Вот только код этот работает когда ось еще не загружена, а процессор вообще не знает, что такое раздел и жесткий диск вообще, и функции int 13h это тож мало волнует(если верить КК)
Бут-сектор тома обычно находится сразу после EPR, проверь WinHex'ом и попробуй загрузить сектор 9318481h.
Читал, что переход в защищенный режим осуществляется через int 2fh... Не дос ли это функция и нет ли у кого примера такого перехода?