Bootloader教程对我不起作用

时间:2012-01-09 01:18:59

标签: assembly bootloader

我尝试过在网络上使用一些汇编教程,其中大部分都不适合我。我正在使用NASM和VirtualBox(无法让Bochs工作),这样的东西可以工作:

[BITS 16]
[ORG 0x7C00]
push 0xB800
pop es
mov byte [es:0],'A'
mov byte [es:1],0x1F
jmp $
times 510-($-$$) db 0
dw 0xAA55

但这不是:

[BITS 16]
[ORG 0x7C00]
mov ah,0x09
mov al,'A'
mov bh,0
mov bl,0x1F
mov cx,1
int 0x10
jmp $
times 510-($-$$) db 0
dw 0xAA55

我正在使用我制作的这个批处理脚本:

:: Compile with NASM ::
@echo off
echo Compiling boot.asm to boot.bin
cd C:/Users/Christian/Desktop/Assembly

C:/nasm/nasm -f bin boot.asm -o boot.bin

:: Copy to a floppy image with bfi ::
echo Creating boot.img

cd C:/Users/Christian/Desktop/Assembly
timeout 1 >nul
C:/Users/Christian/Desktop/Assembly/bfi -b=boot.bin -t=4 -l="Boot" -f=boot.img

:: Start Virtual Machine ::
echo Starting Virtual Machine "Test"

timeout 1 >nul
"C:\Program Files\Oracle\VirtualBox\VBoxManage" controlvm "Test" poweroff
"C:\Program Files\Oracle\VirtualBox\VBoxManage" startvm "Test"

关于为什么这不起作用的任何想法?

我也按照建议尝试了ndisasm -b 16 boot.img,但它只是重复输出div dh? (这是在工作版本上)

1 个答案:

答案 0 :(得分:1)

作为引导加载程序,您将没有有效的堆栈,您需要自己设置它。如果你没有知道你有一个很好的堆栈,任何堆栈操作(你用INT调用)都充满了危险!