在QEMU中自定义引导加载程序中显示字符串的随机字符

时间:2014-08-13 19:31:36

标签: assembly nasm qemu bootloader

我正在按照一个教程向您介绍引导加载程序的神奇世界。

最简单的例子,打印一个角色,有效。 显示一个字符串给我一些问题:它显示随机字符。 它应显示12个字符,从si寄存器

内的位置开始

这是Nasm代码(构建命令:nasm.exe bootloader.asm -f bin -o bootloader.bin

[bits 16]
[org 0]
start:
    mov al, 68
    mov ah, 0x0E
    mov bh, 0x00
    mov bl, 0x07

    mov si, helloWorld
    call printString

    jmp $

printString:
    mov dx, 0
._loop:
    mov al, [si]
    int 0x10
    inc si

    inc dx
    cmp dx, 12
    jl ._loop

    ret


helloWorld:
    db 'AAAAAAAAAA'

times 510 - ($ - $$) db 0
dw 0xAA55

然后我使用dd.exe if=bootloader.bin of=bootloader.img count=1 bs=512

创建.img文件

它在QEMU(qemu-system-i386.exe)中正确引导(好吧,它加载,因为我的引导加载程序仍无法启动)(也许这是QEMU -difficoult的问题 - )

Here's the screenshot Ta-dah!

我的代码中出现了什么问题?

2 个答案:

答案 0 :(得分:1)

您应该使用[org 0x7c00],因为这是加载引导程序的地方。我建议您从this OSDev Wiki article了解有关启动顺序的更多信息。

答案 1 :(得分:0)

是的,您需要ORG 0x7C00,因此寻址从7C00h开始。 您还需要在访问[SI]上的数据之前设置DS(数据段)寄存器,因为无法保证所有BIOSES都将其设置为0。

只是做:     MOV DX,CS     MOV DS,DX 在你的开始:标签

设置完DS后,您可以访问那里的任何数据结构。

此处参考是Microsoft引导扇区的第一条指令(在jmp之后):

XOR CX,CX
MOV SS,CX
MOV SP,7BF4h
MOV ES,CX
MOV DS,CX