Я пишу свой собственный загрузчик в NASM x86 на архитектуре x86_64, для начала я просто пытаюсь скопировать существующий загрузчик во второй сектор с помощью dd, затем скопировать его обратно и запустить из сборки.
файл.asm
org 0x7c00
jmp 0:start
start:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x8000
mov ah, 0x02
mov al, 1
mov dl, 0x80
mov ch, 0
mov dh, 0
mov cl, 3
mov bx, 0x7e00
int 0x13
jmp 0x7e00
times 510-($-$$) db 0
dw 0xaa55
times (1024 - ($ - $$)) db 0x00
third_sector:
mov ah, 0x02
mov al, 1
mov dl, 0x80
mov ch, 0
mov dh, 0
mov cl, 2
mov bx, 0x7c00
int 0x13
jmp 0x7c00
Код настраивает стек, затем заменяет себя на 1024 байта нулями, чтобы последний бит кода находился в третьем секторе диска, затем загружает второй сектор с диска в первый и переходит к первому сектору.
src.sh
#!/bin/bash
dd bs=1 count=512 if=/dev/c0d0 of=tmp
nasm -f bin file.asm -o file
dd bs=1 count=1200 if=file of=/dev/c0d0
dd bs=1 count=512 seek=512 if=tmp of=/dev/c0d0
Что я делаю, так это копирую исходный загрузчик во временный файл с именем tmp, затем компилирую свою программу и помещаю ее в место старого загрузчика (/dev/c0d0, так как я работаю над MINIX 3.3.0), затем перемещаю старый загрузчик во второй сектор.
Результатом является строка «Загрузка с жесткого диска», что нормально, а затем я получаю «Ошибка загрузки NetBSD MBR P», что соответствует «нету раздела netBSD».
Изменить: вставлен неправильный файл asm. Второе редактирование: ошибка изменилась, но все еще сохраняется.
mov sp, 0x8000
?? Кстати, вы можете включить старый загрузчик непосредственно в свой исходный код с помощьюincbin
... но если этот старый загрузчик уже находится во втором секторе, вы можете просто скомпилировать + сохранить только загрузчик первого сектора. И переместите этот код третьего_сектора в загрузчик первого сектора, затем переместите его в некоторую свободную память, чтобы он не был перезаписан при загрузке оригинала, загрузки оригинала и перехода к его началу. - person Ped7g   schedule 02.04.2017jmp 0:0x7c00
дальним прыжком? - person Ped7g   schedule 02.04.2017