Хай Хабр! Это серия статей по написанию моей ОС с нуля. Я лютый фанат ретропрограммирования, поэтому я мгновенно забуду про существование  EDК. Просьба не писать комменты по типу "BIOS давно устарела где UEFI?". Пишу это просто чтобы было, что почитать вечером и порелаксить. Спасибо. Если  вы не владеете языком ассемблера, то можете испытать сложности в понимании происходящего. Пользуюсь я ассемблером FASM При включении ПК, процессор загружает в ОЗУ БИОС, она (БИОС) в свою очередь считывает носители на наличие загрузочной сигнатуры - слова 0х55АА по смещению 0x1FE. Если она (сигнатура) присутствует, то первые 512 байт с носителя загружается в ОЗУ по адресу 0х7С00 и БИОС передает управление этому коду. Напишем загрузчик, который очистит экран и напечатает "Привет, мир!": Итак, запускаем это чудо в qemu и видим: Ура! Всё работает. Но я называю это "Загрузчик", несмотря на то, что он ничего не загружает. Нехорошо. Нам нужно также избавится от ограничения в 512 байт. в такой маленький обьем мало-ли что уместится. Итак, нам нужно избавиться от ограничения в 512 байт. для этого, как вариант, можно написать весь интересующий нас код отдельно, а потом просто подгрузить его. Да, для этого и существуют загрузчики. Напишем загрузчик, который будет загружать остальной код с диска в ОЗУ по адресу 0х7Е00(или же 0х7С00+512):   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;                                                              ;; ;; Copyright (C) HexOS author 2019-2022. All rights reserved.   ;; ;; Distributed under terms of the GNU General Public License    ;; ;;                                                              ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; format binary as "sec" org 7E00h start: use16 ; header zone jmp second_entry nop ; import zone include "second.inc" ; executable zone second_entry: cls ;printsz msg0 mov ah, 02h mov al, 08h mov cx, 0012h; 0012h is correct ; dl was not modified mov bx, 8100h movs es, 0000h int 13h jc err0 mov sp, 810h movs ds, 8100h jmp 0000:8100h err0: ; construct BSOD stylish cls MOV AH, 06h XOR AL, AL XOR CX, CX MOV DX, 184Fh MOV BH, 17h INT 10h ; print data printsz bsod0 jmp endall endall: cli hlt jmp $-2 ; data zone msg0 db "HexOS Second-stage Bootloader v2.2.1 by Ivan Chetchasov", newline db "LOG: Loading HAT16 filetable", newline, 00h bsod0: db newline db newline db "             ((((((", newline db "           ((::::::(   ERROR OCCURRED", newline db "         ((:::::::(    At position:  00007E32h", newline db "        (:::::::((", newline db "        (::::::(       Reason: cannot load kernel", newline db " :::::: (:::::(        Maybe your disk is corrupted", newline db " :::::: (:::::(        So try to re-install system", newline db " :::::: (:::::(        Or append file 'System/kernel.hex'", newline db "        (:::::(        To your disk with other PC", newline db "        (:::::(        (be careful, maybe virus killed", newline db "        (:::::(        your PC, don`t infect other one!)", newline db " :::::: (::::::(    ", newline db " :::::: (:::::::((  ", newline db " ::::::  ((:::::::( ", newline db "           ((::::::(", newline db "             ((((((", newline db newline db "Errcode: 0000000Dh Errname: ERROR_CANNOT_LOAD_KERNEL", newline, 00h ; filler times 200h*16-1+start-$ db 00h ; magic db EOF    при запуске в qemu, мы видим во-такую букву "Х": Думаю, на этом пока все. Спасибо за внимание! П.Ы.: Принимаю любые предложения по развитию проекта в лс Хабра Ссылки: HexOS-GitHub Следующая часть  HUSTON WE HAVE A PROBLEM