FAT32分区的引导程序,我有点晕呀!
7C00 EB58 JMP 7C5A
7C02 90 NOP
7C5A FA CLI
7C5B 33C9 XOR CX,CX ;【CX=0】
7C5D 8ED1 MOV SS,CX ;【SS=0】
7C5F BCF87B MOV SP,7BF8 ;【SP=7BF8,做为栈顶】
7C62 8EC1 MOV ES,CX ;【ES=0】
7C64 BD7800 MOV BP,0078 ;【BP=0078,1EH号中断向量的地址】
7C67 C57600 LDS SI,[BP+00] ;【取1EH号中断向量入DS:SI 】
7C6A 1E PUSH DS ;【指向一个11字节的磁盘参数表】
7C6B 56 PUSH SI ;【取到后压入堆栈中保存】
7C6C 16 PUSH SS ;
7C6D 55 PUSH BP ;【保存地址0000:0078H 】
此时【SP=7BF8-8=7BF0】
7C6E BF2205 MOV DI,0522 ;【DI=0522】
7C71 897E00 MOV [BP+00],DI ;【[0000:0078]=0522】
7C74 894E02 MOV [BP+02],CX ;【[0000:007A]=0】
7C77 B10B MOV CL,0B ;【CL=0B】
7C79 FC CLD ;【清方向位】
7C7A F3 REPZ ;
7C7B A4 MOVSB ;【将磁盘参数表复制到0000:0522H处】
7C7C 8ED9 MOV DS,CX ;【CX=0,DS=0】
7C7E BD007C MOV BP,7C00 ;【BP=7C00】
7C81 C645FE0F MOV BYTE PTR [DI-02],0F ;【修改参数表中 "磁头定位时间 " 】
7C85 8B4618 MOV AX,[BP+18]
; 【BP=7C00,BP+18,就是取每磁道扇区数给AX=003F(63个扇区)】
7C88 8845F9 MOV [DI-07],AL 【修改参数表中 "每磁道扇区数】
7C8B 384E40 CMP [BP+40],CL 【BP=7C00,BP+40,就是磁盘编号,硬盘是80,软盘是00】
7C8E 7D25 JGE 7CB5 【大于或等于就跳,也就是说不是硬盘就跳0000:7CB5】
7C90 8BC1 MOV AX,CX 【CX=0,AX=0】
7C92 99 CWD【把AX中的字的符号扩展到DX中去,AX=0,DX=0】
7C93 BB0007 MOV BX,0700 【BX=0700】
7C96 E89700 CALL 7D30
【调用7D30处子程序】【将IP入栈,SP=SP-2,SP=7BEE】
7D30 41 INC CX ;【CX++,CX=1】
7D31 56 PUSH SI
7D32 666A00 * PUSH DWord Ptr 0
7D35 52 PUSH DX
7D36 50 PUSH AX
7D37 06 PUSH ES
7D38 53 PUSH BX
7D39 6A01 * PUSH 1
7D3B 6A10 * PUSH 10【SP=SP-2-4-2*4-1-1=7BDE】
7D3D 8BF4 MOV SI,SP 【SI=7BDE】
7D3F 60 * PUSHA ;
7D40 807E020E CMP BYTE PTR [BP+02],0E
【此处检测是否可以使用扩展int13,BP=7C00,[7C02]=90】
7D44 7504 JNZ 7D4A ; 【不等时跳到7D4A】
7D46 B442 MOV AH,42
7D48 EB1D JMP 7D67
7D4A 91 XCHG CX,AX【AX=1,CX=0】
7D4B 92 XCHG DX,AX【DX=1,AX=0】
7D4C 33D2 XOR DX,DX【DX=0】
7D4E F77618 DIV WORD PTR [BP+18] 【BP=7C00,[7C18]=003F,(DX)(AX)/003F=> AX=商=0,DX=余数=0】
7D51 91 XCHG CX,AX【CX=0,AX=0】
7D52 F77618 DIV WORD PTR [BP+18]【AX=0,DX=0】
7D55 42 INC DX【DX=1】
7D56 87CA XCHG CX,DX【CX=1,DX=0】
7D58 F7761A DIV WORD PTR [BP+1A]【BP=7C00,[7C1A]=磁头数量,结果AX=0,DX=0】
7D5B 8AF2 MOV DH,DL ;【DH=0,DL=0】
7D5D 8AE8 MOV CH,AL ;【CH=0,AL=0】
7D5F C0CC02 * ROR AH,02 ;【AH=0】
7D62 0ACC OR CL,AH ;【CL=1】
7D64 B80102 MOV AX,0201 ; AX=0201,准备读】
7D67 8A5640 MOV DL,[BP+40] ; 【BP=7C00,[7C40]=磁盘编号,硬盘是80,软盘是00,DL=80】
7D6A CD13 INT 13 ; 【读MBR到ES:BX,也就是0000:0700处】
【CF=0——操作成功,AH=00H,AL=传输的扇区数】
7D6C 61 * POPA ;
7D6D 8D6410 LEA SP,[SI+10]【SI=7BDE,SP=[7BEE],将7BEE处有效地址给SP】
7D70 5E POP SI【SI=0110】
7D71 720A JB 7D7D 【CF=1就跳到7D7D,如果int13正确就不跳了】
7D73 40 INC AX【AX=1,因为AX <> 0,所以ZF=0,AX=0时,ZF=1】
7D74 7501 JNZ 7D77【ZF=0时就跳到7D77,此时就跳了,测试过的】
7D76 42 INC DX
7D77 035E0B ADD BX,[BP+0B] 【BP=7C00,[7C0B]=每扇区有多少字节=0200,BX=090】
7D7A 49 DEC CX 【CX--,CX=0,所以ZF=1】
7D7B 75B4 JNZ 7D31 【ZF=0时就跳到7D31】
7D7D C3 RET 【过程返回】
[解决办法]
呵呵
------解决方案--------------------
学习了。