2012-10-05 67 views
0

無法讓我的FAT32引導扇區正常工作。請幫幫我。我已經嘗試了一切,從查看代碼到在virtualbox中測試它。當我在virtualbox中運行它時,出現以下錯誤:FATAL:INT18 BOOT ERROR。以下是代碼:Bootsector FATAL:INT18 BOOT ERROR

BITS 16 
ORG 0x7C00 
jmp START 

OEM_ID db 「PARADIGM" 
BytesPerSector dw 0x0200 
SectorsPerCluster db 0x08 
ReservedSectors dw 0x0021 
TotalFATs db 0x02 
MaxRootEntries dw 0x0000 
TotalSectorsSmall dw 0x0000 
MediaDescriptor db 0xF8 
SectorsPerTrack dw 0x003F 
SectorsPerHead dw 0x0080 
HiddenSectors dd 0x0000003F 
TotalSectorsBig dd 0x0040994 
BigSectorsPerFAT dd 0x00000778 
SectorsPerFAT dd 0x0000101F 
Flags dw 0x0000 
FSVersion dw 0x0000 
RootDirectoryStart dd 0x00000002 
FSInfoSector dw 0x0001 
BackupBootSector dw 0x0006 
times 13 db 0x00 
DriveNumber db 0x00 
db 0x00 
Signature db 0x29 
VolumeID dd 0x1F040FD5 
VolumeLabel db "PARADIGM_BOOT" 
SystemID db "FAT32" 

START: 
cli 
mov ax, 0x0000 
mov ds, ax 
mov es, ax 
mov fs, ax 
mov gs, ax 
mov ax, 0x0000 
mov ss, ax 
mov sp, 0x0000 
sti 
mov si, msgLoading 
call DisplayMessage 
mov cx, WORD[SectorsPerCluster] 
xor ax, ax 
mov al, BYTE [TotalFATs] 
mul WORD[BigSectorsPerFAT] 
add ax, WORD [ReservedSectors] 
mov WORD [datasector], ax 
xor ax, ax 
mov ax, WORD [RootDirectoryStart] 
call ClusterLBA 
mov bx, 0x0200 
call ReadSectors 
mov cx, WORD [0x0080] 
mov di, 0x0200 
.LOOP: 
push cx 
mov cx, 0x000C 
mov si, ImageName 
push di 
rep cmpsb 
pop di 
je LOAD_FILE 
pop cx 
add di, 0x0020 
loop .LOOP 
jmp FAILURE 

LOAD_FILE: 
mov si, msgCRLF 
call DisplayMessage 
mov dx, WORD [di + 0x001A] 
mov WORD [cluster], dx 
mov ax, 0x0100 
mov es, ax 
mov bx, 0 
xor cx, cx 
mov cl, BYTE[SectorsPerCluster] 
mov ax, WORD[cluster] 
call ClusterLBA 
call ReadSectors 
jmp DONE 

DONE: 
mov si, msgCRLF 
call DisplayMessage 
push WORD 0x0200 
push WORD 0x0000 
retf 

FAILURE: 
mov si, msgFailure 
call DisplayMessage 
mov ah, 0x00 
int 0x16 
int 0x19 

DisplayMessage: 
lodsb 
or al, al 
jz .DONE 
mov ah, 0x0E 
mov bh, 0x00 
mov bl, 0x07 
int 0x10 
jmp DisplayMessage 
.DONE: 
ret 

ReadSectors: 
.MAIN: 
mov di, 5 
.SECTORLOOP: 
push ax 
push bx 
push cx 
call LBACHS 
mov ah, 0x02 
mov al, 0x01 
mov ch, BYTE [absoluteTrack] 
mov cl, BYTE [absoluteSector] 
mov dh, BYTE [absoluteHead] 
mov dl, BYTE [DriveNumber] 
int 0x13 
jnc .SUCCESS 
xor ax, ax 
int 0x13 
dec di 
pop cx 
pop bx 
pop ax 
jnz .SECTORLOOP 
int 0x18 
.SUCCESS: 
mov si, msgProgress 
call DisplayMessage 
pop cx 
pop bx 
pop ax 
add bx, WORD [BytesPerSector] 
inc ax 
loop .MAIN 
ret 

ClusterLBA: 
sub ax, 0x0002 
xor cx, cx 
mov cl, BYTE [SectorsPerCluster] 
mul cx 
add ax, WORD [datasector] 
ret 

LBACHS: 
xor dx, dx 
div WORD [SectorsPerTrack] 
inc dl 
mov BYTE [absoluteSector], dl 
xor dx, dx 
div WORD [SectorsPerHead] 
mov BYTE [absoluteHead], dl 
mov BYTE [absoluteTrack], al 
ret 

absoluteSector db 0x00 
absoluteHead db 0x00 
absoluteTrack db 0x00 

datasector dw 0x0000 
cluster dw 0x0000 
ImageName dw "BOOTLOAD.BIN" 
msgLoading db 0x0D, 0x0A, "Loading Boot Image", 0x0D, 0x0A, 0x00 
msgCRLF db 0x0D, 0x0A, 0x00 
msgProgress db ".", 0x00 
msgFailure db 0x0D, 0x0A, "ERROR: Press Any Key to Reboot", 0x00 

times 510-($-$$) db 0 
dw 0xAA55´ 

我使用的是iso規範。看起來好像它沒有正確地讀取扇區。我得到的代碼從Amila Surendra

回答

1

「INT 0x18」通常用於BIOS無法找到任何引導。曾幾何時,它曾經在ROM中啓動BASIC解釋器,但現在它只顯示一條消息。

BIOS檢查以查看設備的第一個扇區是否可以讀取,以及它是否包含扇區中偏移量爲0x01FE的魔術簽名0xAA55。沒有其他要求 - 其餘部分可能會充滿隨機字節,導致計算機崩潰,BIOS不會在意並執行它(並且不會顯示「Int 0x18」消息)。

你的代碼確實包含了偏移量爲0x01FE的魔術簽名;因此問題不在於你的代碼。問題很可能在於您如何將引導扇區安裝到磁盤映像或您如何配置仿真器。

檢查事項:

1)仿真器被告知在哪裏可以找到磁盤映像(例如,不嘗試引導完全不同的東西,或者沒有被告知從沒有按磁盤啓動不存在)

2)仿真器被告知從你設置磁盤鏡像的任何一個磁盤驅動器啓動(例如,當啓動扇區位於硬盤或其他東西上時,你不試圖從軟盤啓動)

3)磁盤映像採用了仿真器所期望的格式。大多數仿真器支持多種不同的磁盤映像格式(VDI,VHD等)。如果磁盤映像採用一種格式(例如,只包含原始扇區數據的固定大小的映像),但仿真器認爲其格式不同(例如VDI),則可能會導致問題。

4)引導扇區正確安裝在磁盤映像中(可能考慮使用像「hexdump」這樣的工具來檢查磁盤映像的第一個扇區)。這可能包括將代碼安裝爲磁盤第一個扇區中沒有任何內容的分區的第一個扇區(請參閱下面的分區信息)。

未來注:

你BPB(「BIOS參數塊」),看起來像是打算硬盤(不是軟盤)。硬盤有不同的大小(通常你不能硬編碼像「sectorsPerCylinder」這樣的東西),這意味着通常你需要編寫一個特殊的工具來檢測正確的值,調整BPB中的值,然後安裝修改過的啓動部門。

另外,硬盤通常是分區的。 BIOS(不知道分區的任何信息)加載並啓動磁盤上的第一個扇區,第一個扇區(通常稱爲MBR或主引導記錄)包含檢查分區表的「活動」分區的代碼,加載該分區的第一個扇區(引導扇區)。另請注意,一個分區可能會被拆分成更多的分區;這意味着硬盤驅動器的所有引導扇區都應該有一個偏移量爲0x01BE的分區表(不僅僅是MBR)。當然,因爲BIOS不知道分區,所以在技術上可以擁有未分區的硬盤。

+0

對引導扇區校驗和沒有額外的要求嗎? – hirschhornsalz

+0

我也在使用iso文件。 – gabemai

+0

除了啓動信號,有些機器據稱會檢查「jmp short/nop」或「jmp near」作爲第一條指令。 「舊Nasm」可能在這裏給出了「jmp near」。 「新納斯姆」可能會使它「短暫」。我會在最初的「jmp」之後嘗試一個「nop」。可能不會解決它,但容易嘗試。 :) –