首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

FAT32分区的引导程序,小弟我有点晕呀

2012-02-27 
FAT32分区的引导程序,我有点晕呀!7C00EB58JMP7C5A7C0290NOP7C5AFACLI7C5B33C9XORCX,CX【CX0】7C5D8ED1MOVS

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                         【过程返回】


[解决办法]
呵呵
------解决方案--------------------


学习了。

热点排行