📄 jmboot.txt
字号:
c:\>debug
-a 100
cs:0100 CLI ;清中断
cs:0101 XOR AX,AX ;0->ax
cs:0103 PUSH AX
cs:0104 POP ES ;0->es
cs:0105 PUSH AX
cs:0106 POP DS ;0->ds
cs:0107 MOV AX,0003
cs:010A INT 10 ;清屏
cs:010C MOV AH,01
cs:010E MOV CL,10
cs:0110 MOV CH,11
cs:0112 INT 10 ;隐藏光标
cs:0114 PUSH CS
cs:0115 POP ES ;es=cs
cs:0116 MOV AX,1100
cs:0119 MOV BX,1000 ;字符集编号
cs:011C MOV CX,000A ;显示5个字符
cs:011F MOV DX,0080 ;开始字符编号
cs:0122 MOV BP,07C0
cs:0125 MOV ES,BP ;es=7c0;
cs:0127 MOV BP,00B0 ;点阵字符地址指针
cs:012A INT 10
cs:012C MOV BH,00 ;显示页
cs:012E MOV BL,8E ;字符颜色属性
cs:0130 MOV AL,80 ;开始显示的字符编码
cs:0132 PUSH CX
cs:0133 MOV AH,09
cs:0135 MOV CX,0001
cs:0138 INT 10 ;显示单个字符
cs:013A MOV AH,03
cs:013C INT 10 ;读光标位置
cs:013E MOV AH,02
cs:0140 INC DL
cs:0142 INT 10 ;置光标向右移一位
cs:0144 INC AL
cs:0146 POP CX
cs:0147 LOOP 0132
cs:0149 XOR AX,AX
cs:014B MOV ES,AX ;0->ax
cs:014D MOV DS,AX
cs:014F MOV SI,7DF0 ;es=ds=0;
cs:0152 XOR DI,DI ;7df0->si
cs:0154 XOR AH,AH ;di=0
cs:0156 INT 16
cs:0158 CMP AL,0D
cs:015A JZ 0169 ;是<回车>符吗?
cs:015C AND AL,A6
cs:015E MOV [SI],AL
cs:0160 INC SI
cs:0161 INC DI
cs:0162 MOV AX,0E2A
cs:0165 INT 10 ;显示"*"号
cs:0167 JMP 0154
cs:0169 CMP DI,+05 ;判断口令长度
cs:016C JNZ 017C
cs:016E MOV SI,7DF0
cs:0171 MOV DI,7CA7
cs:0174 MOV CX,0005 ;缺省为5个字符
cs:0177 CLD
cs:0178 REPZ
cs:0179 CMPSB
cs:017A JZ 018C
cs:017C DEC BYTE PTR [7C88]
cs:0180 MOV AL,[7C88]
cs:0183 CMP AL,00 ;判断三次口令
cs:0185 JNZ 01A4
cs:0187 JMP FFFF:0003 ;重新启动
cs:018C MOV AX,0003
cs:018F INT 10 ;成功清屏
cs:0191 MOV AX,0201
cs:0194 MOV BX,0600 ;读到偏移600处
cs:0197 MOV CX,0002 ;读0面0道2扇
cs:019A MOV DX,0080
cs:019D INT 13
cs:019F JMP 0000:0600 ;跳0000:600处执行
cs:01A4 JMP 0107
;第二扇区加载的数据如下:
cs:01A7 JMP 024C
cs:01AA MOV ES,AX
cs:01AC MOV DS,AX ds=es=0;
;保存int13中断的入口地址
cs:01AE MOV AX,[004C]
cs:01B1 MOV [0682],AX
cs:01B4 MOV AX,[004E]
cs:01B7 MOV [0684],AX
;减少内存,驻留程序
cs:01BA MOV AX,[0413]
cs:01BD SUB AX,0001
cs:01C0 MOV [0413],AX
cs:01C3 MOV CL,06
cs:01C5 SHL AX,CL
;将新的int13驻留高端内存
cs:01C7 PUSH AX
cs:01C8 MOV DI,0000
cs:01CB MOV SI,0646
cs:01CE MOV CX,0040
cs:01D1 XOR AX,AX
cs:01D3 MOV DS,AX
cs:01D5 MOV AL,[SI]
cs:01D7 POP DS
cs:01D8 PUSH DS
cs:01D9 MOV [DI],AL
cs:01DB INC DI
cs:01DC INC SI
cs:01DD LOOP 01D1
;修改int13入口地址
cs:01DF MOV AX,0000
cs:01E2 MOV DS,AX
cs:01E4 MOV [004C],AX
cs:01E7 POP AX
cs:01E8 MOV [004E],AX
cs:01EB JMP 022D
;修改int13片段如下
cs:01ED PUSHF
cs:01EE CMP DL,FF ;虚拟一个驱动器号
cs:01F1 JNZ 01F7
cs:01F3 MOV DL,80
cs:01F5 JMP 0227
cs:01F7 CMP DL,80
cs:01FA JNZ 0227
cs:01FC CMP DH,00
cs:01FF JNZ 020A
cs:0201 CMP CX,+01 ;判断是否0面0道1扇区
cs:0204 JNZ 0216
cs:0206 MOV DH,01 ;是则去读1面0道1扇区
cs:0208 JMP 0220
cs:020A CMP DH,01
cs:020D JNZ 0227
cs:020F CMP CX,+01
cs:0212 JNZ 0227
cs:0214 JMP 0220
cs:0216 CMP CX,+02 ;判断是否0面0道2扇区
cs:0219 JNZ 0227
cs:021B MOV CX,0003 ;是则去读0面0道3扇区
cs:021E JMP 0227
cs:0220 CMP AH,03 ;对特定扇区写保护
cs:0223 JNZ 0227
cs:0225 MOV AH,02
cs:0227 POPF
cs:0228 JMP 0000:0000 ;int13中断新的入口地址
cs:022D MOV AX,0E07 ;响铃提示
cs:0230 INT 10
cs:0232 CLI
cs:0233 XOR AX,AX
cs:0235 MOV ES,AX
cs:0237 MOV DS,AX
cs:0239 MOV AX,0201
cs:023C MOV BX,7C00 ;读到7c00处
cs:023F MOV CX,0001 ;读1面0道1扇区
cs:0242 MOV DX,0180
cs:0245 INT 13
cs:0247 JMP 0000:7C00 ;跳0000:7c00处执行
cs:024C MOV AH,04
cs:024E INT 1A
cs:0250 CMP DL,26 ;判断是否26日
cs:0253 JNZ 026E
cs:0255 INC DL
cs:0257 MOV AH,05
cs:0259 INT 1A
cs:025B MOV BYTE PTR [7f0],ee ;设置标志
cs:0260 MOV AX,0301
cs:0263 MOV BX,0600
cs:0266 MOV CX,0002
cs:0269 MOV DX,0080
cs:026C INT 13 ;回写
cs:026E CMP DL,27 ;判断是否27日
cs:0271 JNZ 0279
cs:0273 CLI
cs:0274 XOR AX,AX
cs:0276 JMP 01AA
cs:0279 PUSH CS
cs:027A POP DS
cs:027B MOV SI,07F0
cs:027E MOV AL,[SI]
cs:0280 CMP AL,EE ;有标志
cs:0282 JNZ 0273
cs:0284 DEC DL ;日期减一
cs:0286 MOV AH,05
cs:0288 INT 1A
cs:028A MOV BYTE PTR [7f0],00 ;清标志
cs:028F MOV AX,0301
cs:0292 MOV BX,0600
cs:0295 MOV CX,0002
cs:0298 MOV DX,0080
cs:029B INT 13 ;回写
cs:029D JMP 0273 ;继续引导
cs:029F
-n jmboot.dat
-r cx
:19f
-w 100
-q
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -