📄 gethddparamm.asm
字号:
; 获取指定物理硬盘的参数
; 入口: DL 指定物理硬盘的盘号
; 出口: NC 操作完成, CX 柱面数, DH 磁头数, DL 每道扇区数, EAX 最大扇区号
; CY 硬盘出错或者硬盘不存在
GET_HD_PARA PROC NEAR
PUSHAD
MOV SI,DX
MOV AH,41H ;测试BIOS是否支持扩展INT13H
MOV BP,SP
MOV BX,55AAH
MOV DL,80H
INT 13H ;调用磁盘服务中断
CMP BX,0AA55H
SETZ AL ;返回标志字节正确则置1
AND AL,CL ;支持扩展INT13H(LBA方式)则CL位0有效
MOV DX,SI ;盘符
MOV ENHANCED,AL ;支持扩展INT13H则置1
MOV AH,08H
INT 13H ;获取物理硬盘的参数
JC SHORT GET_HD_ERR ;硬盘不存在
MOV AL,CL
INC DH
AND AL,3FH ;每道扇区数
XCHG CL,CH
MOV AH,DH ;磁头总数
SHR CH,06H ;柱面数的高2位
MOV [BP].REG_DX,AX ;当前硬盘的磁头数和每道扇区数
INC CX
MUL DH ;每柱面扇区数
MOV [BP].REG_CX,CX ;当前硬盘的柱面数
MOV DI,AX
MUL CX
SHL EDX,10H ;计算硬盘的最大扇区号
MOV DX,AX
DEC EDX ;从0号开始
CMP EDX,03FCH*00FFH*003FH-01H ;去掉备用柱面
MOV [BP].REG_EAX,EDX ;最大扇区号
JB SHORT GET_HD_RET ;未超出BIOS极限,最大扇区号有效
CMP ENHANCED,00H
JZ SHORT GET_HD_RET ;不支持扩展INT13H的LBA方式
MOV DX,SI ;盘符
MOV SI,OFFSET BUFFER1
MOV AH,48H
MOV WORD PTR [SI],001AH
INT 13H ;取硬盘参数
JC SHORT GET_HD_RET ;出错
MOV EAX,[SI+10H]
DEC EAX ;LBA方式返回的最大扇区号
MOV [BP].REG_EAX,EAX ;最大扇区号
INC EAX
PUSH EAX
POP AX
POP DX
DIV DI ;总扇区数除以每柱面扇区数
MOV [BP].REG_CX,AX ;得柱面数
GET_HD_RET: CLC
GET_HD_ERR: POPAD
RET
GET_HD_PARA ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -