Я новичок в разработке операционных систем, и мне любопытна проблема, с которой я столкнулся при разработке собственного загрузчика. Моя операционная система будет написана на ассемблере и будет работать в 16-битном реальном режиме.
Я знаю, что такое стек, и у меня сложилось впечатление, что он растет вниз в память. Поправьте меня, если я ошибаюсь. Я знаю, как загрузить базовое ядро в память с дискеты, и не думаю, что это проблема.
Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, где разместить стек и загрузить свое ядро в память. Я пытался создать свой стек таким образом, и у меня возникли проблемы:
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
Я загружаю свое ядро в 0x1000:0x0000
. Когда я PUSH, а затем POP, регистры volatile регистрируются в моей функции print
, мое ядро просто зависает второй раз, когда я делаю call print
. Это моя функция print
:
print:
push ax
push bx
push cx
mov al, [si]
cmp al, 0
je p_Done
cmp al, 9
je p_Tab
mov ah, 0xE
int 0x10
cmp al, 10
je p_NewLine
p_Return:
inc si
jmp print
p_Tab:
xor cx, cx
p_Tab_Repeat:
cmp cx, 8
je p_Return
mov ah, 0xE
mov al, " "
int 0x10
inc cx
jmp p_Tab_Repeat
p_NewLine:
xor bx, bx
mov ah, 0x3
int 0x10
mov dl, 0x00
mov ah, 0x2
int 0x10
jmp p_Return
p_Done:
pop cx
pop bx
pop ax
ret
Это строки, которые я хочу отобразить:
db "Kernel successfully loaded!", 10, 0
db 9, "Lmao, just a tab test!", 10, 0
Это вывод, который я получаю при запуске моего ядра (_
— это курсор):
Kernel successfully loaded!
_
Он успешно печатает первую строку, но зависает при печати второй. Если я удаляю операторы PUSH и POP, все работает нормально. Почему мое ядро зависает, когда я пытаюсь сохранить и восстановить регистры в моей функции print
? Где я должен разместить свой стек и где я должен загрузить свое ядро?