📄 boot.asm
字号:
;Program Name: STRAP.ASM
;
CR EQU 0DH
LF EQU 0AH
BIO_SEG EQU 800H
BootAddr EQU 7C00H
IBMBIO_LenAddr EQU 55
NumberOfHead_RD EQU 7C2AH
StartingSector_RD EQU 21H
NumberOfCylinder_RD EQU 7C39H
NumberOfSector_RD EQU 7C3BH
SectorsOfIBMBIO EQU 21H
SectorOfDataArea EQU 21H
SectorOfRootDir EQU 19
;NumberOfDrive EQU 7DFDH
;
Bootstrap SEGMENT 'CODE'
ASSUME CS:BOOTSTRAP,DS:BOOTSTRAP
ORG 0
Boot PROC FAR
JMP CodeBegin
NOP
OEMMARK DB 'LIULH3.3'
BytesPerSector DW 512
SectorsPerCluster DB 1
ReservedSectors DW 1
NumberOfFAT DB 2
TotalOfRootDirectory DW 224
TotalOfSector DW 2880
MediaTypeByte DB 0F0H
SectorsPerFAT DW 9
SectorsPerTrack DW 18
NumberOfHead DW 2
HiddenSectors DW 0
DW 0
numSectorsHuge DW 0
DW 0
driveNum DB 0
reserved DB 0
signature DB 0
volumeID DB '0001'
volumeLabel DB 'NO NAME '
fileSysType DB 'FAT12 '
;
CodeBegin:
CLI
XOR AX,AX
MOV SS,AX
MOV SP,BootAddr ;建立堆栈指针
PUSH SS
POP ES
PUSH SS
POP DS
; XOR DX,DX
; MOV SI,offset LOAD+BootAddr ;
; CALL MSG ;
;
SystemDisk:
; XOR DX,DX
; MOV SI,offset READ+BootAddr ;
; CALL MSG ;
MOV BX,700H ;
;ReadBIO:
; MOV AX,DS:StartingSector_RD ;
; CALL Set_Para ;
; MOV AL, 1 ;
;ReadBIO1:
; CALL Read_Disk ;
Jmp_IBMBIO:
MOV AH,02
MOV AL,01
MOV DL,0
MOV DH,1
MOV CH,0
MOV CL,16
INT 13H
XOR DX,DX
; MOV SI,700H ;
; CALL MSG ;
DB 0EAH ;
DW 0,BIO_SEG ;
;JMP FAR PTR 10H:0 ;
Boot ENDP
;======================================================================================
;功 能:显示DS:SI制定的以0结尾的字符串
;入口参数:DS:SI指向字符串
;出口参数:无
;======================================================================================
MSG PROC NEAR
Output_Info:
LODSB ;AL<-将要输出的字符
; OR AL,AL ;若是字符串结尾府,则直接返回
; JZ Return ;
PUSH AX
XOR AH,AH ;等待键盘按键
INT 16H
POP AX ;
MOV AH,0EH ;以电传凡是显示AL指定的字符
MOV BX,7 ;
INT 10H ;
JMP SHORT Output_Info ;
Return:
RET
MSG ENDP
;=======================================================================================
;功 能:计算请求INT 13H 磁盘操作的入口参数
;入口参数:AX=起始扇区号
;出口参数:无
;=======================================================================================
Set_Para PROC NEAR
XOR DX,DX ;计算并保存道内扇区号
DIV WORD PTR DS:SectorsPerTrack+BootAddr ;
INC DL ;
MOV DS:NumberOfSector_RD,DL ;
XOR DX,DX ;计算圆柱面号和磁头号
DIV WORD PTR DS:NumberOfHead+BootAddr ;
MOV DS:NumberOfHead_RD,DL ;保存磁头号
MOV DS:NumberOfCylinder_RD,AX ;保存圆柱面号
RET
Set_Para ENDP
;=======================================================================================
;功 能:读取AL个扇区数的磁盘文件内容
;入口参数:ES:BX指向传送缓冲区,AL=扇区数
;出口参数:无
;=======================================================================================
Read_Disk PROC NEAR
MOV AH,2 ;置读盘操作码
MOV DX,DS:NumberOfCylinder_RD ;DX<-圆柱面号
MOV CL,6 ;
SHL DH,CL ;
OR DH,DS:NumberOfSector_RD ;道内扇区号
MOV CX,DX ;
XCHG CH,CL ;
MOV DL,0 ;DL<-驱动器台号
MOV DH,DS:NumberOfHead_RD ;DH<-磁头号
INT 13H ;请求读磁盘操作
RET
Read_Disk ENDP
LOAD DB 'LOADING......',CR,LF,0
READ DB 'READING......',CR,LF,0
IO DB 'IOING......',CR,LF,0
IO1 DB 'IO1ING......',CR,LF,0
;
NumberOfDrive DB 0 ;引导盘驱动器号
DB 10DH DUP(0)
DW 0AA55H ;引导扇区标志字
;
Bootstrap ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -