2012-03-26 77 views
1

我想建立自己的啓動加載程序,然後加載然後從實模式切換到保護模式,加載GDT描述符,然後調用一些階段2代碼。由於我無法弄清楚調試我的程序的好方法,所以讓事情順利進行一直是一場艱苦的戰鬥。出於某種奇怪的原因,我的代碼在將我的引導程序的第二個扇區讀入內存時失敗,地址爲0x1000。我嘗試使用int 0x13al = 0x01這是一個Get Status of Last Drive Operation interupt。它返回0x01,這意味着Invalid Command這使我更加困惑。從啓動映像加載扇區在啓動加載程序失敗

mov ah, 0  ;reset drive 
    int 0x13 
    or ah, ah  ;check for error 
    jnz err  ;error handling function (prints ASCII A) 

    mov ax, 0 
    mov es, ax 
    mov bx, 0x1000 ;read sector into 0000:0x1000 

    mov ah, 0x02 ;read sector 
    mov al, 1  ;# of sectors to read = 1 
    mov ch, 0  ;Cylinder = 0 
    mov cl, 0x02 ;Sector to read = 2 (second as first sector is this code) 
    mov dh, 0  ;head = 0 

        ;dl should equal the drive number as BIOS automatically detects it 
    int 0x13 
    or ah, ah 
    jnz err  ;check for error again (this is where the error occurs) 

當計算機啓動時,有人告訴我,BIOS會將驅動器盤符進入所以我所有的中斷應該正確的驅動器上進行的dl寄存器。我甚至嘗試設置dl0x00這將等於軟驅A:和BOCHS(CPU模擬器)我將軟盤驅動器A:設置爲我的啓動映像,但它仍然無法啓動。 QEMU和BOCHS不會正確模擬代碼有什麼原因嗎?我還沒有嘗試將它燒到USB上並從實時BIOS中啓動它。我將發佈我的完整代碼here,以便您可以在必要時查看它。我很抱歉,如果我不夠清楚,我是初學者在操作系統開發。非常感謝!

編輯: 操作系統:Windows 7 x64(開發x32操作系統) 仿真:BOCHS運行由NASM編譯器創建的boot.img。

+0

我回答你的問題嗎? – Stewart 2012-03-28 10:34:06

+0

@Stewart我正在重寫我的引導裝載程序,所以我可以測試它。只要我將新代碼加入其中,我會盡快回復。別擔心:) – user99545 2012-03-28 23:35:38

回答

0

您正在錯誤地檢查錯誤。 int 0x13 ah = 0例如通過設置進位標誌來指示錯誤,而不是通過報告ah中的內容。而不是或者啊,如果使用jc err設置進位,你應該跳轉。