我正在尝试为 x86 机器创建一个小型操作系统,并开始为一个相当小的引导加载程序编写代码。我创建的引导加载程序非常简单,它从直接位于主引导记录之后的扇区加载一个小的第二个引导加载程序并跳转到该代码。主引导记录中的引导加载程序代码似乎运行良好,当它尝试跳转到第二阶段引导加载程序时出现问题。这个第二阶段的引导加载程序应该输出一个表示成功的字母(字母 S),所以我可以知道代码正在执行。问题是屏幕上什么都没有出现,所以我怀疑第二阶段引导加载程序从未执行过。我使用的代码如下:
主引导记录中的引导加载程序:
[BITS 16] ; 16 bit mode
[ORG 0x7C00] ; Boot loader start address
Boot:
; Initial, dl contains drive number
; Set data segment to code segment
mov ax, cs
mov ds, ax
mov es, ax
; Set the stack segment to 0xA000
add ax, 0xA000
mov ss, ax
mov sp, 0x00
; Reset the drive, dl contains drive number
mov ah, 0x00
int 0x13
; Read from drive, dl contains drive number
; Set up output location to 0x7E00: 0x00
mov ax, 0x7E00
mov es, ax ; Load to 0x7E00 : 0x00
mov bx, 0x00
ReadDrive:
mov ah, 0x02
mov al, 0x01 ; Read 1 sector
mov ch, 0x00 ; Read on cylinder 0
mov cl, 0x02 ; Read sector 2
mov dh, 0x00 ; Head number 0
int 0x13
jnc Success
; Print error (character F)
mov al, 0x46
call PrintChar
jmp ReadDrive ; Retry
PrintChar: ; Prints a single character
pusha
mov ah, 0x09
mov bh, 0x00
mov bl, 0x0F
mov cx, 0x01
int 0x10
popa
ret
Success:
jmp 0x7E00:0x00 ; Jump to 2nd stage bootloader
TIMES 510 - ($ - $$) db 0
DW 0xAA55 ; Boot signature
第二阶段引导加载程序的代码:
[BITS 16]
[ORG 0x7E00]
Boot2:
; Prints the character S to the screen
mov al, 0x53
mov ah, 0x09
mov bh, 0x00
mov bl, 0x0F
mov cx, 0x01
int 0x10
jmp $ ; Loop forever
TIMES 512 - ($ - $$) db 0 ; Fill rest of block
此代码是使用以下代码编译并写入驱动器的:
nasm boot.asm -o boot.bin -f bin
nasm boot2.asm -o boot2.bin -f bin
dd if=boot.bin of=/dev/sd3 bs=512
dd if=boot2.bin of=/dev/sd3 bs=512 seek=1
写入此代码的设备是 16GB USB 驱动器。我用来启动此代码的计算机支持从 USB 启动并像任何其他硬盘驱动器一样启动它们。代码似乎没有执行的原因是什么?