注册裸机设置

Register setup for bare metal

我正在尝试编写 BIOS 级别的应用程序来获得乐趣。我在 vm 上测试了我的程序并且它可以工作但是在裸机上它非常有问题。我听说您需要在裸奖章编码之前设置段和寄存器,但我找不到任何关于我需要做什么设置的资源。如果它有帮助,这里是代码:

; I know this is not the proper way to print a string, but its just for testing

start:
    mov ah, 0x0e
    mov al, 'H'
    int 0x10
    mov al, 'e'
    int 0x10
    mov al, 'l'
    int 0x10
    mov al, 'l'
    int 0x10
    mov al, 'o'
    int 0x10
    mov al, ' '
    int 0x10
    mov al, 'W'
    int 0x10
    mov al, 'o'
    int 0x10
    mov al, 'r'
    int 0x10
    mov al, 'l'
    int 0x10
    mov al, 'd'
    int 0x10
    mov al, '!'
    int 0x10
    jmp $
    times 510-($-$$) db 0
    db 0x55, 0xaa

这是输出

Hello Wld!

我试过打印其他东西,但它们非常不一致且有问题。

您的程序的引导扇区应如下所示:

00000000: B4 0E B0 48 CD 10 B0 65  CD 10 B0 6C CD 10 B0 6C    H   e   l   l
00000010: CD 10 B0 6F CD 10 B0 20  CD 10 B0 57 CD 10 B0 6F    o       W   o
00000020: CD 10 B0 72 CD 10 B0 6C  CD 10 B0 64 CD 10 B0 21    r   l   d   !
00000030: CD 10 EB FE 00 00 00 00  00 00 00 00 00 00 00 00      
00000040: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
        25 x ---- " ----
000001E0: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
000001F0: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 AA 

当这个文件被引导固件加载到地址 0x07C00 时,BIOS 将用一个名为 Disk Base Table 的 11 字节长的结构覆盖 0x07C1E 处的内存。 这将损坏负责显示预期消息的几个字母的代码部分。

正如 @fuz 所建议的,启动代码对于初学者来说不是一个健全的环境。