Недавно я попробовал свои силы на 16-битной сборке и подумал записать загрузчик с файлом ядра, чтобы сделать что-то похожее на операционную систему.Мой код загрузчика полностью проверен и загружается код ядра в память.Но как только он загружается, я не могу перейти к этому коду и выполнить его.Вот некоторые важные детали:
call load_dir ; Load the directory table into the memory
call search_kernel ; Search for Kernel Address (First Logical Cluster ) in the root directory
call load_fat ; Load file allocation table into the memory
call read_fat
Как видно из кода выше, первый каталог load_dory загружает полный каталог (13 секторов) в память.После загрузки search_kernel пытается найти файл с именем «KERNEL.BIN» и, если он найден, загружает слово со смещения 26 в топор (первый логический кластер).После этого код загружает жир (8 секторов, если быть точным) в память и начинает читать его (read_fat) и загружает данные в (буфер + 10752). До этого все было хорошо. Я проверил содержимое, и это был правильный код, расположенный по этому адресу.Теперь проблема приходит.После этого я написал заявление
mov bx,[buffer+10752]
push bx
ret
Это фактически должно технически обмануть регистр ip, чтобы загрузить желаемую инструкцию и выполнить ее.Код KERNEL.BIN:
BITS 16
jmp short main
main:
mov ah,0EH
mov al,'H'
int 10H
jmp $
Теперь это должно вывести символ H на экран (цель тестирования), но это не работает.Какую ошибку я сделал.Пожалуйста, помогите!
Относительно моих регистров сегментов:
За исключением регистра сегментов стека, все регистры сегментов загружаются одинаково.