放置引导文件不起作用

放置引导文件不起作用

我在 x86 上创建了以下程序集文件:

mov ah, 0x0e 
mov al, 'H'
int 0x10
mov al, 'e'
int 0x10
mov al, 'l'
int 0x10
int 0x10 ; 'l' is still on al, remember?
mov al, 'o'
int 0x10

jmp $ ; jump to current address = infinite loop

; padding and magic number
times 510 - ($-$$) db 0
dw 0xaa55

我使用 nasm 编译:

nasm -f bin boot_sect_simple.asm -o boot_sect_hello.bin

并使用 qemu 测试了二进制文件:

qemu-system-x86_64 boot_sect_hello.bin

然后我将dd二进制文件写入 U 盘的启动部分:

sudo dd if=/Users/niclas/assembly/OS/boot_sect_hello.bin of=/dev/disk2

然后我测试了正确性后:

sudo dd if=/dev/disk2 of=/dev/stdout bs=512 count=1 | hexdump

0000000 b4 0e b0 48 cd 10 b0 65 cd 10 b0 6c cd 10 cd 10
0000010 b0 6f cd 10 eb fe 00 00 00 00 00 00 00 00 00 00
0000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
00001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
0000200

看来是对的...

然而,试图在现代机器的启动菜单中找到例程似乎不起作用...... UEFI 找不到棒。我做错了什么?

免责声明:这是一个 UNIX 问题,因为我使用 Unix 和 Unixlike 系统来使其可启动......

答案1

您使用中断例程的方式是正确的,但仅限于 x86 模式。

维基百科

在现代 x86 系统上,BIOS 调用只能在实模式或虚拟 8086 模式下执行。 v8086 不是长模式下的选项。

我相信现代系统不会以实模式启动,因此不能直接使用 int 10 。此外,电喷系统根本不读取引导扇区。这可以在 BIOS 设置 qv(->“Legacy Boot”)中进行设置。

相关内容