Ch 34 µwºÐ (3) ÀÉ®×Â÷´²


²¤¶

¤W¤@³¹´£¨ìÅÞ¿èºÏºÐªº²Õ¦¨¡A¦ý¬O¨S¦³µ{¦¡¹ê§@¡AÅã±oµê¯B¡A³o¤@³¹±N§Q¥Î¤W¤@³¹ªº¤º®e¼¶¼g¤@­ÓÀˬd¬Y­ÓÀɮשΤl¥Ø¿ýùتº©Ò¦³Àɮ׬O§_¦s©ñ¦b³sÄòªººÏ°Ï¤p¤ì°¸ºÙ¦¹µ{¦¡¬° DFC.EXE ( Dose File Continue? ¤§·N )¡C

¦ó¿×¡yÀÉ®×Â÷´²¡z¡H

²³©Ò©Pª¾¡ADOS »P Windows 9x/Me ¦b§â·sÀɮצs¤JµwºÐ©Î³nºÐ®É¡A¬O¥ÑµwºÐ©Î³nºÐ«e­±ºÏÂO¶}©l·j´M¡A¥u­n§ä¨ì¨S¦³¨Ï¥ÎªººÏÂO´N§â¸ê®Æ¼g¨ì¸ÓºÏÂO¡A¦Ó¤£¥h²z·|³o­Ó¨S¦³¥ÎªººÏÂO¬O§_¶ë±o¤UÀɮסA¦pªG¶ë¤£¤U¡A¨t²Î¤S·|¦A¥h´M§ä¥t¤@­Ó¨S¦³¨Ï¥ÎªººÏÂO¡A¹³³oºØÀɮפ£¬O¦s©ñ¦b³sÄòºÏÂOªº±¡§ÎºÙ¤§¬°ÀÉ®×Â÷´² ( fragment )¡C¦pªGµwºÐ¸g¹Lªø®É¶¡¨Ï¥Î¡A¸g¦~²Ö¤ëªº·s¼WÀÉ®×»P§R°£ÀɮסA³oºØ²{¶H´N·|§óÄY­«¡C¤@¯ëªº»¡ªk¬O¡A¦pªGºÏºÐ¦³³\¦hÀÉ®×Â÷´²ªº¸Ü¡A¦s¨úÀɮ׮ɡAºÏÀY´N·|ÀHµÛÂ÷´²ªº¦a¤è²¾°Ê¦Ó­°§C®Ä²v¡A©Ò¥HÀ³¸Ó©w´Á¥Î¡yºÏºÐ­«²Õµ{¦¡¡z§â¦s©ñ©ó´²¸¨ºÏÂOªºÀÉ®×·h²¾¨ì³sÄòªººÏÂO¡C

DFC.EXE

³o¤@³¹¤p¤ì°¸¹ê§@¤@­Ó¯àÆ[¹îÀɮ׬O§_¦s©ó³sÄòºÏÂOªºµ{¦¡¡ADFC.EXE¡C³o­Óµ{¦¡¤£¯à·h²¾ºÏºÐ¤Wªº¸ê®Æ¦Ó¨Ï¤§¦¨¬°¦s©ó³sÄòªººÏÂO¡A¦]¬°­n¥[¤W³o­Ó¥\¯à¡A·|¨Ï±oµ{¦¡¤Óªø¡A©Ò¥H¤p¤ì°¸¤]Ãi±o¼g ( ¥t¥~ÁÙ¦³¤@­Ó­ì¦]¡A«Ü®e©ö´N§â¨t²Î·dÃa )¡A¤p¤ì°¸¥u¼g¯àÆ[¹îÀɮ׸ê®Æ¤Î¬O§_³sÄò¡A¦pªG¤£³sÄò¡A¨º»ò·|Åã¥ÜÀɮ׳Q¤À¦¨´X­Ó³sÄòªººÏÂO¦s©ñ¡C

DFC.EXE ¥²¶·¦b Win 9x/Me ©Î DOS §@·~¨t²Î¤U¨Ï¥Î¡A¨ä¥Îªk¬O¡G

dfc ºÏºÐ¾÷¦W:\¸ô®|¦W

Á|­Ó¨Ò¤l¨Ó»¡¡A¦pªG±z·QÀˬd c:\masm32\example1\3dframes ¤l¥Ø¿ýùتºÀɮ׬O§_³sÄò¡A¥i¦b DOS ¼Ò¦¡¤U¿é¤J¡ydfc c:\masm32\example1\3dframes¡z¤Î Enter Áä«á¡Adfc °õ¦æµe­±¦p¤U¡G

DFC.EXE °õ¦æµe­±

DFC.EXE ·|¦Û°Ê§â¤p¼gÅܤj¼g¡A¦ý¬O¨S¦³°µ¿ù»~Àˬd¡A¤]¤£¤ä´©ªøÀɦW¡A©Ò¥H¸ô®|¤ºªº¤l¥Ø¿ý¦WºÙ±o¥Î 8.3 ®æ¦¡¡A¦ÓÅã¥ÜªºÀɦW¤]³£¬OµuÀɦW®æ¦¡¡A¤W¹Ï¤¤ªº«ØÀɤé´Á¬O±Ä¥Î¥Á°ê¬ö¤¸¡A«ØÀɮɶ¡¬O 24 ®É¨î¡A©Ò¦³¼Æ­È¬Ò¥H¤Q¶i¦ìÅã¥Ü¡A²Å¦X¤HÃþ²ßºD¡A¦ý¬OµwºÐ®e¶q¬O 1MB = 1048576 ¦ì¤¸²Õ­pºâ¥X¨Óªº¡C


­ì²z

¦p¦ó§PÂ_Àɮ׬O§_³sÄò¡H

ÀˬdÀɮ׬O§_Â÷´²¡A¥u»Ý­nÀˬd¦s©ñ³o­ÓÀɮתººÏÂO½s¸¹¬O§_³sÄò¡C¨C­ÓÀɮתº²Ä¹s­ÓºÏÂO½s¸¹¦s©ñ¦b FDB ùØ¡A¦Ó«á¸ÓÀɮתº²Ä¤@­Ó¡B²Ä¤G­Ó¡K¡K¨ì³Ì¥½¤@­ÓºÏÂO½s¸¹«h¦s©ñ¦b FAT ¬Û¹ïÀ³Äæ¦ìùØ¡Cµ{¦¡©Ò­n°µªº¬OÀˬd¸ÓÀɮתº²Ä¤@­ÓºÏÂO½s¸¹¬O§_¤ñ FDB ºÏÂO«ü¥Ü¾¹¦h¤@¡A²Ä¤G­ÓºÏÂO½s¸¹¬O§_¤ñ²Ä¤@­ÓºÏÂO½s¸¹¦h¤@¡A²Ä¤T­ÓºÏÂO½s¸¹¬O§_¤ñ²Ä¤G­ÓºÏÂO½s¸¹¦h¤@¡K¡Kª½¨ì³Ì¥½¤@­ÓºÏÂO¼Ð¸¹¬O§_¤ñ­Ë¼Æ²Ä¤G­ÓºÏÂO¼Ð¸¹¦h¤@¬°¤î¡A¦pªG³£¬O¦h¤@ªº¸Ü¡A¨º»ò³o­ÓÀÉ®×´N¬O³sÄòªº¡C¦³Ãö¦p¦ó¨ú±o½s¸¹ N ªº FAT Äæ¦ì¥i¥H°Ñ¦Ò«e¤@³¹¨ú±o½s¸¹ N ªº FAT Äæ¦ì¤º®e¡C

µ{¦¡¬yµ{

¨º»ò¡A­n«ç»ò¤~¯à¨ú±o²Ä¹s­ÓºÏÂO©O¡H²Ä¹s­ÓºÏÂO¦ì©ó¤l¥Ø¿ýºÏ°Ïªº FDB ¤º¡A¦]¦¹¤p¤ì°¸ªº°µªk¬O¥Ñ®Ú¥Ø¿ý¶}©l¡A¨Ì¾Ú¨Ï¥ÎªÌ©Ò¿é¤Jªº¸ô®|¡A¨Ì¦¸´M§ä²Å¦Xªº¤l¥Ø¿ý¡AµM«á¤Á´«¨ì³o­Ó¤l¥Ø¿ý¡A¦A·j´M³o­Ó¤l¥Ø¿ý²Å¦Xªº¤l¥Ø¿ý¦WºÙ©ÎÀɮסAª½¨ì¨ì¹F¥Ø¼Ð¤l¥Ø¿ý¬°¤î¡C­Y¤¤¶¡¦³¤£²Å¦Xªº¤l¥Ø¿ý¦W¡Aªí¥Ü¨Ï¥ÎªÌ©Ò¿é¤Jªº¸ô®|¤£¦s¦b¡A«h©ó¿Ã¹õ¤¤¦L¥X¡yÀɮשΤl¥Ø¿ý¤£¦s¦b¡z°T®§¡C

¨Ò¦p¤W¨Ò¡A­nÀˬd¡yc:\masm32\example1\3dframes¡z¤l¥Ø¿ýùتºÀɮ׬O§_³sÄò¡Aµ{¦¡¥ý¸ü¤J®Ú¥Ø¿ý¡A¦b®Ú¥Ø¿ýºÏÂO¤º²³¦hªº FDB ¤¤·j´M¡ymasm32¡z¤l¥Ø¿ý¡A¦pªG¥¼§äµÛ«h¦L¥X¡yÀɮשΤl¥Ø¿ý¤£¦s¦b¡z¦r¦ê¨Ãµ²§ôµ{¦¡¡C¦pªG§äµÛ¤F¡A«K¨Ì¾Ú¨ä FDB¡A¸ü¤J masm32 ¤l¥Ø¿ýºÏÂO¡AµM«á¦b¦¹ºÏÂO´M§ä§t¦³ example1 ¤l¥Ø¿ýªº FDB¡K¡K¦p¦¹¤@ª½¨ì§ä¨ì 3dframes ¥Ø¼Ð¤l¥Ø¿ý¬°¤î¡C

¦b·j´M²Å¦Xªº¤l¥Ø¿ý¦WºÙªº¹Lµ{¤¤¡A¦pªG FDB ªº²Ä¹s­Ó¦r¤¸¬° 00¡Aªí¥Ü¥H«áªº FDB ³£¬O¥¼¨Ï¥Î¡A¥i°±¤î·j´M¡A³o¤]ªí¥Ü¨Ï¥ÎªÌ¿é¤Jªº¤l¥Ø¿ý¤£¦s¦b¡C¦ý¦pªG¤l¥Ø¿ýÀɮ׫ܦh®É¡A¨äºÏÂO¦³¥i¯à§t¦³¨â­Ó¥H¤W¡A©Ò¥H¦pªG·j´M§¹¤@­ÓºÏÂO¦Ó¨S§ä¨ì²Å¦Xªº¤l¥Ø¿ý¦WºÙ¡A¨Ã¤£ªí¥Ü¨Ï¥ÎªÌ¿é¤Jªº¤l¥Ø¿ý¤£¦s¦b¡A¦Ó¬O³o­Ó¤l¥Ø¿ýÁÙ¦³¥t¤@­ÓºÏÂO¡C³o®É¡A¤p¤ì°¸³]¤@­ÓÅܼơArd_flag¡A¨Ó°O¿ý³oºØ±¡§Î¡Ard_flag ªº¦ì¤¸¹s¬° 1 ®É¡Aªí¥Ü¦¹¥Ø¿ýÁÙ¦³¤U¤@ºÏÂO¡C

Ū¤J¤§ºÏ°Ï¦s©ñ³B

¤ÀªR¾ã­Óµ{¦¡¤§«á¡A·|µo²{¾ã­Óµ{¦¡·|Ū¨úªº³¡¥÷¬O±Ò°ÊºÏ°Ï¡B®Ú¥Ø¿ýºÏ°Ï©Î¤l¥Ø¿ýºÏ°Ï©M FAT °Ï°ìªººÏ°Ï¤TºØ±¡§Î¡G

  1. ·íµ{¦¡¤@°õ¦æ®É¡A«KÀ³¸Ó­n¸ü¤J±Ò°ÊºÏ°Ï¡A¥H½T©wÀɮרt²Î¡B«O¯d°Ï°ìºÏ°Ï¼Æ¡BFAT °Ï°ìªººÏ°Ï¼Æ¡B¡K¡Kµ¥ÅÞ¿èºÏºÐªº¸ê®Æ¡A¨ä¤¤ÁÙ¦³¤@¼Ë«Ü­«­nªº¡A´N¬O­pºâ®Ú¥Ø¿ý¦b¤@­ÓÅÞ¿èºÏ°Ï¥H¤Î®Ú¥Ø¿ý¤j¤p¡C±Ò°ÊºÏ°Ï¥u¦³¤@­ÓºÏ°Ï¡A©Ò¦û¾Ú°O¾ÐÅé¥u 512 ¦ì¤¸²Õ¡A¤£·|³y¦¨¤°»ò¼vÅT¡C¦Ó¥Bµ{¦¡©Ò»Ý­nªº¸ê®Æ¥u¬O BPB¡A¦@ 53 ¦ì¤¸²Õ¦Ó¤w¡A¤§«á´N¦A¤]¤£¶·Åª¨ú±Ò°ÊºÏ°Ï¤F¡A©Ò¥H¦s©ñ±Ò°ÊºÏ°Ïªº°O¾ÐÅé¥i¥H­«½Æ¨Ï¥Î¡C

  2. ±µ¤U¨Ó¬OŪ¨ú®Ú¥Ø¿ý¡C¹ï FAT32 ¦Ó¨¥¡A¥¦§â®Ú¥Ø¿ý¬Ý¦¨¬O¯S®íªº¤l¥Ø¿ý¡A¦]¦¹§Ú­Ì¥i¥H¥Î³B²z¤l¥Ø¿ýªº¤è¦¡³B²z¥¦¡C¦ý¬O¹ï FAT12/16 ³o¨âºØÀɮרt²Î¦Ó¨¥¡A®Ú¥Ø¿ý©Ò¦ûºÏ°Ï¤£¬O¤@­ÓºÏÂO¤j¤p¡A³q±`¤ñ¸û¤j¡A¨ä­pºâ¤è¬O¦b«e¤@³¹´¿´£¤Î¡C

    ¦pªG¨Ï¥ÎªÌ©Ò­n´M§äªº¸ô®|¨Ã«D®Ú¥Ø¿ý¡A¨º»ò´N¥²¶·¤@¼h¤@¼hªº©¹¤U·j´M²Å¦Xªº¤l¥Ø¿ý¡A¦Ó¥u­n§ä¨ì²Å¦Xªº¤l¥Ø¿ý´N¥i¥HŪ¨ú¤l¥Ø¿ý©Ò¦bªººÏÂO¡A¦¹®É¤W¤@¼h¤l¥Ø¿ýªº¸ê®Æ´N¦A¤]¥Î¤£¨ì¤F¡A¥i¥H¼o±ó¤£¥Î¡C

  3. ¨ì¤F§äµÛ¥Ø¼Ð¤l¥Ø¿ý®É¡A´N­nŪ¨ú¦b³o¥Ø¼Ð¤l¥Ø¿ýùتº¨C­ÓÀɮשҾ֦³ªº FAT Äæ¦ì¡A¥H¨M©w¦s©ñ³o­ÓÀɮתººÏÂO¬O§_³sÄò¡AµM«á¦b¿Ã¹õ¤W¦L¥X¨Ó¡C³o®É­Ô¥²¶·«O¦s¥Ø¼Ð¤l¥Ø¿ýªººÏ°Ï¤º®e¡A¥H«K³B²z¤U¤@­ÓÀɮסC¦³¨âºØ¤è¦¡¥i¥H«O¦s¥Ø¼Ð¤l¥Ø¿ýªººÏ°Ï¤º®e¡A¤@¬OŪ¨ú FAT °Ï°ì®ÉÁ׶}¦s©ñ¤l¥Ø¿ýºÏÂOªº°O¾ÐÅé¡A¥t¤@ºØ¤è¦¡¬O«O¦s¤l¥Ø¿ý FAT Äæ¦ì¡A§Y¨Ïµy«áŪ¨ú FAT °Ï°ì®ÉÂл\¤F­ì¨Ó¤l¥Ø¿ýºÏÂOªº°O¾ÐÅé¡A¦ý¦b¦b¿Ã¹õ¤W¦L¥XÀɮ׬O§_³sÄò¤§«á¡AÁÙ¥i¥H¨ú¦^¤l¥Ø¿ýªººÏÂO©Ò¦b¡C¦b DFC µ{¦¡ùؤp¤ì°¸±Ä¥Î«eªÌ¡C

ºî¦X¤W­±ªº±Ô­z¡A¤p¤ì°¸§âŪ¤JªººÏ°Ï¦s©ñ¦b FS ¼È¦s¾¹©Ò«üªº°Ï¬qùØ¡A¦Ó FS ¬O¸ê®Æ¬q¡Bµ{¦¡½X¬q¡B°ïÅ|¬q¤T­Ó°Ï¬q¤¤³Ì°ª¦ì§}¦A¥[¤W 1000H¡C¦Ó FS °Ï¬q¤À¦¨¨â³¡¥÷¡A¥Ñ 0000H¡ãbuff_offset ³o¶ô°Ï°ì¬O¨ÑŪ¨ú±Ò°ÊºÏ°Ï»P¤l¥Ø¿ýºÏÂO©Ò¦s©ñ¤§³B¡A«e­±´£¨ì¡A±Ò°ÊºÏ°Ï¶È­è¶}©l®É»Ý­n¥Î¨ì¡A«á­±´N¤£¥Î¤F¡A©Ò¥H¥¦­Ì¥i­«Å|¡C¦Ü©ó buff_offset ¬O¦h¤j©O¡H³o±o®Ú¾Ú®Ú¥Ø¿ýºÏ°Ï»PºÏÂOªº¤j¤p¨M©w¡C


DFC ­ì©l½X

;Dose File Continue¡HÀˬdºÏºÐ¤¤¬Y¤@¥Ø¿ýùتºÀɮ׬O§_³sÄò¡H
;¥Îªk¡GDFC ºÏºÐ:\¸ô®|¦W
        .model  small,stdcall
        .386

include         myasminc.inc

;***********************************************************
stack   segment stack
        dw      80h dup (?)
stack   ends
;***********************************************************
data    segment para    public  'data'  use16
total_sector    dd      ?       ;Á`ºÏ°Ï¼Æ
fat_region      dd      ?       ;¨â¥÷ FAT Á`ºÏ°Ï¼Æ
root_region     dd      ?       ;®Ú¥Ø¿ýºÏ°Ï¼Æ
data_region     dd      ?       ;¸ê®Æ°Ï°ìªººÏ°Ï¼Æ
lst_data_sector dd      ?       ;¸ê®Æ°Ï°ìªº²Ä¤@­ÓÅÞ¿èºÏ°Ï½s¸¹
n_cluster       dd      ?       ;¤l¥Ø¿ý©Ò¦ûºÏÂO½s¸¹
byte_rt_reg     dw      ?       ;®Ú¥Ø¿ý°Ï°ì©Ò¦û¦ì¤¸²Õ¼Æ
byte_for_read   dw      ?       ;Ū¤J¦ì¤¸²Õ¼Æ
byte_p_cluster  dw      ?       ;¨C¤@ºÏÂO¦ì¤¸²Õ¼Æ
buff_offset     dw      ?       ;FAT ¦s©ñ©ó FS:buff_offset ³B
read_para       packet  <0,1,0,?>
drv_bpb         bpb     <?>     ;ÅÞ¿èºÏºÐªº BPB
driver          db      ?       ;ºÏºÐ¾÷¦W
fat_type        db      ?       ;FAT12 ©Î FAT16 ©Î FAT32
len_pathname    dw      ?
pathname        db      7eh dup (' ')           ;¸ô®|¦W¡A¦p¡yc:\masm32\¡K¡z
dir_pointer     dw      offset pathname+2       ;«ü¦V¨C¬q¤l¥Ø¿ý¦r¦ê¦ì§}
sub_dir_name    db      0bh dup (' ')
rd_flag         db      0       ;rd_flag ¬O¤@­ÓºX¼Ð¡A¥u¦³ bit0 »P bit1 ¦³¥Î
                                ;bit0¡G¥Ø¿ý¬O§_¦û¥Î¤@­Ó¥H¤WºÏÂO¡A¬O¡G1¡A§_¡G0
                                ;bit1¡G¬O§_Ū¨ú®Ú¥Ø¿ý¡A¬O¡G1¡A§_¡G0
file_counter    db      ?       ;­pºâÀɮ׼ƬO§_¶ñº¡¤@­¶¿Ã¹õ
dfc_str         db      cr,lf,13 dup (' '),'yy/mm/dd hh:mm:ss ¦@ ',46 dup (?)
msg00   db      cr,lf,'Dose File Continue? -- Àˬd¥Ø¿ýùتºÀɮ׬O§_³sÄò¡H'
        db      cr,lf,cr,lf,'¥Îªk¡GDFC ºÏºÐ¾÷:\¸ô®|¦W$'
msg01   db      cr,lf,'°O¾ÐÅ餣¨¬$'
msg02   db      cr,lf,'Ū¨ú¿ù»~$'
msg03   db      cr,lf,' : Àɮרt²Î¬° FAT12¡A¦@¦³ 00000000000 ºÏ°Ï ( '
        db      '¬Û·í©ó 00000000000 MB )¡A'
        db      cr,lf,'¡@ ¨ä¤¤«O¯d°Ï°ì¦û 00000000000 ºÏ°Ï¡A'
        db      cr,lf,'¡@¡@ ¡@FAT °Ï°ì¦û 00000000000 ºÏ°Ï¡A'
        db      cr,lf,'¡@ ¡@¡@®Ú¥Ø¿ý¦û 00000000000 ºÏ°Ï¡A'
        db      cr,lf,'¡@ ¡@¡@¸ê®Æ°Ï°ì¦û 00000000000 ºÏ°Ï¡C( ¨CºÏ°Ï¦û '
        db      '00000 ¦ì¤¸²Õ )$'
msg04   db      cr,lf,'«ö¥ô¤@ÁäÄ~Äò¡K¡K$'
msg05   db      cr,lf,'¤£¥¿½Tªº¸ô®|¦W$'
msg06   db      cr,lf,'ÀɮשΤl¥Ø¿ý¤£¦s¦b$'
msg07   db      '¡A©Ò¦ûºÏ°Ï³sÄò$'
msg08   db      '³Q¤À¦¨ 00000 ­Ó³¡¥÷$'
msg09   db      '¡A¤£¦ûºÏ°Ï$'
data    ends
;***********************************************************
code    segment para    public  'code'  use16
        assume  cs:code,ds:data
;-----------------------------------------------------------
abs_sector_read proc    near
        mov     ax,7305h
        mov     cx,0ffffh
        mov     dl,driver
        sub     si,si
        mov     bx,offset read_para
        int     21h     ;µ´¹ïºÏ°ÏŪ¨ú
        ret
abs_sector_read endp
;-----------------------------------------------------------
;¥Ñ bpb_drv ¨ú±o¥H¤U¸ê®Æ¡G
;¿é¥X¡Gfat_region¡Broot_region¡Bdata_region¡Btotal_sector¡B
;      fat_type¡Blst_data_sector¡Bbyte_p_cluster¡Bbuff_offset
get_driver_info proc    near
        sub     edx,edx
        movzx   eax,drv_bpb.BPB_FATSz16
        or      ax,ax
        jnz     fat_ok
        mov     eax,drv_bpb.BPB_FATSz32
fat_ok: movzx   ecx,drv_bpb.BPB_NumFATs
        mul     ecx
        mov     fat_region,eax  ;EAX=©Ò¦³ FAT ©Ò¦ûºÏ°Ï¼Æ
        mov     lst_data_sector,eax
        movzx   eax,drv_bpb.BPB_RootEntCnt
        movzx   ecx,drv_bpb.BPB_BytsPerSec
        shl     eax,5
        add     eax,ecx
        sub     edx,edx
        dec     eax
        div     ecx
        mov     root_region,eax ;EAX=®Ú¥Ø¿ý©Ò¦ûºÏ°Ï¼Æ
        add     lst_data_sector,eax
        sub     dx,dx
        mov     dx,drv_bpb.BPB_TotSec16
        or      dx,dx
        jnz     total_sector_in_edx
        mov     edx,drv_bpb.BPB_TotSec32

total_sector_in_edx:
        mov     total_sector,edx;EDX=ÅÞ¿èºÏ°ÏÁ`¼Æ
        sub     edx,eax
        sub     edx,fat_region
        movzx   eax,drv_bpb.BPB_RsvdSecCnt      ;EAX=«O¯dºÏ°Ï¼Æ
        add     lst_data_sector,eax
        sub     edx,eax
        mov     data_region,edx ;EDX=¸ê®Æ°Ï°ìªººÏ°Ï¼Æ
        sub     eax,eax
        xchg    eax,edx
        movzx   ecx,drv_bpb.BPB_SecPerClu
        div     ecx             ;EAX=ºÏÂOÁ`¼Æ
        mov     dl,32h
        cmp     eax,65525
        jae     got_it
        mov     dl,16h
        cmp     eax,4085
        jae     got_it
        mov     dl,12h          ;­Y¬° FAT12¡A«h DL=12H¡F­Y¬° FAT16¡A«h
got_it: mov     fat_type,dl     ;DL=16H¡F­Y¬° FAT32¡A«h DL=32H
        mov     ax,drv_bpb.BPB_BytsPerSec
        mul     cx
        mov     byte_p_cluster,ax       ;¨CºÏÂO¦ì¤¸²Õ¼Æ
        mov     buff_offset,ax
        mov     eax,root_region
        movzx   ecx,drv_bpb.BPB_BytsPerSec
        mul     ecx
        mov     byte_rt_reg,ax  ;®Ú¥Ø¿ý©Ò¦û¦ì¤¸²Õ¼Æ
        cmp     buff_offset,ax  ;Ū¤Jªº FAT ¦s©ñ¦b FS:buff_offset ³B¡A
        ja      buff_ok         ;buff_offset ¬O byte_rt_reg¡Bbyte_p_cluster
        mov     buff_offset,ax  ;¨âªÌ¸û¤jªÌ
buff_ok:
        ret
get_driver_info endp
;-----------------------------------------------------------
;¥ÑºÏÂO½s¸¹¡A­pºâ¸ÓºÏÂOªº²Ä¤@­ÓÅÞ¿èºÏ°Ï½s¸¹
;¿é¤J¡GEAX¡ÐºÏÂO½s¸¹
;¿é¥X¡GEAX¡ÐÅÞ¿èºÏ°Ï½s¸¹
cluster_to_sector       proc    near
        dec     eax
        sub     ecx,ecx
        dec     eax
        mov     cl,drv_bpb.BPB_SecPerClu
        mul     ecx
        add     eax,lst_data_sector
        ret
cluster_to_sector       endp
;-----------------------------------------------------------
;¨ú±o²Ä N ­ÓºÏÂO½s¸¹¤§¤º®e¡A¦¹¤º®e¥i¯à¬O¤U¤@ºÏÂO½s¸¹¡A¤]¥i¯à¬Oµ²§ô°O¸¹
;­Y¬°µ²§ô°O¸¹¡A«h EAX=0FFFFFFFFH
;­n¥Î³o­Ó°Æµ{¦¡ªº®É¾÷¦³¤G¡A¤@¬O¤l¥Ø¿ý©Ò¦ûºÏÂO¤£¥u¤@­Ó¡A¦¹®É¥ÑºÏºÐŪ¨úªº
;¸ê®Æ¦s©ñ©ó FS:0000 ³B¡F¤G¬OÀɮשҦûºÏÂO¤£¥u¤@­Ó¡A¦¹®É¥ÑºÏºÐŪ¨úªº¸ê®Æ
;¦s©ñ©ó FS:buffer_offset ³B
;¥Îªk¡G invoke  get_next_cluster,½w½Ä°Ï¦ì§},N
;¿é¤J¡GEAX¡ÐºÏÂO½s¸¹
;¿é¥X¡GEAX¡Ð³o­ÓºÏÂO½s¸¹¤§¤º®e
get_next_cluster        proc    near ,buffer_offset:word,cluster:dword
        mov     eax,cluster
;­pºâ cluster Â÷ FAT °Ï°ì¦³´X­Ó¦ì¤¸²Õ
.if fat_type==12h
        mov     ecx,eax
        shr     ecx,1
        add     eax,ecx
.elseif fat_type==16h
        shl     eax,1
.elseif fat_type==32h
        shl     eax,2
.endif
        sub     edx,edx
        movzx   ecx,drv_bpb.BPB_BytsPerSec
        div     ecx     ;°£¥H 512¡A±o¨ì cluster ¦b²Ä´X­Ó FAT ºÏ°Ï
        movzx   ecx,drv_bpb.BPB_RsvdSecCnt
        push    dx      ;¾l¼Æ«O¦s©ó°ïÅ|ùØ
        add     eax,ecx ;EAX = cluster ¦b²Ä´X­ÓÅÞ¿èºÏ°Ï
        mov     dx,buffer_offset        ;Ū¨ú¤§ºÏ°Ï©ñ¦b FS:buffer_offset
        mov     read_para.sector_sn,eax
        mov     read_para.n_sector,1
        mov     read_para.tran_offset,dx
        call    abs_sector_read
        pop     bx
        add     bx,buffer_offset
        movzx   eax,word ptr fs:[bx]
.if fat_type==12h
        test    cluster,1
        jz      even_n
        shr     eax,4
even_n: and     ax,0fffh
   .if ax>=0ff8h
        or      eax,0fffffffh   ;¦pªG¬Oµ²§ô°O¸¹¡A¨Ï¨ä»P FAT32 µ²§ô°O¸¹¬Û¦P
   .endif
.elseif fat_type==16h
   .if ax>=0ffffh
        or      eax,0fffffffh   ;¦pªG¬Oµ²§ô°O¸¹¡A¨Ï¨ä»P FAT32 µ²§ô°O¸¹¬Û¦P
   .endif
.elseif fat_type==32h
        mov     eax,dword ptr fs:[bx]
        and     eax,0fffffffh
   .if eax>=0ffffff8h
        or      eax,0fffffffh
   .endif
.endif
        ret
get_next_cluster        endp
;-----------------------------------------------------------
;¨Ï EAX ¤§­È¡AÅܦ¨¤Q¶i¦ìªº ASCII ¦r¤¸¡A¦s©ó DI ©Ò«ü¦ì§}
;¥Îªk¡G invoke  eax2dec_ascii,digit_len
;¿é¤J¡GEAX¡Ð­nÂà´«¦¨¤Q¶i¦ìªº¤Q¤»¶i¦ì¼Æ¦s©ñ©ó EAX ùØ
;    ¡GES:DI¡Ðªü©Ô§B¼Æ¦r ASCII ½X¦s©ñ³B
;    ¡Gdigit_len¡Ð«ü©w¦ì¼Æ ( §Y®æ¦¡ )¡A­Y¤£¨¬¡A«e­±¶ñ¤J¡y0¡z
;                 ¡A­Y¬° 0FFH ªí¥Ü¥Ñ¸ê®Æ¦Û¦æ¨M©w
;¿é¥X¡GDI¡Ð«ü¦V¤Q¶i¦ì¼Æ¦rªº¤U¤@¦ì§}
eax2dec_ascii   proc    near ,digit_len:byte
        local   temp_byte[10]:byte
        push    di
        mov     cx,10           ;³Ì¦h¦³¤Q­Ó¦ì¼Æ
        lea     di,temp_byte    ;¥ý¹w¦s©ó temp_byte ¤º
        movzx   esi,cx
e2a0:   sub     edx,edx
        div     esi
        add     dl,'0'          ;©ó temp_byte °}¦C¤¤¡A¥Ñ§C¦ì§}¦V°ª¦ì
        mov     ss:[di],dl      ;§}¤À§O¬O­Ó¡B¤Q¡B¦Ê¡K¡Kµ¥¦ì¼Æ
        or      eax,eax         ;­Y ZR¡Aªí¥Ü¤w¸gºâ§¹¡A¨ä¾l°ª¦ì¼Æ§¡¬°¹s
        jz      e2a1
        inc     di
        loop    e2a0
e2a1:   mov     si,di
        mov     ax,cx
        pop     di
        mov     cx,11
        sub     cx,ax           ;CX=¦@¦³´X¦ì¼Æ
        cmp     digit_len,0ffh
        je      e2a2
        cmp     cl,digit_len    ;­Y digit_len=0FFH ©Î¼Æ¦r¥»¨­¦ì¼Æ¤j©ó
        jae     e2a2            ;digit_len¡A«h¦s¤J©Ò¦³¼Æ¦r
        push    cx              ;§_«h¼Æ¦r«e¥²¶·¦s¤J¡y0¡z
        mov     ax,cx
        movzx   cx,digit_len
        sub     cx,ax
        mov     al,'0'
        rep     stosb
        pop     cx
e2a2:   mov     al,ss:[si]
        stosb                   ;¦s©ó ES:DI ©Ò«ü¦ì§}
        dec     si
        loop    e2a2
        ret
eax2dec_ascii   endp
;-----------------------------------------------------------
print_drv_info  proc    near
        mov     bl,fat_type
        mov     di,offset msg03+19
        mov     bh,bl
        shr     bl,4
        and     bh,0fh
        add     bx,3030h
        mov     [di],bx ;¦s¤JÀɮרt²Î
        mov     di,offset msg03+28
        mov     eax,total_sector
        invoke  eax2dec_ascii,0ffh      ;­pºâÁ`ºÏ°Ï¼Æ
        mov     si,offset msg03+39
        mov     cx,15
        rep     movsb                   ;¨Ï«á­±ªº¦r¦ê¦V«e²¾
        mov     eax,total_sector
        sub     edx,edx
        movzx   ecx,drv_bpb.BPB_BytsPerSec
        mul     ecx
        mov     ecx,100000h
        div     ecx
        invoke  eax2dec_ascii,0ffh      ;­pºâÅÞ¿èºÏºÐ®e¶q
        mov     cx,27
        mov     si,offset msg03+65
        rep     movsb
        movzx   eax,drv_bpb.BPB_RsvdSecCnt
        invoke  eax2dec_ascii,0ffh      ;­pºâ«O¯d°Ï°ìºÏ°Ï¼Æ
        mov     cx,27
        mov     si,offset msg03+103
        rep     movsb
        mov     eax,fat_region
        invoke  eax2dec_ascii,0ffh      ;­pºâ FAT °Ï°ìºÏ°Ï¼Æ
        mov     si,offset msg03+141
        mov     cx,25
        rep     movsb
        mov     eax,root_region
        invoke  eax2dec_ascii,0ffh      ;­pºâ®Ú¥Ø¿ý°Ï°ìºÏ°Ï¼Æ
        mov     si,offset msg03+177
        mov     cx,27
        rep     movsb
        mov     eax,data_region
        invoke  eax2dec_ascii,0ffh      ;­pºâ¸ê®Æ°Ï°ìºÏ°Ï¼Æ
        mov     si,offset msg03+215
        mov     cx,9
        rep     movsw
        movzx   eax,drv_bpb.BPB_BytsPerSec
        invoke  eax2dec_ascii,0ffh
        mov     si,offset msg03+238
        mov     cx,5
        rep     movsw
        
        mov     dx,offset msg03
        mov     ah,9
        int     21h
        ret
print_drv_info  endp
;-----------------------------------------------------------
pause   proc    near
        mov     dx,offset msg04
        mov     ah,9
        int     21h
        mov     ah,0
        int     16h
        ret
pause   endp
;-----------------------------------------------------------
;¨ú±o¥Ø¿ýºÏÂO¡A¨Ã­pºâ­nŪ¨ú±oÅÞ¿èºÏ°Ï½s¸¹¤ÎºÏ°Ï¼Æ¡AµM«áŪ¤J°O¾ÐÅ餺
;¿é¥X¡GEAX¡Ð±ýŪ¨úªºÅÞ¿èºÏ°Ï½s¸¹
;      CX¡Ð±ýŪ¨úªººÏ°Ï¼Æ
read_dir        proc    near
        and     rd_flag,0fdh    ;¥ý°²³]¤£¬OŪ¨ú®Ú¥Ø¿ý¡A¦Ó¬O¨ä¥L¤l¥Ø¿ý
        mov     bx,dir_pointer
        mov     ax,byte_p_cluster
        cmp     bx,offset pathname+2
        mov     byte_for_read,ax
        jnz     gd1

;­Y ZR¡Aªí¥Ü­nŪ¨ú²Ä¹s¼h¥Ø¿ý¡A§Y®Ú¥Ø¿ý¡F§_«h¬°¨ä¥L¤l¥Ø¿ý
        or      rd_flag,2       ;Ū¨ú®Ú¥Ø¿ý
        cmp     fat_type,32h
        jne     gd0
        mov     eax,drv_bpb.BPB_RootClus
        jmp     short gd2
gd0:    mov     cx,byte_rt_reg
        mov     byte_for_read,cx
        movzx   eax,drv_bpb.BPB_RsvdSecCnt
        add     eax,fat_region
        mov     ecx,root_region
        jmp     short gd3

gd1:    mov     eax,n_cluster
gd2:    call    cluster_to_sector
        movzx   cx,drv_bpb.BPB_SecPerClu
gd3:    mov     read_para.sector_sn,eax
        mov     read_para.n_sector,cx
        mov     read_para.tran_offset,0
        call    abs_sector_read ;Ū¤J¥Ø¿ýºÏÂO¡A¨Ã¦s©ó FS:0000 ³B
        ret
read_dir        endp
;-----------------------------------------------------------
;¨ú±o¤l¥Ø¿ý¦W¡A¨Ï¨äÂàÅܦ¨»P FDB ®æ¦¡¬Û¦Pªº¦r¦ê¡A¦s©ó sub_dir_name ¦r¦êùØ
;¨Ò¦p¦³­Ó¤l¥Ø¿ý¡AMASM32¡A¦b FDB ùجO¡yMASM32     ¡z¡F­Y¦³¥t¤@¤l¥Ø¿ý¡A
;XYZ.A¡A¦b FDB ùجO¡yXYZ     A  ¡z
;¿é¤J¡GDS:SI¡Ð¨Ï¥ÎªÌ¿é¤J¤§¸ô®|
;¿é¥X¡GDS:SI¡Ð¦¹¤l¥Ø¿ýµ²§ô¦ì§}¡A§Y¡y\¡z©ÎÂk¦ì¦r¤¸©Ò¦b¦ì§}
get_sub_dir_name        proc    near
        mov     di,offset sub_dir_name
        mov     bx,800h ;¥DÀɦW³Ì¦h 8 ­Ó¦r¤¸
gsdn0:  lodsb
        cmp     al,'.'
        je      gsdn2   ;­Y ZR¡Aªí¥Ü¤l¥Ø¿ý¦³°ÆÀɦW
        cmp     al,cr
        je      gsdn5
        cmp     al,'\'
        je      gsdn5
        cmp     al,' '
        je      gsdn5
        cmp     al,'a'  ;­Y¨Ï¥ÎªÌ¿é¤J¤p¼g­^¤å¦r¥À¡A«hÂà´«¦¨¤j¼g
        jb      gsdn1
        cmp     al,'z'
        ja      gsdn1
        and     al,0dfh
gsdn1:  stosb
        inc     bl
        jmp     gsdn0

gsdn2:  cmp     bl,bh   ;­Y¤l¥Ø¿ý¦³°ÆÀɦW
        ja      gsdn4
        movzx   cx,bh
        sub     cl,bl
        jz      gsdn3
        mov     al,' '  ;·í¥DÀɦW¤Ö©ó 8 ­Ó¦r¤¸©Î°ÆÀɦW¤Ö©ó 3 ­Ó¦r¤¸
        rep     stosb   ;®É¡A³Ñ¾l¦r¤¸§¡¶ñ¤JªÅ¥Õ
gsdn3:  mov     bx,300h ;³B²z¤l¥Ø¿ýªº°ÆÀɦW¡A°ÆÀɦW³Ì¦h 3 ­Ó¦r¤¸
        jmp     gsdn0

gsdn4:  stc             ;¥DÀɦW¶W¹L 8 ¦r¤¸©Î°ÆÀɦW¶W¹L 3 ¦r¤¸¡Aµo¥Í¿ù»~
        jmp     short gsdn9

gsdn5:  movzx   cx,bh
        mov     ax,2020h
        cmp     bh,3
        je      gsdn7
        sub     cl,bl   ;¨Ï¥ÎªÌ¶È¿é¤J¥DÀɦW¡A­Y¤£¨¬¤K¦r¤¸¡A§¡¶ñ¤JªÅ¥Õ
        jz      gsdn6
        rep     stosb
gsdn6:  stosw           ;¥B°ÆÀɦW¤]¶ñ¤JªÅ¥Õ
        stosb
        jmp     short gsdn8
gsdn7:  sub     cl,bl
        jz      gsdn8
        rep     stosb
gsdn8:  dec     si
        clc
gsdn9:  ret
get_sub_dir_name        endp
;-----------------------------------------------------------
;¨ú±o FDB ©Ò°O¿ýªººÏÂO½s¸¹
;¿é¤J¡GBX¡ÐFDB ¦ì§}
;¿é¥X¡GEAX¡ÐºÏÂO½s¸¹
get_fdb_cluster proc    near
        sub     eax,eax
        cmp     fat_type,32h
        jne     @f
        mov     eax,fs:[bx+12h]
;­Y¬° FAT32¡A¥²¶·¨ú±o¸û°ªªº 16 ¦ì¤¸¡A°õ¦æ«á¡AEAX ªº¸û°ª 16 ¦ì¤¸´N¬O
;FDB 14H ©Ò°O¿ýªººÏÂO¸û°ª¦ì
@@:     mov     ax,fs:[bx+1ah]
        ret
get_fdb_cluster endp
;-----------------------------------------------------------
print_dfc       proc    near uses bx
        local   n_break:word    ;ÀɮשҦû¾ÚºÏ°Ï³Q¤À¦¨´X­Ó³¡¤À
        local   f_cluster:dword ;ÀɮשҦû¾ÚªººÏÂO½s¸¹

;§âµuÀɦW¦s¤J dfc_str ¦r¦ê¤¤
        mov     di,offset dfc_str+2
        mov     si,bx
        mov     cx,800h
p_dfc1: mov     al,fs:[si]
        cmp     al,' '
        je      p_dfc3
        cmp     al,'$'
        jne     p_dfc2
        mov     al,'?'  ;­YÀɦW¤¤¦³¡y$¡z¡A§ï¦¨¡y?¡z¡A¦]¡y$¡z¬°µ²§ô¦r¤¸
p_dfc2: inc     si
        inc     cl
        stosb
        cmp     cl,ch
        jne     p_dfc1
p_dfc3: cmp     ch,3
        je      p_dfc4
        sub     ch,cl
        mov     al,'.'
        stosb
        movzx   ax,ch
        add     si,ax
        mov     dl,cl
        mov     cx,300h
        jmp     p_dfc1
p_dfc4: add     dl,cl   ;ÀɦW¤£¨¬ 12 ­Ó¦r¤¸¶ñ¤JªÅ¥Õ
        mov     cx,12
        sub     cl,dl
        jz      p_dfc5
        mov     al,' '
        rep     stosb

;Àɮפé´Á¤Î®É¶¡
p_dfc5: movzx   eax,word ptr fs:[bx+18h];AX=«ØÀɤé´Á
        shr     eax,9
        add     ax,69
        invoke  eax2dec_ascii,2 ;¥Á°ê¬ö¤¸¡A¦~¥÷
        mov     ax,fs:[bx+18h]
        shr     ax,5
        inc     di
        and     ax,0fh
        invoke  eax2dec_ascii,2 ;¤ë
        inc     di
        mov     ax,fs:[bx+18h]
        and     ax,1fh
        invoke  eax2dec_ascii,2 ;¤é
        mov     ax,fs:[bx+16h]
        inc     di
        shr     ax,11
        invoke  eax2dec_ascii,2 ;®É
        mov     ax,fs:[bx+16h]
        shr     ax,5
        inc     di
        and     ax,3fh
        invoke  eax2dec_ascii,2 ;¤À
        mov     ax,fs:[bx+16h]
        inc     di
        and     ax,1fh
        shl     ax,1
        invoke  eax2dec_ascii,2 ;’
        add     di,4
        mov     eax,fs:[bx+1ch] ;EAX=Àɮתø«×
        invoke  eax2dec_ascii,0ffh
        mov     si,offset msg03+238
        mov     cx,7
        rep     movsb

;­pºâ¦¹Àɮ׬O§_³sÄò¡A©Î³Q¤À¦¨´X­Ó¤£³sÄòªººÏÂO
        mov     n_break,1       ;¥ý°²³]ÀɮרS¦³¯}¸H
        call    get_fdb_cluster ;¨ú±oÀɮײĤ@­ÓºÏÂO
        mov     f_cluster,eax
        or      eax,eax         ;­Y EAX=0¡Aªí¥Ü¦¹Àɮתø«×¬° 0
        jz      p_dfc7
p_dfc6: invoke  get_next_cluster,buff_offset,f_cluster  ;EAX=¤U¤@­ÓºÏÂO
        cmp     eax,0fffffffh   ;­Y ZR¡Aªí¥Üµ²§ô¡A§YÀɮתº³Ì«á¤@ºÏÂO
        je      p_dfc8
        mov     ecx,f_cluster   ;ECX=²{¦bªººÏÂO
        inc     cx              ;­Y¤U¤@­ÓºÏÂO¬O²{¦bºÏÂO¥[¤@¡Aªí¥Ü³sÄò
        mov     f_cluster,eax
        cmp     eax,ecx         ;­Y ZR¡Aªí¥Ü¦¹¨â­ÓºÏÂO¬O³sÄòªº
        je      p_dfc6
        inc     n_break
        jmp     p_dfc6

p_dfc7: mov     si,offset msg09 ;¦L¥X¡y¤£¦ûºÏ°Ï¡K¡z¦r¦ê
        mov     cx,11
        rep     movsb
        jmp     short p_dfca

p_dfc8: mov     si,offset msg07
        mov     cx,5
        rep     movsw
        cmp     n_break,1       ;­Y n_break=1¡Aªí¥ÜÀɮשҦûºÏÂO¬O³sÄòªº
        jnz     p_dfc9
        mov     cx,5
        rep     movsb
        jmp     short p_dfca
p_dfc9: mov     si,offset msg08
        mov     cx,7
        rep     movsb
        movzx   eax,n_break
        invoke  eax2dec_ascii,0ffh
        mov     si,offset msg08+12
        mov     cx,4
        rep     movsw
p_dfca: mov     dx,offset dfc_str
        mov     ah,9
        int     21h
        ret
print_dfc       endp
;-----------------------------------------------------------
start:  push    ds
        push    0
        mov     ax,data
        mov     es,ax

;§â¨Ï¥ÎªÌ¿é¤Jªº°Ñ¼Æ¥Ñ PSP ²¾¨ì pathname ¤º
        mov     cx,80h
        mov     di,offset len_pathname
        mov     si,cx
        rep     movsb

        mov     ds,ax
        and     len_pathname,0ffh       ;¸ô®|ªø³Ì¦h 80 ¦r¤¸
        jnz     st_fs0
        mov     dx,offset msg00
        jmp     short exit0
st_fs0: mov     ax,ss   ;¤ñ¸û¨º¤@­Ó°Ï¬q¬O¦b³Ì°ª¦ì§}
        mov     bx,cs
        cmp     ax,bx   ;SS »P CS ¤ñ¸û
        jae     st_fs1
        mov     ax,cs
st_fs1: mov     bx,ds   ;¸û°ªªº¦s©ó AX
        cmp     ax,bx   ;AX »P DS ¤ñ¸û¡A¸û°ªªº¦s©ó AX
        jae     st_fs2
        mov     ax,ds
st_fs2: add     ax,1000h
        cmp     ax,7000h
        jb      mem_ok
        mov     dx,offset msg01
exit0:  mov     ah,9
        int     21h
        mov     al,01
exit1:  mov     ah,4ch
        int     21h

mem_ok: mov     fs,ax   ;Ū¨úºÏ°Ï¤§¸ê®Æ¦s©ó FS:0000 ³B
        mov     read_para.tran_segment,ax
        mov     cl,pathname     ;¨ú±oºÏºÐ¾÷¦W
        mov     si,offset msg03+2
        and     cl,0dfh
        mov     [si],cl
        sub     cl,40h
        mov     driver,cl

        call    abs_sector_read ;Ū¨ú±Ò°ÊºÏ°Ï
        jnc     bt_ok
err_rd: mov     dx,offset msg02
        jmp     exit0

;³]¥ß BPB¡A§Y¡y§â FS:0B ©Ò¦bªº BPB ( ¦@ 53 ¦ì¤¸²Õ ) ²¾¨ì drv_bpb ùØ¡z
bt_ok:  mov     si,0bh
        mov     di,offset drv_bpb
        mov     cx,53
@@:     mov     al,fs:[si]
        stosb
        inc     si
        loop    @b

        call    get_driver_info
        call    print_drv_info  ;¦L¥X¦¹ÅÞ¿èºÏºÐ°ò¥»¸ê®Æ
        call    pause

fd_sb0: call    read_dir        ;Ū¨ú¥Ø¿ýºÏ°Ï
        jc      err_rd
        test    rd_flag,1       ;­Y ZR¡Aªí¥Ü¦¹¥Ø¿ý¤£¥u¤@­ÓºÏÂO¡A²{¦b¤w³B
        jne     fd_sb2          ;²z§¹²Ä¤@­ÓºÏÂO¡A­n³B²z²Ä¤G¡B¤T¡K¡KºÏÂO
        mov     si,dir_pointer
        cmp     byte ptr [si],cr;Àˬd¬O§_¤w§ä¨ì¥Ø¼Ð¥Ø¿ý¤F¡H
        je      dfc1            ;­Y¤w¨ì¹F¡A«h¸õ¨ì dfc0:
        inc     si
        cmp     byte ptr [si],cr;Àˬd¬O§_¤w§ä¨ì¥Ø¼Ð¥Ø¿ý¤F¡H
        je      dfc1            ;¨Ï¥ÎªÌ¦³¥i¯à¦b¸ô¸g³Ì«á­±¥[¤W¡y\¡z
        call    get_sub_dir_name;­Y©|¥¼¨ì¹F¥Ø¼Ð¥Ø¿ý¡A«hÄ~Äò§ä³o¼h¤l¥Ø¿ý¡A
        jnc     fd_sb1          ;¬Ý¬Ý¬O§_§ä±o¨ì¨Ï¥ÎªÌ¦b°Ñ¼Æ¦C¿é¤Jªº¤l¥Ø¿ý
        mov     dx,offset msg05
        jmp     exit0
fd_sb1: mov     dir_pointer,si  ;«O¦s¤U¤@¼h¨Ï¥ÎªÌ¦b°Ñ¼Æ¦C©Ò¿é¤J¤l¥Ø¿ýªº¦ì§}
fd_sb2: sub     bx,bx           ;¶}©l·j´M¥Ø¿ýºÏ°Ï¸Ì¬O§_¦³¬Û²Åªº¤l¥Ø¿ý
fd_sb3: cmp     bx,byte_for_read;­Y ZR¡Aªí¥Ü³o­Ó¤l¥Ø¿ýÁÙ¦³¤@­ÓºÏÂO
        je      fd_sb7
        cmp     byte ptr fs:[bx+0bh],0fh;­Y¬°ªøÀɦW©Î§R°£ªºªº FDB¡A
        je      fd_sb5                  ;DFC §¡¤£¤©¤ñ¸û¬O§_¬Û²Å
        cmp     byte ptr fs:[bx],0e5h
        je      fd_sb5
        cmp     byte ptr fs:[bx],0      ;­Y ZR¡Aªí¥Ü³o­Ó¤l¥Ø¿ý¤w¥þ³¡·j´M§¹²¦
        je      fd_sb6
        mov     si,offset sub_dir_name
        mov     di,bx
        mov     cx,0bh
fd_sb4: push    es
        mov     ax,fs
        mov     es,ax
        repe    cmpsb           ;¤ñ¹ï sub_dir_name »P BX ©Ò«üªº FDB ¬O§_¬Û¦P
        pop     es
        jne     fd_sb5          ;­Y¤£¦P¡A¦A¸Õ¸Õ¬Ý¤U¤@­Ó FDB
        call    get_fdb_cluster ;­Y¬Û¦P¡Aªí¥Ü§äµÛ¤l¥Ø¿ý¤F¡A¨ú±o¤l¥Ø¿ýºÏÂO
        mov     n_cluster,eax
        test    byte ptr fs:[bx+0bh],10h
        jz      dfc5            ;­Y ZR¡Aªí¥Ü¨Ï¥ÎªÌ¿é¤Jªº¥Ø¼Ð¬OÀÉ®×
        and     rd_flag,0feh    ;¥ý°²³]¤l¥Ø¿ý¥u¦û¤@­ÓºÏÂO
        jmp     short fd_sb0
fd_sb5: add     bx,20h
        jmp     fd_sb3
fd_sb6: mov     dx,offset msg06 ;¨S§äµÛ¤l¥Ø¿ý
        jmp     exit0
fd_sb7: invoke  get_next_cluster,0,n_cluster
        mov     n_cluster,eax
        or      rd_flag,1
        jmp     fd_sb0

dfc1:   sub     bx,bx
dfc2:   cmp     bx,byte_for_read
        je      dfc4
        mov     ax,fs:[bx]
        cmp     ax,2e2eh
        je      dfc3
        cmp     ax,202eh
        je      dfc3
        cmp     al,0
        jz      exit2
        cmp     al,0e5h
        je      dfc3
        mov     cl,fs:[bx+0bh]
        test    cl,8    ;­Y¬°ºÏºÐ¨÷¦W¡BªøÀɦWªº FDB ©Î¤l¥Ø¿ý
        jnz     dfc3    ;¡A«h DFC ¤£³B²z¡A§_«h©I¥s print_dfc
        cmp     cl,0fh  ;°Æµ{¦¡
        je      dfc3
        test    cl,10h
        jnz     dfc3
        call    print_dfc
        inc     file_counter
        cmp     file_counter,23
        jne     dfc3
        call    pause
        mov     file_counter,0
dfc3:   add     bx,20h
        jmp     dfc2

;°O¸ü¦¹¥Ø¿ýªººÏÂO¤£¥u¤@­Ó¡A¸ü¤J¦¹¥Ø¿ýªº¤U¤@ºÏÂO
dfc4:   test    rd_flag,2
        jz      @f
        cmp     fat_type,32h
        jne     exit2
@@:     invoke  get_next_cluster,0,n_cluster
        mov     n_cluster,eax
        jmp     fd_sb0

dfc5:   call    print_dfc

exit2:  mov     al,0
        jmp     exit1
;***********************************************************
        end     start

«á°O

¦³Ãö³o­Óµ{¦¡¡A§Ú·Q¤j·§¨S¦³¨ä¥Lªº¦a¤è­n¸ÑÄÀ¤F¡A¦p¦³°ÝÃD¡A½Ð¨Ó«H°Ý§a¡I

¤]³\¦³¤H·|°Ý¡ADFC.EXE ¬°¦ó¤£¤ä´©ªøÀɦW©O¡H¨ä¹ê Unicode ©M BIG¡Ð5 ½X¤§¶¡ªºÂà´«»Ý­n«Ü¤jªº¸ê®Æ³B²z¡C§ó¶i¤@¨Bªº»¡©ú¡A½Ð°Ñ¦Òªþ¿ý¤Q¡C


¦^¨ì­º­¶¡A ¨ì²Ä¤T¤Q¤T³¹¡A¨ì²Ä¤T¤Q¤­³¹