2013-08-22 72 views
0

我想加載第二扇區的軟盤從引導程序加載第二扇區

我用fasm 1.7和windows 7測試此代碼,VMware。 使軟盤映像文件,我用dd從Ubuntu的13.04 我也用dd.bin.img

這裏是我的代碼

org 0x7c00 

;load 2nd sector to physical ram address 0xf00 
;(load '7' to 0xf00) 
mov ah, 02h 
mov al, 1 
mov ch, 0 
mov cl, 2;1~63 
mov dh, 0 
mov dl, 0 
mov bx, 0xf00 
push 0 
pop es 
int 13h 

;check whether it is loaded correctly 
;by printing a ascii character in 0xf00 
mov ah,0fh 
int 10h 
mov ah,0ah 
mov al, [0xf00]; 
mov cx, 1 
int 10h 

;pause 
jmp $ 

times 510-($-$$) db 0h 
dw 0xaa55 

second_sector: 
db '7' 

結果=完全不 什麼是打印「7」我錯了嗎? 感謝

+0

你確定'0f00h'處有'7'嗎?您的'second_sector'似乎不在該地址。 – lurker

+0

使用啊02h和int 13h,我想我把second_sector加載到0xf00。你能告訴我更多一點嗎? –

+4

'mov al,[0xf00]'隱含地是'[ds:0xfoo]'。您已經明確地爲讀取設置了「es」0,但是「ds」是「未知的」。嘗試修復。 –

回答

0

弗蘭克·科特勒在他的評價正確,這個問題是與線:

mov al, [0xf00]; 

在沒有段被設置,[0xf00]隱含[DS:0xf00]。在這個StackOverflow答案我給一些general bootloader development tips。提示1:

當BIOS跳轉到你的代碼,你可以不依賴於CS,DS,ES,SS,SP爲有效或預期值 寄存器。當您的引導程序啓動時,應該適當地設置它們 。您只能保證 您的引導加載程序將從物理地址 0x00007c00加載並運行,並且引導驅動器號被加載到DL 寄存器中。

你設置ES以0:

push 0 
pop es 

你有這樣明確地設定段寄存器的內存操作數的選項:

mov al, [es:0xf00] 

或設置DS在啓動時將設置爲0。刪除這些:

push 0 
pop es 

並添加到您的代碼的頂部:

xor ax, ax ; Zero out ax 
mov es, ax 
mov ds, ax 

你不應該假設你有一個有效的SS:SP(棧)在啓動時。手動設置堆棧是一種很好的做法。有關示例,請參閱前面提到的Stackoveflow答案的鏈接。