Левша 21-ого века -
уместил собственное фото
в картинку 1х1 пиксел.
(народный Юмор)
BIOS и железнячники всю сложную работу уже сделали за нас. BIOS даже загрузку нашей первой программы сделала.
- Эй! А откуда ей знать где находится моя программа?
По договоренности - первая программа находится в одном и том же месте - первый сектор устройства хранения данных. Первые 512 байт жесткого диска, компакт-диска, флешки, дискеты и чего-нибудь еще.
Насколько нам известно - мы врятли сумеем стать Левшами 21-ого века и уместить в 512 байт целую программу. Зато это достаточно большая стартовая площадка. Конечно же согласно Википедии мы имеем не 512, а 440 байтов, но все равно - есть где разогнаться.
Наша программа (ОС) находится на диске (мы ее туда поместили) и, поскольку мы знаем где именно она там находится, то мы можем сделать следующее - Извлечь ее с диска, и запустить. Все это должно уместиться в 440 байт. При этом сама программа ОС может быть какой угодно по объему. Лишь бы мы могли ее извлечь с диска в оперативную память. При таких делах программа-ОС должна не иметь формата исполняемого файла а быть COM-файлом в терминологии MS-DOS. (Что бы не париться со всякими там форматами и делать все экономнее). Не стоит забывать, что мы можем пользоваться функциями из BIOS.
Сейчас я приведу код для вывода на экран одного символа и остановки процессора (halt). Почему только одного символа? А нам больше и не нужно - наш грузчик-загрузчик подал голос и остановился. Нажми на какую-нибудь кнопку и все! (А лучше - почитать описание комманды halt)
ASM CODE
xor bx, bx ; страница = 0
mov ah, 10h ; вывод символа
mov al, 5ah ; буковка Z
; лучше заполнение ax объединить в одну команду (4 bytes ==> 3 bytes)
mov cx, 0007h ; 7 раз
int 10h ; ВЫВОД!
halt ; Останов.
А теперь я приведу код для взятия первого сектора (MBR) и его запуска. Как бэ рекурсия? Да, это именно она!Код по проще (используя специально для этого предназначенную функцию BIOS)
ASM CODE
int 19h
Но, это не самоцель. Ведь мы хотим выдернуть произвольный участок с жесткого диска и лишь как пример мы взяли MBR.
ASM CODE
mov ah, 02h ; под-функция
mov al, 01h ; читать один сектор
xor cx, cx ; обнуляем cx - читать man @ int 13h
mov dx, 0080h ; dh = 00h, dl = 80h - первая головка, первый HDD
mov es, cx
mov bx, 7c00h
int 13h
Такой код считает первый сектор (и только один сектор) с первого жесткого диска и помещает его по аддрессу 0000:7c00h, куда его помещает и int 19h.
Остается лишь испытать его в действии.