繁体   English   中英

检查软盘是否可用汇编语言。 引导加载程序

[英]Check if floppydisk is available or not in Assembly language. Bootloader

我有一个关于如何使用汇编语言检查软盘驱动器是否可用的问题? 我检查了 RAM 内存是否足够。 但我不知道如何检查软盘驱动器是否可用。 我试过这个: CMP AH,0 JNE disk_error ,但是当我把它放在检查 RAM 之后时,没有任何反应。 当我输入 continueToLoad: CMP AX,0 JNE fatal_disk_error 时,它工作正常,但加载栏后出现错误消息。 加载程序 错误

主要的:

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

读取键:

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 $

加载内核:

;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 

变蓝:

MOV BL,1001b

JMP 打印加载器

变绿:

MOV BL,1010b

JMP 打印加载器

更改为红色:

MOV BL,0100b

JMP 打印加载器

继续加载:

    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内核:0

可再生能源

调用打印加载器

打印加载器:

    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

清屏:

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

可再生能源

按键:

;read a key
MOV AH,0
INT 0x16

可再生能源

打印字符串:

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

可再生能源

重启:

db 0x0ea
dw 0x0000
dw 0xffff

可再生能源

等待2秒:

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

可再生能源

致命磁盘错误:

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

可再生能源

StrLoadKernel: db "Press ENTER to load the KERNEL "

长度等于 $-StrLoadKernel

StrReboot: db "Press ESC to restart "

length2 equ $-StrReboot

StrErrorRAM:db“加载已取消!错误:RAM < 64mb。”

length3 equ $-StrErrorRAM

StrLoading:db“正在加载...”

length4 equ $-StrLoading

disk_error: db "软盘错误!按任意键... "

length5 equ $-disk_error

press_key: db "按任意键重启!"

length6 equ $-press_key

内核设备 1000h

符号:db 219

符号长度等于 $-symbol

数分贝 25

通过 db 0

510-($-$$) db 0

数据仓库 0xAA55

您无需知道软盘驱动器是否存在。

您只需要知道设备 0(或者也许是 BIOS 告诉您从其启动的设备)是否像软盘驱动器一样运行; 如果该设备恰好是(例如)USB 闪存或模拟软盘驱动器的 CD/DVD,那就没问题了。 为此,使用int 0x13, ah = 0x08, Get Drive Parameters并检查结果。

如果您确实需要知道软盘驱动器是否存在; 那么这是一个痛苦的整个世界。 BIOS 可能配置错误(及其 CMOS 错误),可能存在 BIOS 不知道和/或什至不支持的 USB 软盘驱动器等。

要确定您是否有软盘驱动器,请使用GetEquipmentStatus BIOS 功能。

int 11h

它返回 AX 寄存器中的一个值。 位 6 和位 7 一起告诉您有多少软盘驱动器连接到系统。

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

如果第 0 位为 ON,则仅使用第 6 位和第 7

另一种方法是查看是否可以通过int 13h BIOS 功能 01h 成功获取软驱的状态。

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

请查阅DiskControllerStatusBits的完整列表,因为仅仅cmp ah, 0可能会被证明有点简单。

除了通过@ user3144770 mentionned的GetEquipmentStatus BIOS功能还有另一个BIOS功能GetDiskType就可以使用。

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

如果设置了进位标志,则存在错误。 (AH 中的状态)如果进位标志清零,您将在 AH 中获得一个值,该值通知您在 DL 参数中指定的驱动器。

AH=0 no drive
AH=1 floppy without change-line support
AH=2 floppy with change-line support
AH=3 hard disk

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM