BIOS загружает компьютер с жесткого диска (или дисковода гибких дисков), читая первый сектор (512 байт) каждого загрузочного устройства и проверяя определенный набор байтов сигнатуры. Если эти байты найдены, 512-байтовый сектор копируется в оперативную память (в определенной позиции), и BIOS переходит к его запуску.
Кроме байтов подписи, 446 байтов в секторе доступны для использования в качестве загрузочной программы, но загрузочная программа должна полностью соответствовать этому сектору! Поскольку 446 байт не очень велики, вам придется делать вызовы BIOS, чтобы скопировать другие сектора с жесткого диска (или дисковода гибких дисков, или чего-либо еще) в ОЗУ, чтобы запустить их.
Как только вы загрузите достаточно памяти для запуска вашей программы, перейдите к ней, и все готово.
Так операционная система буквально «подтягивается к собственной загрузке»
См. http://en.wikipedia.org/wiki/Master_boot_record
Теперь нет причины, по которой вы не могли бы написать загрузочный код на C или C ++ (или почти на любом другом), за исключением того, что с помощью ассемблера вы точно знаете, какой код будет сгенерирован, и в BIOS легко выполнять вызовы.
Я бы предложил вам записать 512-байтовый диск в ram-копир, который загружает вашу программу с диска в ram, а затем переходит на начальный адрес вашей программы. Затем вы можете написать свою программу на любом языке, который вы хотите. Имейте в виду, что когда ваш загрузочный код начинает работать, эти 512 байтов - единственное, на что вы можете рассчитывать, как в оперативной памяти. (Ну, BIOS там, вы можете делать вызовы BIOS. BIOS также поместит некоторую системную информацию в определенные места в оперативной памяти ...) Если вы хотите вызывать любые написанные вами функции, которые находятся за пределами этого сектора, вы должны загрузить их в оперативную память самостоятельно.
Кроме того, самый простой способ проверить ваш код, вероятно, будет поместить его на дискету и загрузить с него.
Чтобы ответить на исходный вопрос, вы могли бы где-нибудь сохранить резервную копию старой MBR, а ваша новая MBR могла бы загрузить вашу функцию в оперативную память, запустить ее, затем загрузить исходную MBR и запустить ее, что позволит окнам продолжить загрузку.
Кроме того, Майкл Барр прав, получение того, что вы хотите сделать, станет кошмаром.
В ответ на ваш комментарий о том, как на самом деле записать это на жесткий диск, есть несколько программ «сырой записи», которые можно копировать в сектор на диске. Кроме того, вы можете просто загрузиться с live linux Linux и использовать dd для записи ваших данных в выбранный вами сектор на блочном устройстве по вашему выбору. - Просто, как пирог этой части.