¤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