2009-11-24 79 views
2

這已經有一段時間,因爲我沒有任何ASM,並決定再次嘗試寫一個小的引導程序,用QEMU測試。我的問題是中斷13,出於某種原因進位標誌被設置,所以讀取失敗。目前,我的磁盤映像的樣子:擴展中斷13,閱讀未格式化的磁盤

512字節的BootLoader < - 這(據我所知)是塊0 LBA

主要功能 < - 這將是塊1

基本上,與512個字節的BIOS加載到內存中,我想從相同的驅動器裝載下一個512個字節。但我無法弄清楚發生了什麼問題。希望我已經提供了足夠的信息。

下面的代碼,這個問題是與第二0×13中斷,剛剛跳到0x7E00前:

[bits 16] 
[org 0x7C00] 

; Prepare Stack Segment 
;----------------------------------------------------------------- 
    mov sp, 0x7A00    ; Move Stack into SP 
    mov bp, sp     ; Store current Stack Base 

; Print Character to Make Sure Bootloader Has Reached this Point 
;----------------------------------------------------------------- 
    mov ah, 0x0E    ; Print Character to Screen 
    mov bh, 0x00    ; No Page Numbering 
    mov bl, 0x07    ; White Text, Black Background 
    mov al, 65     ; Print Letter A 
    int 0x10 

; Check if INT0x13 Extentions are Supported 
;----------------------------------------------------------------- 
    mov ah, 0x41    ; Set Function 0x41 
    mov word bx, 0x55AA   
    push dx      ; Save old Drive Identifier 
    mov dl, 0x80    ; Load 'Active' ID Into dl 
    int 0x13     ; Call Interupt 
    jc short unsupported  ; If Extentions aren't Supported, Jump 
    xor ax, ax 
    add ax, 1     ; Clear Carry Bit 

    mov si, DAPS    ; Load DAPS Struct to DS:SI 
    mov ah, 0x42    ; Read Functions (AL Ignored) 
    mov dl, 0x80    ; Active Boot Drive (Commented Out Due to Line 24) 
    int 0x13 
    jc short unsupported  ; If something goes wrong... 
    jmp 0x7E00     ; Jump to main 

; Errors 
;----------------------------------------------------------------- 
    unsupported: 
    mov ah, 0x0E    ; Print Letter F, Gives Indication of Failure 
    mov bh, 0x00 
    mov bl, 0x07 
    mov al, 70 
    int 0x10 

    success: 
    pop dx      ; Pop Original Drive Identifier 
    jmp $ 

; Fill Out Rest of Bootloader 
;----------------------------------------------------------------- 
times 494-($-$$) db 0 

; Memory Data Structures and Other Variables 
;----------------------------------------------------------------- 
    ; Disk Address Packet Structure (Used For Loading Rest of OS) 
    DAPS: db 0x10    ; Size of Structure (16 bytes) 
      db 0     ; Always 0 
      db 1     ; Number of Sectors to Read (1x512) 
      db 0     ; Always 0 
      dw 0x7E00    ; Target Location for Reading To 
      dw 0     ; Page Table (0, Disabled) 
      dd 1     ; Read from Second Block 
      dd 0     ; Large LBAs, ignore 

    db 0x55, 0xAA    ; Add Boot Record Signature 

main: 
    mov ah, 0x0E    ; Print Character to Screen 
    mov bh, 0x00    ; No Page Numbering 
    mov bl, 0x07    ; White Text, Black Background 
    mov al, 66     ; Print Letter B 
    int 0x10 

    jmp $ 

回答

3

問題結束了簡單的代碼是正確的。但是因爲最終的圖像是525字節,而不是512字節的倍數,讀取打破了。只是要我墊出的圖像以0使圖像尺寸1024B所以讀可以得到所有512個字節。

(顯然可能是一個更好的主意,不是有一個微小的未格式化的磁盤是這樣,但對於學習的目的,這是所有我真正需要的)