我正在写一个两阶段的bootloader这里是我的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
它编译没有任何错误或警告。但是,我如何将stage 2放在0x8000并将stage1和stage2链接到一起工作呢?
2条答案
按热度按时间zqdjd7g91#
您可能会问如何将第一阶段和第二阶段合并到一个文件中。如果是:
*Linux上:
要从bootloader加载第二阶段,可以使用以下代码:
nhjlsmyf2#
但是我怎么把第二阶段设置为0x 8000...
不幸的是,我不使用“nasm”,而是使用其他汇编器。但是我希望你必须将
[org 0x7e00]
更改为[org 0x8000]
。...并将stage1和stage 2链接在一起工作?
这并不像你想的那么简单:
BIOS将一个扇区(510字节加2字节
0xAA55
)加载到0x 7 C 00的内存中。使用普通BIOS,不可能加载更多数据!这510个字节(“stage 1”)中的代码必须将“state 2”加载到内存中:它可以使用
int 0x13
的函数ah=2
或ah=0x42
来这样做。如果您有自己的软盘格式,这很简单:
您将“阶段2”存储在软盘的第二个扇区中,并加载第二个扇区。
如果您想从文件系统(例如从FAT格式的磁盘中的文件),这就更棘手了。