¤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
²³©Ò©Pª¾¡ADOS »P Windows 9x/Me ¦b§â·sÀɮצs¤JµwºÐ©Î³nºÐ®É¡A¬O¥ÑµwºÐ©Î³nºÐ«e±ºÏÂO¶}©l·j´M¡A¥un§ä¨ì¨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
³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 ·|¦Û°Ê§â¤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
Àˬ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
¨º»ò¡An«ç»ò¤~¯à¨ú±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¥Ø¿ý¬°¤î¡CY¤¤¶¡¦³¤£²Å¦Xªº¤l¥Ø¿ý¦W¡Aªí¥Ü¨Ï¥ÎªÌ©Ò¿é¤Jªº¸ô®|¤£¦s¦b¡A«h©ó¿Ã¹õ¤¤¦L¥X¡yÀɮשΤl¥Ø¿ý¤£¦s¦b¡z°T®§¡C
¨Ò¦p¤W¨Ò¡AnÀˬ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
¤ÀªR¾ãÓµ{¦¡¤§«á¡A·|µo²{¾ãÓµ{¦¡·|Ū¨úªº³¡¥÷¬O±Ò°ÊºÏ°Ï¡B®Ú¥Ø¿ýºÏ°Ï©Î¤l¥Ø¿ýºÏ°Ï©M FAT °Ï°ìªººÏ°Ï¤TºØ±¡§Î¡G
·íµ{¦¡¤@°õ¦æ®É¡A«KÀ³¸Ón¸ü¤J±Ò°ÊºÏ°Ï¡A¥H½T©wÀɮרt²Î¡B«O¯d°Ï°ìºÏ°Ï¼Æ¡BFAT °Ï°ìªººÏ°Ï¼Æ¡B¡K¡Kµ¥ÅÞ¿èºÏºÐªº¸ê®Æ¡A¨ä¤¤ÁÙ¦³¤@¼Ë«Ü«nªº¡A´N¬Opºâ®Ú¥Ø¿ý¦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
±µ¤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¦Ó¥un§ä¨ì²Å¦Xªº¤l¥Ø¿ý´N¥i¥HŪ¨ú¤l¥Ø¿ý©Ò¦bªººÏÂO¡A¦¹®É¤W¤@¼h¤l¥Ø¿ýªº¸ê®Æ´N¦A¤]¥Î¤£¨ì¤F¡A¥i¥H¼o±ó¤£¥Î¡C
¨ì¤F§äµÛ¥Ø¼Ð¤l¥Ø¿ý®É¡A´NnŪ¨ú¦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
;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¡FY¬° FAT16¡A«h got_it: mov fat_type,dl ;DL=16H¡FY¬° 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¸¹¡Apºâ¸ÓºÏÂ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®æ¦¡ )¡AY¤£¨¬¡A«e±¶ñ¤J¡y0¡z ; ¡AY¬° 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¡FY¦³¥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¡AY¤£¨¬¤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¡An³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Óµ{¦¡¡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