assembly 链接第一和第二阶段引导加载程序

7tofc5zh  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(212)

我正在写一个两阶段的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链接到一起工作呢?

zqdjd7g9

zqdjd7g91#

您可能会问如何将第一阶段和第二阶段合并到一个文件中。如果是:

*Linux上:

cat boot.bin boot2.bin > final_file.file_format
  • 在*Windows上:
copy /b boot.bin+boot2.bin  final_file.file_format

要从bootloader加载第二阶段,可以使用以下代码:

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
nhjlsmyf

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=2ah=0x42来这样做。
如果您有自己的软盘格式,这很简单:
您将“阶段2”存储在软盘的第二个扇区中,并加载第二个扇区。
如果您想从文件系统(例如从FAT格式的磁盘中的文件),这就更棘手了。

相关问题