level 1
mqron
楼主
RG 0600H
XOR AX,AX ; AX = 0
MOV DS,AX ; 设置数据段寄存器 DS:SI
MOV ES,AX ; 设置附加段寄存器 ES:DI
MOV SS,AX ; 设置堆栈段寄存器
MOV SI,7C00H ;源地址 MOV ES,AX ; 设置附加段寄存器 ES:DI
MOV DI,0600h; DI = 0600H 将MBR代码移动到0600H处
MOV CX,512 ; 待移动的字节数
CLD ; 方向为向前递增
REP MOVSB
;call 0:RealStart
JMP 0:RealStart
; 真正开始
RealStart:
MOV BYTE[BOOTDRIVER] , dl ;保存得到启动的驱动器号 CMP BYTE[Password],0
JZ START
.Password:
MOV SI,PBuffer
.KET:
MOV AH,0H
INT 16H ;接收按键
CMP AL,08H
JZ .DEL ; ;删除
CMP AL,0DH
JZ .ENT ;回车
CMP AL,33
JNG .KET
CMP AL,125
JG .KET
CMP SI,PBuffer+8
JNL .KET
MOV BYTE[SI],AL
INC SI
MOV BYTE[SI],0
JMP .KET
.DEL:
CMP SI,PBuffer
JZ .KET
DEC SI
MOV BYTE[SI],0
JMP .KET
.ENT:
PUSHA
MOV SI,Password
MOV DI,PBuffer
.EN1:
MOV AL,BYTE[SI]
CMP AL,0
JZ START
CMP BYTE[DI],AL
JNZ .EN1L
INC SI
INC DI
JMP .EN1
.EN1L:
POPA
JMP .Password
.ERR:
START:
MOV AH,41H ;====================================================================
MOV BX,055AAH ; 检查是否支持磁盘中断INT 13H的扩展
INT 13H ;====================================================================
JC .LookupActive ; 如果失败,进位标志为1
MOV BYTE [DiskExtension],0x1 ; 设置支持磁盘扩展标志.LookupActive: ; 查找激活分区
MOV SI,bootid ; 指向分区表.CheckNext: ;检查激活分区
MOV AL,[SI]
CMP BYTE [SI],0x80 ; 检查该分区是否激活
JZ .LoadBootSector ; 装载激活分区的引导扇区
ADD SI,10H ; 指向下一个分区表项
INC BYTE[ActivePartition]
CMP BYTE[ActivePartition],3
JG .Missing ; 没有找到激活分区
JMP .CheckNext
.LoadBootSector: ; 装载激活分区的引导扇区
MOV BL,BYTE [ActivePartition] ; 载入激活分区表项索引
MOV AH,0
MOV AL,0x10
MUL BL
MOV SI,bootid
ADD SI,AX
MOV DL,BYTE [BOOTDRIVER] ; 设置驱动器号 CMP BYTE [DiskExtension],01H ; 检查是否支持扩展磁盘调用
JNZ .NoDiskExtension
; 使用扩展磁盘调用读取引导扇区
; INT 13H
; AH = 42H
; DL = Drive Number
; DS:SI = 指向磁盘地址包的指针
MOV AX,WORD[SI+8]
MOV WORD[DAP_SECTOR_LOW],AX
MOV AX,WORD[SI+10]
MOV WORD[DAP_SECTOR_LOW+2],AX
MOV SI,DAP_PACKET_SIZE
MOV AH,42H
INT 13H
JC .Error
JMP .CheckBootSector
2011年10月15日 06点10分
1
XOR AX,AX ; AX = 0
MOV DS,AX ; 设置数据段寄存器 DS:SI
MOV ES,AX ; 设置附加段寄存器 ES:DI
MOV SS,AX ; 设置堆栈段寄存器
MOV SI,7C00H ;源地址 MOV ES,AX ; 设置附加段寄存器 ES:DI
MOV DI,0600h; DI = 0600H 将MBR代码移动到0600H处
MOV CX,512 ; 待移动的字节数
CLD ; 方向为向前递增
REP MOVSB
;call 0:RealStart
JMP 0:RealStart
; 真正开始
RealStart:
MOV BYTE[BOOTDRIVER] , dl ;保存得到启动的驱动器号 CMP BYTE[Password],0
JZ START
.Password:
MOV SI,PBuffer
.KET:
MOV AH,0H
INT 16H ;接收按键
CMP AL,08H
JZ .DEL ; ;删除
CMP AL,0DH
JZ .ENT ;回车
CMP AL,33
JNG .KET
CMP AL,125
JG .KET
CMP SI,PBuffer+8
JNL .KET
MOV BYTE[SI],AL
INC SI
MOV BYTE[SI],0
JMP .KET
.DEL:
CMP SI,PBuffer
JZ .KET
DEC SI
MOV BYTE[SI],0
JMP .KET
.ENT:
PUSHA
MOV SI,Password
MOV DI,PBuffer
.EN1:
MOV AL,BYTE[SI]
CMP AL,0
JZ START
CMP BYTE[DI],AL
JNZ .EN1L
INC SI
INC DI
JMP .EN1
.EN1L:
POPA
JMP .Password
.ERR:
START:
MOV AH,41H ;====================================================================
MOV BX,055AAH ; 检查是否支持磁盘中断INT 13H的扩展
INT 13H ;====================================================================
JC .LookupActive ; 如果失败,进位标志为1
MOV BYTE [DiskExtension],0x1 ; 设置支持磁盘扩展标志.LookupActive: ; 查找激活分区
MOV SI,bootid ; 指向分区表.CheckNext: ;检查激活分区
MOV AL,[SI]
CMP BYTE [SI],0x80 ; 检查该分区是否激活
JZ .LoadBootSector ; 装载激活分区的引导扇区
ADD SI,10H ; 指向下一个分区表项
INC BYTE[ActivePartition]
CMP BYTE[ActivePartition],3
JG .Missing ; 没有找到激活分区
JMP .CheckNext
.LoadBootSector: ; 装载激活分区的引导扇区
MOV BL,BYTE [ActivePartition] ; 载入激活分区表项索引
MOV AH,0
MOV AL,0x10
MUL BL
MOV SI,bootid
ADD SI,AX
MOV DL,BYTE [BOOTDRIVER] ; 设置驱动器号 CMP BYTE [DiskExtension],01H ; 检查是否支持扩展磁盘调用
JNZ .NoDiskExtension
; 使用扩展磁盘调用读取引导扇区
; INT 13H
; AH = 42H
; DL = Drive Number
; DS:SI = 指向磁盘地址包的指针
MOV AX,WORD[SI+8]
MOV WORD[DAP_SECTOR_LOW],AX
MOV AX,WORD[SI+10]
MOV WORD[DAP_SECTOR_LOW+2],AX
MOV SI,DAP_PACKET_SIZE
MOV AH,42H
INT 13H
JC .Error
JMP .CheckBootSector