LINUX.ORG.RU

разработка загрузчика


0

0

Вообщем решил попробовать написать свой загрузчик или что-то типа того(в коде покопаться).
Честно стянул код с http://lowlevel.ru/?namespace=osdev2:
        [ORG 0x7C00]
start:
        cli
        mov     ax, cs
        mov     ds, ax
        mov     ss, ax
        mov     sp, start

        sti

        mov     si, msg
        call    kputs

        cli
        hlt
        jmp short $

kputs:
        .loop:
        lodsb
        test    al, al
        jz      .quit
        mov     ah, 0x0E
        int     0x10
        jmp     short .loop
        .quit:
        ret

msg:    db      "Hello from the world of real programming!",0x0A,0x0D,0
        times   510-($-$$) db 0
        db      0xAA, 0x55

Компилирую:
nasm -f bin -o boot.bin boot.s

Запускаю:
qemu -fda boot.bin -boot a

Получаю сообщение:
Boot from Floppy failed: not a bootable disk

Чего qemu не хватает, чтобы он мог грузиться с образа моей дискеты?
Надо сказать, что с других дискет он грузится. Видимо нужно что-то хитрое дописать, чтобы он ее за загрузочную считал.
Кто знает что именно?
anonymous
Ответ на: комментарий от tailgunner

>Судя по ORG 0x7c00, это не образ загрузочного блока дискеты - это загрузчик BIOS.

Посмотри что тут пишут: http://lowlevel.ru/?namespace=osdev2

Тут как раз предлагают записать получившийся start.bin на дискету с помощью cp. =/

То есть у них вроде как грузится. А у меня нет(по крайней мере на qemu, на реальном компе протестить не могу - нет дискет)

anonymous
()
Ответ на: комментарий от anonymous

> db 0xAA,0x55 и dw 0xAA55 - одно и то же

Если я правильно помню ассемблер интела, db 0xAA,0x55 дает последовательность байт aa 55, а dw 0xAA55 дает 55 aa.

> [BITS 16] не обязательно, это для 16-bit кода

И откуда nasm узнает, что ты компилируешь 16-бит программу?

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

dw 0xAA55 решило проблему

Для db нужно 0x55,0xAA

Спасибо огромное за ссылку на нормальную статью. Теперь все работает.

anonymous
()
Ответ на: комментарий от anonymous

А компилирую я вроде бы не 16-bit прогу, а 64-bit. Или bootloader должен быть 16-bit? Закомментировал 16-bit - все работает и грузится.

anonymous
()
Ответ на: комментарий от anonymous

bootloader работает (начинает работать) в реальном режиме, поэтому, во избежание сюрпризов, лучше указывать 16-бит режим явно.

tailgunner ★★★★★
()

Не правильно. Это _сам_ загрузчик дискеты. Помимо этого в первом секторе должен быть BPB, которого у тебя нет.

Посмотри примеры к FASM'у, там есть полноценный загрузчик. Или дизассемблируй прервый сектор любой дискеты.

ЗЫ: www.wasm.ru рулит.
ЗЗЫ: Не майся дурью, а сделай что-нибудь полезное.
ЗЗЫ: Все это "real programming" (sic!) настолько тривиально, что не стоит и упоминания.
ЗЗЗЫ: Лучше кури EFI, на перспективу.

Macil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.