Связывание первого и второго этапа загрузчика - PullRequest
1 голос
/ 03 апреля 2019

пишу двухступенчатый загрузчик Вот мой boot.asm

[org 0x7c00]
[bits 16]
xor ax, ax
mov ds, ax
mov es, ax
xor bx, bx
mov ah, 0x0E
mov al, 'A'
int 0x10
jmp 0x8000
cli
hlt
times 510 - ($-$$) db 0
dw 0xAA55

и boot2.asm

[org 0x8000]
[bits 16]
xor ax, ax
mov ds, ax
mov es, ax
xor bx, bx
mov ah, 0x0E
mov al, 'B'
int 0x10

Я скомпилирую, используя

nasm -f bin -o boot.bin boot.asm
nasm -f bin -o boot2.bin boot2.asm

Компилируется без каких-либо ошибок или предупреждений. Но как мне поставить этап 2 на 0x8000 и связать этапы 1 и 2 для совместной работы?

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Скорее всего, вы спрашиваете, как объединить первый и второй этап в один файл. Если так:
На Linux:

cat boot.bin boot2.bin > final_file.file_format

На Windows

copy /b boot.bin+boot2.bin  final_file.file_format

Для загрузки второго этапа из загрузчика вы можете использовать следующий код:

mov ah, 0x02      ; Read disk BIOS call 
mov cl, 0x02      ; sector to start reading from
mov al, 1         ; number of sectors that will be read (modify if your second stage grows)
mov ch, 0x00      ; cylinder number
mov dh, 0x00      ; head number
xor bx, bx
mov es, bx        ; ES=0x0000
mov bx, 0x8000    ; ES:BX(0x0000:0x8000) forms complete address to read sectors to
; DL should contain the boot disk number passed to the bootloader by the BIOS
int 0x13          ; Make BIOS disk services call (Int 0x13/AH=2) to read sectors
; For simplicity assume the disk read was successful
jmp 0x0000:0x8000 ; FAR JMP to second stage and ensure CS=0x0000
                  ; since CS is not guaranteed to be 0x0000 when control is transferred
                  ; to our bootloader
1 голос
/ 03 апреля 2019

Но как мне поставить стадию 2 на 0x8000 ...

К сожалению, я не использую "masm", но другие ассемблеры.Но я ожидаю, что вам придется изменить [org 0x7e00] на [org 0x8000].

... и связать stage1 и stage2 для совместной работы?

Это не тактак просто, как вы думаете:

BIOS загрузит один сектор (510 байт плюс 2 байта 0xAA55) в память в 0x7C00.При использовании обычного BIOS нет возможности загрузить больше данных!

Код в этих 510 байтах («этап 1») должен загрузить «состояние 2» в память:для этого можно использовать функции ah=2 или ah=0x42 из int 0x13.

Если у вас есть собственный формат дискеты, это довольно просто:

Вы храните «stage 2» ввторой сектор дискеты и загрузите второй сектор.

Если вы хотите загрузить «этап 2» из файловой системы (например, из файла с диска, отформатированного в FAT), это более сложно.

...