为什么我的引导程序在物理机上表现异常?

时间:2018-11-25 23:46:01

标签: assembly x86-16 boot bootloader

一段时间以来,我一直在尝试在计算机(即物理机)上测试一个简单的引导程序,但我遇到了一些非常奇怪的行为。

我的引导程序位于名为“ boot.asm”的文件中,并包含以下代码:

[ORG 0x7c00]

start:
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x9000

    mov si, mesg1
    call print

    mov ax, 0x0201      ;ah=0x02, al=0x01
    mov bx, 0x5000      ;address = 0x5000 (I have also attempted this at 0x8000)
    mov cx, 0x0002      ;ch=0x00, cl=0x02
    mov dh, 0x0
    int 0x13

    mov si, mesg2
    call print

    jmp $

print:
    pusha
    mov ah, 0xe
    xor bl, bl
.loop:
    lodsb
    test al, al
    jz .end
    int 0x10
    jmp .loop
.end:
    popa
    ret

mesg1 db "Msg1", 0x0
mesg2 db "Tst1", 0x0

times 510 - ($ - $$) db 0x0
db 0x55, 0xaa

我用一个包含以下命令的makefile对其进行编译(kernel.asm除了垃圾外仅包含其他内容,仅用于较早的测试):

nasm -f bin -o bin/boot.bin src/boot.asm
nasm -f bin -o bin/kernel.bin src/kernel.asm
cat bin/boot.bin bin/kernel.bin > boot.img

当我在Virtualbox中以软盘启动“ boot.img”时,在屏幕上会得到预期的输出:

Msg1Tst1

当我尝试在物理计算机上运行此问题时,会出现问题。我使用以下命令将启动映像复制到闪存驱动器:

sudo dd if=boot.img of=/dev/sdb

然后我重新启动计算机,并且得到了最奇怪的输出:

Msg1Msg1

无论我怎么努力,我都不知道发生了什么。稍作修改后,我发现如果我移动代码,

mov si, mesg2
call print

在读取操作之前,它将给出预期的输出。有人可以向我解释我在做什么错吗?我已经待了一天,但我无法弄清楚问题所在。

0 个答案:

没有答案