2012-01-09 59 views
2

我試過在網絡上使用一些程序集教程,其中大部分都不適合我。我使用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? (這是工作版本)

+0

嘗試使用QEMU,或以某種方式得到Bochs的工作(崗位上的超級用戶,如果您遇到這些問題 - 我也許能提供幫助,並因而可能其他人)。他們有內部的迷你調試器,可以讓你查看內存,寄存器等,這對於像這樣的東西非常有用。 – Mehrdad 2012-01-09 01:22:33

+0

如果你用'ndisasm -b 16 boot.img'反彙編boot.img,你會得到相同的代碼嗎? – 2012-01-09 04:32:23

+0

BIOS可能沒有將視頻模式設置爲您認爲的模式。你有沒有嘗試首先用INT 0x10(AH = 0)初始化它?也許還可以使用INT 0x10(AH = 2)重置光標位置。你也假設堆棧指針是有效的 - 許多引導加載程序在進入時重置SS:SP(只是爲了確保)。 – adelphus 2012-01-09 15:14:27

回答

1

作爲引導加載程序,您將沒有有效的堆棧,您需要自行設置它。如果你不知道知道你有一個好的堆棧,任何堆棧操作(你正在調用INT)都充滿了危險!

+1

BIOS在加載啓動扇區時使用的堆棧非常有效。它與BIOS在安裝過程中「使用INT時調用」相同。 – 2016-05-08 19:13:48

相關問題