2016-09-26 3 views
3

В настоящее время я пытаюсь написать крошечную ОС с нуля. К сожалению, на первом этапе я столкнулся с проблемой, которая сводит меня с ума. Я пишу следующий код в качестве моего загрузчика.Bochs не может загрузить файл img и загрузить его

.code16     #generate 16-bit code 
.text      #executable code location 
    .globl _start; 
_start:     #code entry point 
    . = _start + 510  #mov to 510th byte from 0 pos 
    .byte 0x55   #append boot signature 
    .byte 0xaa   #append boot signature 

В следующем шаге я скомпилировать его с помощью следующих команд:

as bootloader.s -o bootloader.o 
ld –Ttext 0x7c00 --oformat=binary bootloader.o –o bootloader.bin 

Затем я создаю файл IMG со следующими командами:

dd if=/dev/zero of=boot.img bs=512 count=2880 
dd if=bootloader.bin of=boot.img 

Наконец, когда я запускаю команду Bochs в терминале Бочс просто показал мне темное окно, и ничего не появилось. Что не так?

Кроме того, я попробовал следующий код в качестве загрузчика, но результат такой же, как и предыдущий.

.code16     #generate 16-bit code 
.text     #executable code location 
    .globl _start; 

_start:     #code entry point 

    #print letter 'H' onto the screen 
    movb $'H' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'e' onto the screen 
    movb $'e' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'l' onto the screen 
    movb $'l' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'l' onto the screen 
    movb $'l' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'o' onto the screen 
    movb $'o' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter ',' onto the screen 
    movb $',' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print space onto the screen 
    movb $' ' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'W' onto the screen 
    movb $'W' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'o' onto the screen 
    movb $'o' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'r' onto the screen 
    movb $'r' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'l' onto the screen 
    movb $'l' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'd' onto the screen 
    movb $'d' , %al 
    movb $0x0e, %ah 
    int $0x10 

    . = _start + 510  #mov to 510th byte from 0 pos 
    .byte 0x55   #append boot signature 
    .byte 0xaa   #append boot signature 
+1

Вы должны по крайней мере сделать что-то вроде 'jmp .' в конце кода, чтобы попасть в бесконечный цикл, иначе вы будете выполнять все, что происходит в памяти после этого последнего' int $ 0x10' –

+0

Предпочтительно я ' d do 'endloop: hlt'' jmp endloop' вместо моего более простого решения' jmp .' в первом комментарии. Любой из них может быть помещен в конец вашего кода. –

+0

hmmm ничего не появилось снова. bochs просто показывают темный экран. :( – Adonaim

ответ

0

Вы должны создать файл bochs, чтобы он работал хорошо. Также вы можете использовать виртуальную машину. Я тестирую ваш код, и он отлично работает.

+0

спасибо, исправлено. – Adonaim

Смежные вопросы