Доброго времени суток. Столкнулся со следующей проблемой - пытаюсь записать в загрузочный сектор следующий код: Code (Text): use16 org 0x7C00 boot: jmp near start bpbOEM db 'SIMPLE' bpbSectSize dw 512 bpbClustSize db 1 bpbReservedSec dw 1 bpbFats db 2 bpbRootSize dw 224 bpbTotalSect dw 2880 bpbMedia db 0xF0 bpbFatSize dw 9 bpbTrackSect dw 18 bpbHeads dw 2 bpbHiddenSect dd 0 bpbLargeSect dd 0 bpbDriveNo db 0 bpbReserved db 0 bpbSignature db 41 bpbID dd 1 bpbVolumeLabel db 'BOOT DISK' bpbFileSystem db 'FAT12 ' start: cli xor ax, ax mov ds, ax mov es, ax mov ss, ax mov sp, 0x7C00 mov [bpbDriveNo], dl sti mov ax, 3 int 0x10 lea bp, message mov ax, 0x1301 mov bx, 7 mov cx, 7 mov dx, 0x0102 int 0x10 message db 'Hello!!' rb boot + 510 - $ dw 0xAA55 После перезагрузки получаю: FATAL: No bootable medium found! System halted. Юзаю VirtualBox, компилю в фасме Кто сталкивался/занимался подобным - подскажите пожалуйста в чем может быть беда. Благодарю за внимание.
sideX Вот на VirualBox указанная проблема возникает вообще по непонятным причинам. Я помню как-то в своей проге в \SessionManager\BootExecute\ значение добавил и получал эту ошибку. Т.е. это может и не быть связано с записью в MBR.
Насколько понял, код у вас записан в образ дискеты в качестве бутлоадера? Меня смущает "пытаюсь". Проверьте на том же bochs'е работоспособность поделки (кстати, я юзал его, ибо он самый удобный в плане отладки).
Pavia, тут конечно косяк (сообщение то исполняться будет), но не думаю, что это бы вызвало такую ошибку - просто halt был бы, скорее всего, после исполнения текста.
Вы ничего не перепутали? Это код не для MBR, а для BootSector, а это 2 большие разницы. При старте с винта BIOS не нашел таблицу разделов и посчитал MBR битым.
хорошо, тогда каким образом мне записаться, чтобы не затронуть таблицу разделов? подтолкните немножко пожалуйста
лучшее так: с учетом, что флоппи почти ниукого нет, а нада писать ось, которая будет самая лучшая и т.д.: бин, который переименован в img, открываем с помосчью UltraIso и делаем загрузочный диск, указав соответствуюсчий файл в качестве загрузочного. что делает ультра и как она записывает даже не знаю точно. надо бы разобраться, инфы на русском нет по этому вопросу. теперь можно кодить сколько влезет, в одном файле - получается, что управление на ядро передавать не надо -биос будет читать подряд. нужно есчо на всякий случай поставить сигнатуру в 1999-2000 байты. вроде так, у меня все работало в виртуал боксе задавал вопрос - нужно ли выравнивать весь остальной код по 2000 байт, ответа так и не получил в качестве экперимента поместил код во второй сектор ( на си-ди сектора по 2000 байт )
Нет 0xAA55. В байтовом представлении должно быть 55 AA. 55 по младшим адресам (у тебя в коде кстати правильно написано). Для начала код переписать надо. В MBR нету BPB к примеру.
cppasm По идее если вы запишите 510 ноликов и потом сигнатуру то BIOS'у этого должно быть достаточно. PartitionTable он не проверяет, он ничего не проверяет а делает это сам загрузчик. Если это MBR. Если это BOOT, там еще что-то (не помню). Залейте ваши 512 байт и посмотрим что там. По идее file <test.mbr> должен сказать что там.
Спасибо всем кто откликнулся, за ответы. Удалось продвинуться дальше. Теперь новая беда - при замене первого сектора на Win7 после возврата управления система падает в бсод. сразу же после показа логотипа. по всей вероятности порчу таблицу разделов. как такое победить? буду рад любым советам/предложениям еще при отрисовке меню не могу корректно подгрузить символы для знакогенератора (ну это второстепенная проблема) буду весьма признателен за подмогу
Это по идее, и нормальные BIOSы так и делают. Но есть BIOSы которые проверяют таблицу разделов, и если у одного из разделов тип отличается от 0x00 или 0x80 считают MBR не валидным и управление на него не передают. После возврата управления куда? И какой BSOD при работе MBR? Здесь данные как код выполняются - про это писали уже выше.
собственно, сохраняю оригинал в другой сектор, переписываю 1й своим кодом. при загрузке показываю меню. один из пунктов - вернуть оригинальный загрузчик. переписываю 1й сектор оригиналом и джамп на 0000:7C00. в ХР работает, в 7 падает после показа логотипа. после перезагрузки винда предлагает выяснить проблему. жму туда, винда чтото сканирует и выдает что таблица разделов негодная. какой бсод - не знаю где посмотреть, т.к. после показа сразу в ребут и все по кругу
вопрос с бсодом решен. как оказалось - причина была в кривизне рук) помогите теперь настроить знакогенератор?