0

アセンブリ言語を使用して、フロッピー ドライブが使用可能かどうかを確認する方法について質問があります。RAM メモリが十分かどうかを確認しましたが、フロッピー ドライブが使用可能かどうかを確認する方法がわかりません。私はこれを試しました:CMP AH,0 JNE disk_errorしかし、RAMのチェックの後にこれを置くと、何も起こりません。continueToLoad :を入れるとCMP AX,0 JNE fatal_disk_error正常に動作しますが、バーを読み込んだ後にエラーメッセージが表示されます。ローダー ローディング バーの前にエラー メッセージが表示されるようにする必要があります。 エラー

main:
    MOV DS,AX 
    PUSH CS
    POP DS
    MOV AH,0x00 
    MOV AL,0x03
    INT 0x10    
    CALL ClearScreen

    MOV BL,1010b        
    MOV BP,StrLoadKernel    
    MOV CX,length   
    MOV DH,13       
    MOV DL,30           
    CALL PrintString

    MOV BL,1010b        
    MOV BP,StrReboot    
    MOV CX,length2      
    MOV DH,14       
    MOV DL,30           
    CALL PrintString

readKeys:
    CALL PressKey
    CMP AL,00011011b ; ESC binary code
    JE Reboot
    CMP AL,00001101b ; ENTER binary code
        
    CALL ClearScreen
        
    MOV BL,1010b        
    MOV BP,StrLoading   
    MOV CX,length4      
    MOV DH,14       
    MOV DL,35           
    CALL PrintString    
      
    JE LoadKernel
    loop readKeys

    jmp $

LoadKernel:
    ;CHECK IF RAM MEMORY > 64MB
    MOV AH,0x88
    INT 0x15            
    CLC  
    CMP AX,0xFA00  
    MOV BL,0011b                         
    JNC printLoader
     CALL ClearScreen 
        MOV BL,1100b        
        MOV BP,StrErrorRAM  
        MOV CX,length3      
        MOV DH,13       
        MOV DL,25               
        CALL PrintString  
        
        MOV BL,1100b        
        MOV BP,press_key    
        MOV CX,length6      
        MOV DH,14       
        MOV DL,25                  
        CALL PrintString
        
        CALL PressKey
        CALL Reboot     
      JMP readKeys 
    JMP printLoader 

changeToBlue: 
MOV BL,1001b    

JMP printLoader

changeToGreen:
MOV BL,1010b    
    
JMP printLoader

changeToRed:
MOV BL,0100b    
    
JMP printLoader

continueToLoad: 
        MOV AX,0
        MOV DL,0
        INT 0x13         
        
    ;load kernel
        MOV AX,kernel 
        MOV ES,AX
        MOV BX,0        
        
        MOV AH,02h 
        MOV AL,01h 
        MOV CH,0h  
        MOV CL,02  
        MOV DH,0   
        MOV DL,0   
        INT 0x13   
           
        CMP AH, 0                     
        jne fatal_disk_error

jmp kernel:0

RET

CALL printLoader

printLoader:   
        MOV BP,symbol       ; stringul care dorim sa il afisam
        MOV CX,symbolLength ; marimea stringului
        MOV DH,16       ; randul (x)
        MOV DL,[count]      ; coloana (y)
        
        CALL PrintString
        
        INC DL
        INC DL
        INC DL
        MOV [count],DL
        
        CALL wait2sec
        
        MOV AL,[pas]
        INC AL
        MOV [pas],AL

        CMP AL,3
        JE changeToBlue
    
        CMP AL,6
        JE changeToGreen

        CMP AL,9
        JE changeToRed 
                
        CMP AL,10
        JE continueToLoad

    loop printLoader

ClearScreen:
    MOV AX,0600h 
    MOV CX,0000h
    MOV BH,0Ah
    MOV DX,1850h
    int 0x10    
RET

PressKey:
    ;read a key
    MOV AH,0
    INT 0x16
RET

PrintString:
    MOV AH, 0x13
    MOV AL,0
    MOV BH,0    
    INT 0x10
    ; hide cursor
    mov AH,0x01
    MOV CX,2607h
    INT 0x10
RET

Reboot:
    db 0x0ea
    dw 0x0000
    dw 0xffff
RET

wait2sec:
    MOV AH,0x86
    MOV CX,0008h
    MOV DX,6480h
    int 0x15
RET

fatal_disk_error:
    CALL ClearScreen 
    MOV AX,0  
    MOV ES,AX 
    
    MOV BL,1100b        
    MOV BP,disk_error   
    MOV CX,length5      
    MOV DH,16       
    MOV DL,30
    call PrintString
    CALL wait2sec
    CALL PressKey
    CMP AL,00011011b ; ESC binary code
    jmp Reboot
RET

StrLoadKernel: db "Press ENTER to load the KERNEL "
length equ $-StrLoadKernel

StrReboot: db "Press ESC to restart "
length2 equ $-StrReboot
                                                        
StrErrorRAM: db "Loading cancelled! ERROR : RAM < 64mb."
length3 equ $-StrErrorRAM    

StrLoading: db "Loading... "
length4 equ $-StrLoading  

disk_error: db "Floppy error! Press any key... "
length5 equ $-disk_error   

press_key: db "Press any key to restart!" 
length6 equ $-press_key

kernel equ 1000h

symbol: db 219 
symbolLength equ $-symbol

count db 25

pas  db 0

 510-($-$$) db 0

DW 0xAA55
4

3 に答える 3

3

フロッピー ドライブがあるかどうかを確認するには、GetEquipmentStatus BIOS 関数を使用します。

int 11h

AX レジスタに値を返します。ビット 6 と 7 を合わせて、システムに接続されているフロッピー ディスク ドライブの数を示します。

00 = 1 drive
01 = 2 drives
10 = 3 drives
11 = 4 drives

ビット 0 が ON の場合、ビット 6 と 7 のみを使用する

もう 1 つの方法は、 の BIOS 関数 01h を介してフロッピー ドライブのステータスを正常に取得できるかどうかを確認することですint 13h

mov dl, 0
mov ah, 01h
int 13h
cmp ah, 0
jne disk_error

DiskControllerStatusBitsの完全なリストを参照してくださいcmp ah, 0

于 2015-10-18T15:22:01.900 に答える
2

フロッピー ドライブが存在するかどうかを知る必要はありません。

デバイス 0 (または、ブート元として BIOS が指示したデバイス) がフロッピー ドライブのように動作するかどうかを知る必要があるだけです。デバイスがたまたま (たとえば) USB フラッシュまたはフロッピー ドライブをエミュレートする CD/DVD である場合、それで問題ありません。この目的のために、int 0x13, ah = 0x08, Get Drive Parametersを使用し、結果を調べます。

フロッピードライブが存在するかどうかを実際に知る必要がある場合。それからそれは全世界の痛みです。BIOS が正しく設定されていない (およびその CMOS が間違っている) 可能性があります。BIOS が認識していない、またはサポートさえしていない USB フロッピー ドライブが存在する可能性があります。

于 2015-10-17T18:48:30.747 に答える
2

In addition to the GetEquipmentStatus BIOS function mentionned by @user3144770 there's another BIOS function GetDiskType you can use.

mov dl, 0
mov ah, 15h
int 13h

If the carry flag is set there was an error. (Status in AH) If the carry flag is clear you get a value in AH that informs you about the drive specified in the DL argument.

AH=0 no drive
AH=1 floppy without change-line support
AH=2 floppy with change-line support
AH=3 hard disk
于 2015-10-22T10:38:27.703 に答える