0

FAT32 ブート セクタが機能しません。私を助けてください。コードを調べてからvirtualboxでテストするまで、あらゆることを試しました。virtualbox で実行すると、次のエラーが表示されます: 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からコードを受け取りました

4

1 に答える 1

2

「Int 0x18」は通常、BIOS が起動するものを見つけられない場合に使用されます。むかしむかし、ROM で BASIC インタープリターを起動していましたが、現在はメッセージを表示するだけです。

BIOS は、デバイスの最初のセクターが読み取れるかどうか、およびセクターのオフセット 0x01FE にマジック シグネチャ 0xAA55 が含まれているかどうかを確認します。その他の要件はありません。セクターの残りの部分がランダムなバイトでいっぱいになり、コンピューターがクラッシュする可能性があります。BIOS は気にせず、それを実行します (「Int 0x18」メッセージを表示しません)。

コードには、オフセット 0x01FE にマジック シグネチャが含まれています。したがって、問題はあなたのコードではありません。問題は、ブート セクタをディスク イメージにどのようにインストールしたか、またはエミュレータをどのように構成したかである可能性があります。

確認事項:

1) エミュレーターにディスク イメージの場所が通知されている (たとえば、まったく別のものを起動しようとしていない、または存在しないディスクから起動するように通知されていない)

2) エミュレータは、ディスク イメージを設定したディスク ドライブから起動するように指示されています (たとえば、ブート セクタがハードディスクなどにあるときにフロッピーから起動しようとしていない)。

3) ディスク イメージは、エミュレータが想定している形式です。ほとんどのエミュレーターは、いくつかの異なるディスク イメージ形式 (VDI、VHD など) をサポートしています。ディスク イメージが 1 つの形式 (未加工のセクタ データのみを含む固定サイズのイメージなど) であるのに、エミュレータが別の形式 (VDI など) であると認識した場合、問題が発生する可能性があります。

4) ブート セクタがディスク イメージに正しくインストールされている (「hexdump」などのツールを使用して、ディスク イメージの最初のセクタを確認することを検討してください)。これには、ディスクの最初のセクターに何もないパーティションの最初のセクターとしてコードをインストールすることが含まれる場合があります (以下のパーティション情報を参照)。

今後の注意事項:

BPB (「BIOS パラメータ ブロック」) は、(フロッピー ディスクではなく) ハードディスク用のようです。ハードディスクにはさまざまなサイズがあります (通常、「sectorsPerCylinder」などをハードコーディングすることはできません)。これは、通常、正しい値を検出し、BPB の値を調整してから、変更されたブートをインストールする特別なユーティリティを作成する必要があることを意味します。セクタ。

また、通常、ハードディスクはパーティション化されています。BIOS (パーティションについては何も知らない) は、ディスクの最初のセクターをロードして開始します。最初のセクター (通常は MBR またはマスター ブート レコードと呼ばれます) には、パーティション テーブルで「アクティブな」パーティションをチェックし、そのパーティションの最初のセクター (ブート セクター) をロードします。また、パーティションは複数のパーティションに分割される場合があることに注意してください。つまり、ハード ドライブのすべてのブート セクタには、(MBR だけでなく) オフセット 0x01BE にパーティション テーブルが必要です。もちろん、BIOS はパーティションを認識しないため、技術的には、パーティション化されていないハードディスクを使用することは可能です。

于 2012-10-06T06:09:05.237 に答える