亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fat32引導扇區代碼.shtm.htm

?? 支持FAT32和NTFS的引導扇區源碼
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
  </tr>
</tbody></table>
</td>
              </tr>
              <tr>
                <td width="10"></td>
                <td><span id="ArticleContent1_ArticleContent1_lblContent"><p>;====================================================================<br>; <br>; FlyingDragon OS Boot Sector FOR FAT32<br>;<br>; Author: Jack<br>; V0.01 2005-07-23 17:39<br>; V0.02&nbsp;2005-08-07 09:29<br>; <br>; Build : nasm -f bin FAT32.ASM -oFAT32.BIN&nbsp;<br>; &nbsp;<br>;====================================================================================<br>; <br>; BIOS在啟動中的角色:<br>; &nbsp;(1) BIOS裝載引導驅動器上的0扇區(CHS = 0:0:1)內容到內存線性地址7C00H處;<br>; &nbsp;(2) BIOS檢查所裝載的扇區是否有啟動標記(510、511字節分別為55H和AAH); <br>; &nbsp;(3) CPU寄存器DL被設置為分配給引導驅動器的驅動器號,00H為軟驅A,80H為硬盤C;<br>; &nbsp;(4) BIOS跳轉到其裝載的扇區中的代碼(即7C00H處),將控制權轉交給引導代碼。<br>; <br>; 引導代碼應該初始化以下寄存器:<br>; &nbsp;(1) DS:某些BIOS設置其值為0,某些設置其為40H,它應該被設置為(7C00H-BOOT_ORG)/16;<br>; &nbsp;&nbsp;其中,BOOT_ORG為引導代碼的ORG值,該值通常為7C00H(這意味著DS應設置為0);<br>; &nbsp;(2) SS和SP(堆棧):這兩個寄存器的初始值依賴于BIOS;<br>; &nbsp;(3) CS個IP(通過JMP指令):大多數的BIOS進入啟動代碼的地址為0000:7C00H,但是某些<br>; &nbsp;&nbsp;BIOS卻跳轉到07C0:0000H。由于短跳轉和條件跳轉是IP相關的,因此如果沒有使用<br>;&nbsp;&nbsp;遠跳轉或者絕對跳轉,則不需要重置CS和IP;然而,DS仍舊必須是正確的值。<br>; <br>;=====================================================================================<br>; <br>; 常規內存( 0000 0000H - 000F FFFFH,即0-1MB )在系統啟動時的使用情況<br>; <br>;=====================================================================================<br>; <br>; &nbsp;&nbsp;---------------------------------<br>; &nbsp;&nbsp;|&nbsp;0000 0000 - 0000 03FF&nbsp;&nbsp; &nbsp;|&nbsp;1024B&nbsp; &nbsp;IDT&nbsp; read only<br>; &nbsp;&nbsp;|-------------------------------|<br>; &nbsp;&nbsp;|&nbsp;0000 0400 - 0000 04FF&nbsp;&nbsp;|&nbsp;256B &nbsp;BIOS Data Area , read only&nbsp;<br>; &nbsp;&nbsp;|-------------------------------|<br>; &nbsp;&nbsp;|&nbsp;0000 0500 - 0000 7BFF&nbsp; &nbsp;|*&nbsp;30464B&nbsp;Free Memory , read/write &nbsp;(29.75KB) <br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;0000 7C00 - 0000 7DFF&nbsp;&nbsp; &nbsp;|&nbsp;512B&nbsp;Boot Sector , read/write&nbsp;<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;0000 7E00 - 0000 7FFF&nbsp;&nbsp;|&nbsp;512B&nbsp;&nbsp;&nbsp; Free Memory , read /write<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;0000 8000 - 0009 FBFF&nbsp; &nbsp;|&nbsp;607KB&nbsp;Free Memory , read / write( 32K - 639KB ) <br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>;
&nbsp;&nbsp;|&nbsp;0009 FC00 - 0009 FFFF&nbsp;&nbsp;
&nbsp;|**&nbsp;1KB&nbsp;&nbsp;EBDA extended BIOS data
area&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;000A 0000 - 000A FFFF&nbsp;&nbsp;|&nbsp;64KB&nbsp;Video Memory<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;000B 0000 - 000B 7FFF&nbsp; &nbsp;|&nbsp;32KB&nbsp;Mono Video Text Memory <br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;000B 8000 - 000B FFFF&nbsp;&nbsp; &nbsp;|&nbsp;32KB&nbsp;Color Video Text Memory<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;000C 0000 - 000C 7FFF&nbsp;&nbsp;|&nbsp;32KB&nbsp;Video BIOS , read only<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;000C 8000 - 000E FFFF&nbsp; &nbsp;|&nbsp;160KB&nbsp;Adapter ROM,read only<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;000F 0000 - 000F FFFF&nbsp;&nbsp; &nbsp;|&nbsp;64KB&nbsp;System BIOS, read only<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;0010 0000 - 0010 FFEF&nbsp;&nbsp;|***64KB-16&nbsp;High Memory Area,read/write&nbsp; ( 1MB開始處 )<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; &nbsp;&nbsp;|&nbsp;0010 FFF0 - &nbsp;&nbsp;&nbsp; &nbsp;|&nbsp;&nbsp;&nbsp;Free Extended Memory, read/write&nbsp;<br>; &nbsp;&nbsp;|------------------------------&nbsp;|<br>; <br>; &nbsp;*&nbsp;空閑內存實際并非從 0000 0500處開始,BIOS數據區實際上會利用從0000 0500開始的少量字節,例如<br>; &nbsp;&nbsp;00000500處保存的是打印屏幕狀態,當按下打印屏幕(PrintScreen)鍵時,低級鍵盤BIOS初始化打印屏<br>; &nbsp;&nbsp;幕功能,鍵盤BIOS觸發中斷5打印屏幕處理程序。正因為BIOS數據區越過了256B的界限,因此DOS實際<br>; &nbsp;&nbsp;上是從0000 0522開始裝載的。為保險起見,可從0000 0600開始利用空閑內存。(1.5K - 31K 29.5KB)<br>; <br>; **&nbsp;有些機器上沒有這段BIOS擴展數據區。<br>; <br>; ***&nbsp;如果沒有使用擴展高端內存區域程序(例如Emm386.exe),則從0010 0000 (1MB )開始的內存都是可用的。<br>; <br>; <br>;=====================================================================================<br>; </p><p>BITS &nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;; 生成16位代碼而不是32位代碼<br>SECTION&nbsp;&nbsp;.TEXT &nbsp;&nbsp;; 代碼段<br>ORG&nbsp;&nbsp;&nbsp;7C00H&nbsp;&nbsp;; 指定程序被裝入內存的起始位置</p><p>;====================================================================<br>; <br>; 宏和常量定義<br>; <br>;====================================================================<br>? &nbsp;&nbsp;&nbsp;&nbsp;EQU &nbsp;0&nbsp;&nbsp;; NASM不支持DW ?這樣的語法,可以使用這樣的定義<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 模擬,以使代碼的可讀性更強<br>DATA_BUF_SEG&nbsp;EQU&nbsp;&nbsp;0200H&nbsp;; 用于讀取根目錄或文件內容的緩沖區(8K) 段地址<br>DATA_BUF_OFF&nbsp;EQU&nbsp;&nbsp;2000H<br>STACK_ADDR&nbsp;&nbsp;EQU&nbsp;&nbsp;7BD0H&nbsp;; 堆棧棧頂(注意:堆棧大小約為20K)&nbsp;<br>OSLOADER_ADDR&nbsp;EQU&nbsp;&nbsp;8000H&nbsp;; FDOSLDR.BIN放入內存中的起始位置,這就意味著<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 裝載程序及相關資源的尺寸不能超過608K<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 8000H - A000H (32K - 640K )<br>OSLOADER_SEG&nbsp;EQU&nbsp;&nbsp;0800H&nbsp;; 起始段地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>SECOND_SECTOR&nbsp;EQU&nbsp;&nbsp;03H&nbsp;&nbsp;; 第二個引導扇區的扇區號(第四個扇區)<br>SECOND_ADDR&nbsp;&nbsp;EQU&nbsp;&nbsp;7E00H&nbsp;; 第二個引導扇區的裝載位置</p><p>;====================================================================<br>; 用堆棧保存若干中間變量( SS = 0 BP = 7C00H )<br>;====================================================================<br>FAT_START_SECTOR&nbsp;EQU&nbsp;&nbsp;4&nbsp;&nbsp;; FAT表的起始扇區號&nbsp;&nbsp;DWORD<br>ROOT_START_SECTOR&nbsp;EQU&nbsp;&nbsp;8&nbsp;&nbsp;; 根目錄的起始扇區號&nbsp;DWORD<br>DATA_START_SECTOR&nbsp;EQU&nbsp;&nbsp;12&nbsp;&nbsp;; 數據區起始扇區號&nbsp;&nbsp;DWORD<br>FAT_ENTRY_SECTORS&nbsp;EQU&nbsp;&nbsp;14&nbsp;&nbsp;; FAT表所占的扇區數&nbsp;&nbsp;WORD<br>ROOT_ENTRY_SECTORS&nbsp;EQU&nbsp;&nbsp;16&nbsp;&nbsp;; 根目錄所占的扇區數&nbsp;WORD<br>DIR_PER_SECTOR&nbsp;&nbsp;EQU&nbsp;&nbsp;17&nbsp;&nbsp;; 每個扇區所容納的目錄&nbsp;BYTE<br>DISK_EXT_SUPPORT&nbsp;EQU&nbsp;&nbsp;18&nbsp;&nbsp;&nbsp;&nbsp; ; 磁盤是否支持擴展BIOS&nbsp;BYTE<br>CURRENT_CLUSTER&nbsp;&nbsp;EQU&nbsp;&nbsp;40&nbsp;&nbsp;; 當前正在處理的簇號&nbsp;DWORD</p><p><br>;====================================================================&nbsp;&nbsp;<br>; 擴展磁盤服務所使用的地址包<br>;====================================================================<br>DAP_SECTOR_HIGH&nbsp;&nbsp;EQU&nbsp;&nbsp;24&nbsp;&nbsp;; 起始扇區號的高32位 ( 每次調用需要重置 )&nbsp;DWORD<br>DAP_SECTOR_LOW&nbsp;&nbsp;EQU&nbsp;&nbsp;28&nbsp;&nbsp;; 起始扇區號的低32位 ( 每次調用需要重置 )&nbsp;DWORD<br>DAP_BUFFER_SEG&nbsp;&nbsp;EQU&nbsp;&nbsp;30&nbsp;&nbsp;; 緩沖區段地址&nbsp;&nbsp; ( 每次調用需要重置 )&nbsp;WORD<br>DAP_BUFFER_OFF&nbsp;&nbsp;EQU&nbsp;&nbsp;32&nbsp;&nbsp;; 緩沖區偏移&nbsp;&nbsp; ( 每次調用需要重置 )&nbsp;WORD&nbsp;&nbsp;<br>DAP_RESERVED2&nbsp;&nbsp;EQU&nbsp;&nbsp;33&nbsp;&nbsp;; 保留字節<br>DAP_READ_SECTORS&nbsp;EQU&nbsp;&nbsp;34&nbsp;&nbsp;; 要處理的扇區數(1 - 127 )<br>DAP_RESERVED1&nbsp;&nbsp;EQU&nbsp;&nbsp;35&nbsp;&nbsp;; 保留字節<br>DAP_PACKET_SIZE&nbsp;&nbsp;EQU&nbsp;&nbsp;36&nbsp;&nbsp;; 包的大小為16字節</p><p>;====================================================================<br>; <br>; 目錄項結構(每個結構為32字節)<br>; <br>;====================================================================<br>OFF_DIR_NAME&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;0&nbsp;&nbsp;; 目錄項的偏移&nbsp;&nbsp;BYTE[11]<br>OFF_DIR_ATTRIBUTE&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;11&nbsp;&nbsp;; 目錄屬性&nbsp;&nbsp;&nbsp;BYTE<br>OFF_NT_RESERVED&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;12&nbsp;&nbsp;; 保留屬性&nbsp;&nbsp;&nbsp;BYTE<br>OFF_CREATE_TIME_HUNDREDTH&nbsp;EQU&nbsp;&nbsp;13&nbsp;&nbsp;; 創建時間&nbsp;&nbsp;&nbsp;BYTE<br>OFF_CREATE_TIME&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;14&nbsp;&nbsp;; 創建時間&nbsp;&nbsp;&nbsp;WORD<br>OFF_CREATE_DATE&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;16&nbsp;&nbsp;; 創建時間&nbsp;&nbsp;&nbsp;WORD<br>OFF_LAST_ACCESS_DATE&nbsp;&nbsp;EQU&nbsp;&nbsp;18&nbsp;&nbsp;; 上次訪問時間&nbsp;&nbsp;WORD<br>OFF_START_CLUSTER_HIGH&nbsp;&nbsp;EQU&nbsp;&nbsp;20&nbsp;&nbsp;; 起始簇號高位&nbsp;&nbsp;WORD<br>OFF_LAST_UPDATE_TIME&nbsp;&nbsp;EQU&nbsp;&nbsp;22&nbsp;&nbsp;; 上次更新時間&nbsp;&nbsp;WORD<br>OFF_LAST_UPDATE_DATE&nbsp;&nbsp;EQU&nbsp;&nbsp;24&nbsp;&nbsp;; 上次更新時間&nbsp;&nbsp;WORD<br>OFF_START_CLUSTER_LOW&nbsp;&nbsp;EQU&nbsp;&nbsp;26&nbsp;&nbsp;; 起始簇號低位&nbsp;&nbsp;WORD<br>OFF_FILE_SIZE&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;28&nbsp;&nbsp;; 文件尺寸&nbsp;&nbsp;&nbsp;DWORD</p><p>; 相關常量<br>DIR_NAME_DELETED&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;0E5H&nbsp;; 該項已經被刪除<br>DIR_NAME_FREE&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;00H&nbsp;&nbsp;; 該項是空閑的(其后也是空閑的)<br>DIR_NAME_DOT&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;2EH&nbsp;&nbsp;; 特殊目錄 . 或 ..<br>DIR_NAME_SPACE&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;20H&nbsp;&nbsp;; 不允許的字符<br>DIR_ENTRY_SIZE&nbsp;&nbsp;&nbsp;&nbsp;EQU &nbsp;32&nbsp;&nbsp;; 每個目錄項的尺寸,其結構如上所示&nbsp;</p><p>;文件屬性<br>DIR_ATTR_READONLY&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;01H&nbsp;&nbsp;; 只讀文件<br>DIR_ATTR_HIDDEN&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;02H&nbsp;&nbsp;; 隱藏文件<br>DIR_ATTR_SYSTEM&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;04H&nbsp;&nbsp;; 系統文件<br>DIR_ATTR_VOLUME&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;08H&nbsp;&nbsp;; 卷標號(只可能出現在根目錄中)<br>DIR_ATTR_SUBDIR&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;10H&nbsp;&nbsp;; 子目錄<br>DIR_ATTR_ARCHIVE&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;20H&nbsp;&nbsp;; 歸檔屬性<br>DIR_ATTR_LONGNAME&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;0FH&nbsp;&nbsp;; 長文件名<br>DIR_ATTR_LONGNAME_MASK&nbsp;&nbsp;EQU&nbsp;&nbsp;3FH&nbsp;&nbsp;; 長文件名掩碼</p><p>; 簇屬性<br>CLUSTER_MASK&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;0FFFFFFFH&nbsp;; 簇號掩碼(FAT32=&gt;FAT28)<br>CLUSTER_FREE&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;00000000H&nbsp;; 簇是空閑的<br>CLUSTER_RESERVED&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;00000001H&nbsp;; 簇是保留的<br>CLUSTER_MIN_VALID&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;00000002H&nbsp;; 最小有效簇號<br>CLUSTER_MAX_VALID&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;0FFFFFF6H&nbsp;; 最大有效簇號<br>CLUSTER_BAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;0FFFFFF7H&nbsp;; 壞簇<br>CLUSTER_LAST&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;0FFFFFF8H&nbsp;&nbsp; ;0xFFFFFFF8-0xFFFFFFFF表示文件的最后一個簇</p><p>;====================================================================<br>;<br>; 啟動扇區(512字節)<br>;<br>;====================================================================<br>_ENTRY_POINT: </p><p>; 3字節的跳轉指令<br>&nbsp;JMP&nbsp;SHORT _BOOT_CODE&nbsp;; 跳轉到真正的引導代碼<br>&nbsp;NOP&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 空指令以保證字節數為3</p><p>; 8字節的OEMName<br>OEMName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DB&nbsp;"FDOS1.00"</p><p>;====================================================================<br>; <br>; BPB( BIOS Parameter Block ) <br>; <br>;====================================================================<br>BytesPerSector&nbsp;&nbsp;&nbsp;DW&nbsp;?&nbsp;; 每個扇區的字節數 (512 1024 2048 4096)<br>SectorsPerCluster&nbsp;&nbsp;DB&nbsp;?&nbsp;; 每個簇的扇區數 ( 1 2 4 8 16 32 64 128 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 兩者相乘不能超過32K(簇最大大小)<br>ReservedSectors&nbsp;&nbsp;&nbsp;DW&nbsp;?&nbsp;; 從卷的第一個扇區開始的保留扇區數目;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 該值不能為0,對于FAT12/FAT16,該值通常為1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 對于FAT32,典型值為32;<br>NumberOfFATs&nbsp;&nbsp;&nbsp;DB&nbsp;?&nbsp;; 卷上FAT數據結構的數目,該值通常應為2<br>RootEntries&nbsp;&nbsp;&nbsp;&nbsp;DW&nbsp;?&nbsp;; 對于FAT12/FAT16,該值表示32字節目錄項的數目;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 對于FAT32,該值必須為0;<br>NumberOfSectors16&nbsp;&nbsp;DW&nbsp;?&nbsp;; 該卷上的扇區總數,該字段可以為0,如果該字段<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 為0,則NumberOfSectors32不能為0;對于FAT32,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 該字段必須為0<br>MediaDescriptor&nbsp;&nbsp;&nbsp;DB&nbsp;?&nbsp;; 介質類型<br>SectorsPerFAT16&nbsp;&nbsp;&nbsp;DW&nbsp;?&nbsp;; 該字段標識一個FAT結構占有的扇區數(FAT12/FAT16),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 對于FAT32卷,該字段必須為0;<br>SectorsPerTrack&nbsp;&nbsp;&nbsp;DW&nbsp;?&nbsp;; 用于INT 0x13中斷的每個磁道的扇區數<br>HeadsPerCylinder&nbsp;&nbsp;DW&nbsp;?&nbsp;; 用于INT 0x13中斷的每個柱面的磁頭數<br>HiddenSectors&nbsp;&nbsp;&nbsp;DD&nbsp;?&nbsp;; 包含該FAT卷的分區之前的隱藏扇區數<br>NumberOfSectors32&nbsp;&nbsp;DD&nbsp;?&nbsp;; 該字段包含該卷上的所有扇區數目,對于FAT32,該字段<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 不為0;FAT12/FAT16可根據實際大小是否超過65536個扇<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 區數決定是否采用該字段;</p><p>;====================================================================<br>; <br>; EBPB ( Extended BIOS Parameter Block )<br>; <br>;====================================================================<br>SectorsPerFAT32&nbsp;&nbsp;&nbsp;DD&nbsp;?&nbsp;&nbsp;&nbsp;; 對于FAT32,該字段包含一個FAT的大小,而SectorsPerFAT16<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 字段必須為0;<br>ExtFlags&nbsp;&nbsp;&nbsp;&nbsp;DW&nbsp;?&nbsp;&nbsp;&nbsp;; 標志&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>FSVersion&nbsp;&nbsp;&nbsp;&nbsp;DW&nbsp;?&nbsp;&nbsp;&nbsp;; 這是文件系統的版本,高字節為主版本,低字節為次版本;<br>RootDirectoryStart&nbsp;&nbsp;DD&nbsp;?&nbsp;&nbsp;&nbsp;; 根目錄的起始簇號,通常為2;<br>FSInfoSector&nbsp;&nbsp;&nbsp;DW&nbsp;?&nbsp;&nbsp;&nbsp;; FSINFO結構在FAT32卷保留區域的扇區號 <br>BackupBootSector&nbsp;&nbsp;DW&nbsp;?&nbsp;&nbsp;&nbsp;; 如果該字段不為0,則表示在保留區域保存的啟動記錄的扇區號<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 通常為6,不推薦其他值;<br>Reserved1&nbsp;TIMES 12&nbsp;DB&nbsp;?&nbsp;&nbsp;&nbsp;; 保留字段,格式化程序應將該字段清0<br>DriveNumber&nbsp;&nbsp;&nbsp;&nbsp;DB&nbsp;?&nbsp;&nbsp;&nbsp;; 用于INT 0x13的驅動器號,0x00為軟盤,0x80為硬盤<br>NTReserved&nbsp;&nbsp;&nbsp;&nbsp;DB&nbsp;?&nbsp;&nbsp;&nbsp;; 保留字節(用于Windows NT,即NTFS),對于FAT文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 系統,應始終為0<br>BootSignature&nbsp;&nbsp;&nbsp;DB &nbsp;29H&nbsp;&nbsp;&nbsp;; 擴展引導標志(值為0x29)<br>VolumeId&nbsp;&nbsp;&nbsp;&nbsp;DD&nbsp;?&nbsp;&nbsp;&nbsp;; 卷的序列號<br>VolumeLabel&nbsp; times 11&nbsp;&nbsp; DB&nbsp;?&nbsp;&nbsp;&nbsp;; 卷標號,該字段與根目錄中的11字節卷標相同<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; NASM目前尚不支持DUP語法<br>FileSystemType&nbsp;&nbsp;&nbsp;DB&nbsp;'FAT32&nbsp;&nbsp; '&nbsp;; 文件系統類型</p><p>;====================================================================<br>;<br>; 真正的啟動代碼從這開始( 偏移:0x3E )&nbsp;<br>; 其功能是搜索磁盤的根目錄,查找FDOSLDR.BIN文件,將其讀入內存并運行。<br>;<br>;====================================================================<br>_BOOT_CODE:</p><p>&nbsp;; 初始化相關寄存器及標志位<br>&nbsp;CLI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 先關掉中斷<br>&nbsp;CLD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 方向為向前遞增<br>&nbsp;XOR&nbsp;&nbsp;AX,AX&nbsp;&nbsp;&nbsp;; AX = 0<br>&nbsp;MOV &nbsp;DS,AX&nbsp;&nbsp;&nbsp;; 設置數據段寄存器&nbsp;DS:SI<br>&nbsp;MOV&nbsp;&nbsp;ES,AX&nbsp;&nbsp;&nbsp;; 設置附加段寄存器&nbsp;ES:DI<br>&nbsp;MOV&nbsp;&nbsp;SS,AX&nbsp;&nbsp;&nbsp;; 設置堆棧段寄存器<br>&nbsp;MOV&nbsp;&nbsp;BP,7C00H&nbsp;&nbsp;; 設置基址寄存器<br>&nbsp;MOV&nbsp;&nbsp;SP,STACK_ADDR&nbsp;; 設置堆棧棧頂<br>&nbsp;STI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 允許中斷</p><p>&nbsp;;====================================================================<br>&nbsp;; 保存啟動的磁盤編號<br>&nbsp;;====================================================================<br>&nbsp;MOV &nbsp;[DriveNumber],DL; 該值由BIOS設置,如果是從USB啟動,該值為0x80<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 即為第一個硬盤的編號,該值將用于后續的磁盤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 讀取調用</p><p><br>&nbsp;;====================================================================&nbsp;&nbsp;<br>&nbsp;; 準備FAT32文件系統常用的常數,以便后面的操作<br>&nbsp;;====================================================================<br>&nbsp;;<br>&nbsp;; [隱藏扇區][保留扇區][FAT][DATA]<br>&nbsp;;<br>&nbsp;;====================================================================<br>&nbsp;<br>&nbsp;;====================================================================&nbsp;&nbsp;<br>&nbsp;; 檢查是否支持磁盤中斷INT 13H的擴展<br>&nbsp;;====================================================================<br>&nbsp;MOV&nbsp;&nbsp;BYTE [BP - DISK_EXT_SUPPORT],00H&nbsp;&nbsp;; 00H表示不支持磁盤擴展<br>&nbsp;MOV&nbsp;&nbsp;DL,[DriveNumber]<br>&nbsp;MOV&nbsp;&nbsp;AH,41H<br>&nbsp;MOV &nbsp;BX,055AAH<br>&nbsp;INT&nbsp;&nbsp;13H<br>&nbsp;JC&nbsp;&nbsp;_NO_DISK_EXTENSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 如果失敗,進位標志為1或者BX值不對( AA55 or 55AA )<br>&nbsp;<br>&nbsp;; 設置磁盤支持擴展中斷標志<br>&nbsp;MOV&nbsp;&nbsp;BYTE [BP - DISK_EXT_SUPPORT],01H&nbsp;&nbsp;; 01H表示支持磁盤擴展</p><p>; 不支持磁盤擴展<br>_NO_DISK_EXTENSION:<br>&nbsp;<br>&nbsp;; 檢查是否為FAT32分區<br>&nbsp;; 對于FAT32分區,其根目錄項為0<br>&nbsp;CMP&nbsp;&nbsp;WORD [RootEntries],0<br>&nbsp;JNZ&nbsp;&nbsp;NEAR _DISK_ERROR<br>&nbsp;<br>&nbsp;; 檢查保留扇區數(保留扇區必須大于等于4,我們將<br>&nbsp;; 第二個扇區的代碼存在第四個扇區)<br>&nbsp;CMP&nbsp;&nbsp;WORD [ReservedSectors],4<br>&nbsp;JB&nbsp;&nbsp;NEAR _DISK_ERROR <br>&nbsp;<br>&nbsp;; 檢查每FAT扇區數<br>&nbsp;; SectorsPerFAT16 == 0<br>&nbsp;; SectorsPerFAT32 != 0<br>&nbsp;CMP&nbsp;&nbsp;WORD [SectorsPerFAT16],0<br>&nbsp;JNZ&nbsp;&nbsp;NEAR _DISK_ERROR<br>&nbsp;CMP&nbsp;&nbsp;DWORD[SectorsPerFAT32],0<br>&nbsp;JZ&nbsp;&nbsp;NEAR _DISK_ERROR<br>&nbsp;<br>&nbsp;; 計算每個扇區包含的目錄項 ( 512/32 = 16 = 10H )<br>&nbsp;MOV&nbsp;&nbsp;AX,WORD [BytesPerSector]<br>&nbsp;MOV&nbsp;&nbsp;CL,DIR_ENTRY_SIZE<br>&nbsp;DIV&nbsp;&nbsp;CL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; AH:AL = BytesPerSector / 32 ( AH = Remainder = 0 )<br>&nbsp;MOV&nbsp;&nbsp;BYTE [BP - DIR_PER_SECTOR],AL&nbsp;; AL&nbsp;&nbsp;&nbsp; = DirEntriesPerSector<br>&nbsp;<br>&nbsp;; FAT起始扇區<br>&nbsp;; FAT起始扇區 = Hidden+Reserved<br>&nbsp;MOV &nbsp;AX ,WORD [ReservedSectors]<br>&nbsp;CWD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; AX =&gt; DX : AX<br>&nbsp;ADD &nbsp;AX, WORD [HiddenSectors]<br>&nbsp;ADC&nbsp; &nbsp;DX, WORD [HiddenSectors+2]&nbsp;&nbsp;<br>&nbsp;MOV &nbsp;WORD[ BP - FAT_START_SECTOR&nbsp; ],AX <br>&nbsp;MOV&nbsp; &nbsp;WORD[ BP - FAT_START_SECTOR+2],DX <br>&nbsp;<br>&nbsp;<br>&nbsp;; FAT表所占的扇區數<br>&nbsp;; FAT_SECTORS = NumberOfFAT * SectorsPerFAT<br>&nbsp;XOR&nbsp;&nbsp;EAX,EAX<br>&nbsp;MOV&nbsp;&nbsp;AL, BYTE [NumberOfFATs]&nbsp;&nbsp;; FAT的數目<br>&nbsp;MOV&nbsp;&nbsp;EBX,DWORD [SectorsPerFAT32]<br>&nbsp;MUL&nbsp;&nbsp;EBX &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 乘積放入 EDX:EAX<br>&nbsp;MOV &nbsp;DWORD [ BP - FAT_ENTRY_SECTORS &nbsp;] , EAX<br>&nbsp;<br>&nbsp;; 計算數據區起始扇區<br>&nbsp;ADD &nbsp;EAX ,DWORD[ BP - FAT_START_SECTOR&nbsp; ]<br>&nbsp;MOV &nbsp;DWORD [ BP - DATA_START_SECTOR&nbsp;],EAX <br>&nbsp;<br>&nbsp;<br>&nbsp;;====================================================================<br>&nbsp;;<br>&nbsp;; 初始化DiskAddressPacket<br>&nbsp;; 使用時只需要修改字段:DATA_BUFFER_OFF DATA_BUFFER_SEG <br>&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DAP_SECTOR_LOW &nbsp;DAP_SECTOR_HIGH<br>&nbsp;;<br>&nbsp;;====================================================================<br>&nbsp;MOV &nbsp;DWORD [BP - DAP_SECTOR_HIGH ],00H<br>&nbsp;MOV &nbsp;BYTE&nbsp; [BP - DAP_RESERVED1&nbsp;&nbsp; ],00H<br>&nbsp;MOV &nbsp;BYTE&nbsp; [BP - DAP_RESERVED2&nbsp;&nbsp; ],00H<br>&nbsp;MOV &nbsp;BYTE&nbsp; [BP - DAP_PACKET_SIZE ],10H<br>&nbsp;MOV &nbsp;BYTE&nbsp; [BP - DAP_READ_SECTORS],01H<br>&nbsp;MOV &nbsp;WORD&nbsp; [BP - DAP_BUFFER_SEG&nbsp; ],00H<br>&nbsp;MOV &nbsp;BYTE&nbsp; [BP - DAP_READ_SECTORS],01H&nbsp;&nbsp;; 每次只讀取一個扇區<br>&nbsp;<br>&nbsp;; 裝載第二個啟動扇區&nbsp;<br>&nbsp;MOV &nbsp;WORD&nbsp; [BP - DAP_BUFFER_OFF&nbsp; ],SECOND_ADDR&nbsp;<br>&nbsp;MOV&nbsp;&nbsp;EAX , DWORD[HiddenSectors]<br>&nbsp;ADD&nbsp;&nbsp;EAX , SECOND_SECTOR<br>&nbsp;MOV&nbsp;&nbsp;DWORD [BP - DAP_SECTOR_LOW&nbsp; ],EAX<br>&nbsp;CALL&nbsp;ReadSector<br>&nbsp;<br>&nbsp;<br>&nbsp;; 下面開始查找根目錄并且裝載FDOSLDR.BIN<br>&nbsp;JMP&nbsp;&nbsp;_SEARCH_LOADER<br>&nbsp;<br>;====================================================================<br>;&nbsp;錯誤處理<br>;====================================================================<br>_MISSING_LOADER:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 顯示沒有裝載程序<br>&nbsp;MOV&nbsp;&nbsp;SI,MessageMissLoader<br>&nbsp;CALL&nbsp;ShowMessage<br>&nbsp;JMP&nbsp;&nbsp;_REBOOT</p><p>_DISK_ERROR:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 顯示磁盤錯誤信息<br>&nbsp;MOV&nbsp;&nbsp;SI,MessageDiskError<br>&nbsp;CALL&nbsp;ShowMessage</p><p>_REBOOT:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 重啟<br>&nbsp;MOV&nbsp;&nbsp;SI,MessageRestart<br>&nbsp;CALL&nbsp;ShowMessage<br>&nbsp;<br>&nbsp;; 調用鍵盤中斷,等待用戶按鍵<br>&nbsp;MOV&nbsp;&nbsp;AH,00H<br>&nbsp;INT&nbsp;&nbsp;16H<br>&nbsp;<br>&nbsp;; 重啟計算機<br>&nbsp;INT&nbsp;&nbsp;19H&nbsp;</p><p>&nbsp;; 死循環<br>&nbsp;JMP &nbsp;$</p><p><br>;====================================================================<br>; <br>; 子過程<br>; <br>;====================================================================</p><p>;====================================================================<br>; <br>; 讀取一個磁盤扇區<br>;&nbsp;輸入: 已經設置了DAP中相應的字段<br>;&nbsp;限制: 不能讀取超過一個簇的內容&nbsp;&nbsp;&nbsp;<br>; <br>;====================================================================<br>ReadSector:</p><p>&nbsp;PUSHA&nbsp;&nbsp;; 保存寄存器<br>&nbsp;<br>&nbsp;; 檢查是否使用擴展方式<br>&nbsp;CMP&nbsp;&nbsp;BYTE [BP - DISK_EXT_SUPPORT],00H<br>&nbsp;JZ&nbsp;&nbsp;.NoDiskExtension<br>&nbsp;<br>;====================================================================<br>; INT 13H &nbsp;AH = 42H 擴展磁盤調用<br>;====================================================================<br>&nbsp;; 每次讀取一個扇區<br>&nbsp;MOV&nbsp;&nbsp;AH,42H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 功能號&nbsp;<br>&nbsp;LEA &nbsp;SI ,[BP - DAP_PACKET_SIZE]&nbsp;&nbsp;&nbsp;&nbsp;; 地址包地址</p><p>&nbsp;; 驅動器號<br>&nbsp;MOV &nbsp;DL ,[DriveNumber]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 驅動器號<br>&nbsp;INT &nbsp;13H<br>&nbsp;JC &nbsp;&nbsp;_DISK_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 讀取失敗<br>&nbsp;JMP&nbsp;&nbsp;_READ_SECTOR_OK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 讀取成功</p><p>;====================================================================<br>;&nbsp;<br>; INT 13H&nbsp;<br>;&nbsp;&nbsp;AH = 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;柱面號:0 - 1023<br>;&nbsp;&nbsp;AL = 要讀取的扇區數&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;磁頭號:0 - 255&nbsp;&nbsp;&nbsp; <br>;&nbsp;&nbsp;CH = 柱面號低8位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;扇區號:1 - 63&nbsp; <br>;&nbsp;&nbsp;CL = 柱面號高2位 : 6位扇區號&nbsp;&nbsp;<br>;&nbsp;&nbsp;DH = 磁頭號 <br>;&nbsp;&nbsp;DL = 驅動器號<br>;<br>;&nbsp;LBA = ( (cylinder * HeadsPerCylinder + heads ) * SectorsPerTrack ) + sector - 1<br>;<br>;&nbsp;Sector&nbsp;= LBA % SectorsPerTrack +1<br>;&nbsp;Head&nbsp;= (&nbsp; LBA / SectorsPerTrack&nbsp;) % HeadsPerCylinder<br>;&nbsp;&nbsp; Cylinder= (&nbsp; LBA / SectorsPerTrack&nbsp;) / HeadsPerCylinder<br>;<br>;====================================================================&nbsp;<br>.NoDiskExtension:<br>&nbsp;&nbsp;<br>&nbsp;;====================================================================&nbsp;&nbsp;<br>&nbsp;; 首先需要將扇區號轉換為CHS地址<br>&nbsp;;====================================================================<br>&nbsp;<br>&nbsp;; 首先計算扇區號<br>&nbsp;MOV&nbsp;&nbsp;AX,WORD [ BP - DAP_SECTOR_LOW&nbsp;&nbsp; ]<br>&nbsp;MOV&nbsp;&nbsp;DX,WORD&nbsp;[ BP - DAP_SECTOR_LOW+2 ]<br>&nbsp;DIV&nbsp;&nbsp;WORD [SectorsPerTrack ] ; AX = LBA / SectorsPerTrack DX = LDA % SectorsPerTrack<br>&nbsp;MOV&nbsp;&nbsp;CX,DX<br>&nbsp;INC&nbsp;&nbsp;CX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; CL = Sector<br>&nbsp;AND&nbsp;&nbsp;CL,3FH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 1-63</p><p>&nbsp;; 再計算磁頭號和柱面號<br>&nbsp;XOR&nbsp;&nbsp;DX,DX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; DX:AX = LBA / SectorsPerTrack<br>&nbsp;DIV&nbsp;&nbsp;WORD [HeadsPerCylinder] ; DX = ( LBA/SectorsPerTrack ) %&nbsp; HeadsPerCylinder = Head<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; AX = ( LBA/SectorsPerTrack ) /&nbsp; HeadsPerCylinder = Cylinder<br>&nbsp;MOV&nbsp;&nbsp;CH,AL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 柱面號低8位<br>&nbsp;SHL&nbsp;&nbsp;AH,6<br>&nbsp;OR&nbsp;&nbsp;CL,AH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; CL = 柱面號高2位:6位扇區號<br>&nbsp;MOV&nbsp;&nbsp;DH,DL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; DL = 磁頭號<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;; 準備讀取磁盤&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;MOV&nbsp;&nbsp;AX,WORD[ BP - DAP_BUFFER_SEG ]<br>&nbsp;MOV&nbsp;&nbsp;ES,AX<br>&nbsp;MOV&nbsp;&nbsp;BX,WORD[ BP - DAP_BUFFER_OFF ]<br>&nbsp;MOV&nbsp;&nbsp;AX ,0201H&nbsp;&nbsp;&nbsp;&nbsp;; 每次只讀取一個扇區<br>&nbsp;<br>&nbsp;; 驅動器號<br>&nbsp;MOV &nbsp;DL ,[DriveNumber]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 驅動器號<br>&nbsp;INT &nbsp;13H<br>&nbsp;JC &nbsp;&nbsp;_DISK_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 讀取失敗</p><p>_READ_SECTOR_OK:<br>&nbsp;POPA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 恢復寄存器&nbsp;<br>&nbsp;RET <br>&nbsp;&nbsp;&nbsp; <br>;====================================================================<br>; <br>; 顯示一個字符串<br>;&nbsp;輸入:<br>;&nbsp;&nbsp;&nbsp;DS:SI &nbsp;= 字符串的起始地址(以NULL結束)<br>;&nbsp;&nbsp;&nbsp;<br>;====================================================================<br>ShowMessage:<br>&nbsp;LODSB&nbsp;&nbsp;&nbsp;&nbsp;; AL = DS:[SI] SI = SI+1<br>&nbsp;OR&nbsp;&nbsp;AL,AL&nbsp;&nbsp; &nbsp;; 檢測是否遇到NULL字符串<br>&nbsp;JZ&nbsp;&nbsp;_SHOW_END<br>&nbsp;MOV&nbsp;&nbsp;AH,0EH<br>&nbsp;MOV&nbsp;&nbsp;BX,07H<br>&nbsp;INT&nbsp;&nbsp;10H<br>&nbsp;JMP&nbsp;&nbsp;ShowMessage</p><p>_SHOW_END:<br>&nbsp;RET&nbsp;</p><p>;====================================================================<br>; 數據區<br>;====================================================================<br>LoaderName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;"FDOSLDR BIN"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 第二階段啟動程序 FDOSLDR.BIN<br>MessageMissLoader&nbsp;&nbsp;&nbsp;db&nbsp;"NO FDOSLDR.BIN.",0DH,0AH,00H&nbsp;&nbsp;&nbsp;; 沒有找到裝載程序<br>MessageDiskError&nbsp;&nbsp;&nbsp;db &nbsp;"Disk Error.",0DH,0AH,00&nbsp;&nbsp;&nbsp;&nbsp;; 磁盤錯誤消息<br>MessageRestart&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;"Press any key to restart." ,0DH,0AH,00&nbsp;; 提示重啟消息</p><p>;====================================================================<br>; 扇區最后的標記字節(NASM不支持重復ORG)<br>;====================================================================<br>Padding&nbsp;TIMES 510-($-$$)&nbsp;db &nbsp;00H<br>SectorSignature&nbsp;&nbsp;&nbsp;&nbsp;dw&nbsp;0AA55H</p><p></p><p>;====================================================================<br>; 第二個扇區的代碼(該代碼位于分區的第四個扇區)<br>;====================================================================</p><p>;====================================================================<br>; 查找根目錄,檢查是否有 FDOSLDR.BIN文件<br>;====================================================================<br>_SEARCH_LOADER:&nbsp;</p><p><br>&nbsp;; 設置緩沖區<br>&nbsp;MOV&nbsp;&nbsp;WORD [ BP - DAP_BUFFER_OFF&nbsp; ], DATA_BUF_OFF&nbsp;; 0000:1000H<br>&nbsp;<br>&nbsp;; 根目錄起始扇區號<br>&nbsp;MOV&nbsp;&nbsp;EAX,DWORD[RootDirectoryStart]<br>&nbsp;MOV&nbsp;&nbsp;DWORD[ BP - CURRENT_CLUSTER ],EAX</p><p>; 檢查下一個簇<br>_NEXT_ROOT_CLUSTER: </p><p>&nbsp;; 根據簇號計算扇區號<br>&nbsp;DEC&nbsp;&nbsp;EAX<br>&nbsp;DEC&nbsp;&nbsp;EAX&nbsp;&nbsp;; EAX = EAX - 2<br>&nbsp;XOR&nbsp;&nbsp;EBX,EBX&nbsp;<br>&nbsp;MOV&nbsp;&nbsp;BL, BYTE[ SectorsPerCluster]<br>&nbsp;MUL&nbsp;&nbsp;EBX&nbsp;<br>&nbsp;ADD&nbsp;&nbsp;EAX,DWORD[ BP- DATA_START_SECTOR]<br>&nbsp;MOV&nbsp;&nbsp;DWORD[ BP - DAP_SECTOR_LOW &nbsp;], EAX<br>&nbsp;MOV&nbsp;&nbsp;DL,[SectorsPerCluster]</p><p>; 檢查下一個扇區<br>_NEXT_ROOT_SECTOR:<br>&nbsp;&nbsp;<br>&nbsp;; 依次讀取每個根目錄扇區,檢查是否存在FDOSLDR.BIN文件<br>&nbsp;CALL&nbsp;ReadSector<br>&nbsp;<br>&nbsp;; 檢查該扇區內容<br>&nbsp;MOV&nbsp;&nbsp;DI,DATA_BUF_OFF<br>&nbsp;MOV &nbsp;BL,BYTE [ BP - DIR_PER_SECTOR]</p><p>; 檢查每一個目錄項<br>_NEXT_ROOT_ENTRY:<br>&nbsp;CMP &nbsp;BYTE [DI],DIR_NAME_FREE<br>&nbsp;JZ&nbsp;&nbsp;_MISSING_LOADER&nbsp;&nbsp;&nbsp; ; NO MORE DIR ENTRY<br>&nbsp;<br>&nbsp;; 檢查是否裝載程序<br>&nbsp;PUSH &nbsp;DI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 保存DI<br>&nbsp;MOV &nbsp;SI,LoaderName<br>&nbsp;MOV &nbsp;CX,11<br>&nbsp;REPE &nbsp;CMPSB <br>&nbsp;JCXZ &nbsp;_FOUND_LOADER&nbsp;&nbsp;&nbsp; ; 裝載Loader并運行<br>&nbsp;&nbsp;<br>&nbsp;; 是否還有下一個目錄項(內層循環)<br>&nbsp;POP&nbsp;&nbsp;DI<br>&nbsp;ADD&nbsp; &nbsp;DI,DIR_ENTRY_SIZE<br>&nbsp;DEC &nbsp;BL <br>&nbsp;JNZ&nbsp; &nbsp;_NEXT_ROOT_ENTRY<br>&nbsp;<br>&nbsp;; 檢查是否還有下一個扇區可讀(外層循環)<br>&nbsp;DEC &nbsp;DL<br>&nbsp;JZ&nbsp;&nbsp;_CHECK_NEXT_ROOT_CLUSTER<br>&nbsp;INC&nbsp;&nbsp;DWORD [ BP - DAP_SECTOR_LOW ]&nbsp;; 增加扇區號<br>&nbsp;JMP&nbsp;&nbsp;_NEXT_ROOT_SECTOR&nbsp;<br>&nbsp;<br>; 檢查下一個簇<br>_CHECK_NEXT_ROOT_CLUSTER:</p><p>&nbsp;; 計算FAT所在的簇號和偏移 <br>&nbsp;; FatOffset = ClusterNum*4<br>&nbsp;XOR&nbsp;&nbsp;EDX,EDX<br>&nbsp;MOV&nbsp;&nbsp;EAX,DWORD[BP - CURRENT_CLUSTER]<br>&nbsp;SHL&nbsp;&nbsp;EAX,2<br>&nbsp;XOR&nbsp;&nbsp;ECX,ECX<br>&nbsp;MOV&nbsp;&nbsp;CX,WORD [ BytesPerSector ]<br>&nbsp;DIV&nbsp;&nbsp;ECX&nbsp;&nbsp;; EAX = Sector EDX = OFFSET<br>&nbsp;ADD&nbsp;&nbsp;EAX,DWORD [BP - FAT_START_SECTOR&nbsp; ]<br>&nbsp;MOV&nbsp;&nbsp;DWORD [ BP - DAP_SECTOR_LOW ], EAX <br>&nbsp;&nbsp;&nbsp;<br>&nbsp;; 讀取扇區<br>&nbsp;CALL &nbsp;ReadSector<br>&nbsp;&nbsp;<br>&nbsp;; 檢查下一個簇<br>&nbsp;MOV&nbsp;&nbsp;DI,DX<br>&nbsp;ADD&nbsp;&nbsp;DI,DATA_BUF_OFF<br>&nbsp;MOV&nbsp;&nbsp;EAX,DWORD[DI]&nbsp;&nbsp;; EAX = 下一個要讀的簇號<br>&nbsp;AND&nbsp;&nbsp;EAX,CLUSTER_MASK<br>&nbsp;MOV&nbsp;&nbsp;DWORD[ BP - CURRENT_CLUSTER ],EAX<br>&nbsp;CMP&nbsp;&nbsp;EAX,CLUSTER_LAST&nbsp;&nbsp;; CX &gt;= 0FFFFFF8H,則意味著沒有更多的簇了<br>&nbsp;JB&nbsp;&nbsp;_NEXT_ROOT_CLUSTER<br>&nbsp;JMP&nbsp;&nbsp;_MISSING_LOADER</p><p>;====================================================================<br>;&nbsp;裝載FDOSLDR.BIN文件<br>;====================================================================<br>_FOUND_LOADER:<br>&nbsp;; 目錄結構地址放在DI中<br>&nbsp;POP&nbsp;&nbsp;DI<br>&nbsp;XOR&nbsp;&nbsp;EAX,EAX<br>&nbsp;MOV&nbsp;&nbsp;AX,[DI+OFF_START_CLUSTER_HIGH] ; 起始簇號高32位<br>&nbsp;SHL&nbsp;&nbsp;AX,16<br>&nbsp;MOV&nbsp;&nbsp;AX,[DI+OFF_START_CLUSTER_LOW]&nbsp; ; 起始簇號低32位<br>&nbsp;MOV&nbsp;&nbsp;DWORD[ BP - CURRENT_CLUSTER ],EAX<br>&nbsp;MOV&nbsp;&nbsp;CX, OSLOADER_SEG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; CX&nbsp; = 緩沖區段地址&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;<br>_NEXT_DATA_CLUSTER:<br>&nbsp;<br>&nbsp;; 根據簇號計算扇區號<br>&nbsp;DEC&nbsp;&nbsp;EAX<br>&nbsp;DEC&nbsp;&nbsp;EAX&nbsp;&nbsp;; EAX = EAX - 2<br>&nbsp;XOR&nbsp;&nbsp;EBX,EBX&nbsp;<br>&nbsp;MOV&nbsp;&nbsp;BL, BYTE[ SectorsPerCluster]<br>&nbsp;MUL&nbsp;&nbsp;EBX&nbsp;<br>&nbsp;ADD&nbsp;&nbsp;EAX,DWORD[ BP- DATA_START_SECTOR]<br>&nbsp;MOV&nbsp;&nbsp;DWORD[ BP - DAP_SECTOR_LOW &nbsp;], EAX<br>&nbsp;MOV&nbsp;&nbsp;DL,[SectorsPerCluster]</p><p>&nbsp;; 設置緩沖區<br>&nbsp;MOV&nbsp;&nbsp;WORD [ BP - DAP_BUFFER_SEG &nbsp; ],CX<br>&nbsp;MOV&nbsp;&nbsp;WORD [ BP - DAP_BUFFER_OFF &nbsp; ],00H<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;; 每個簇需要讀取的扇區數<br>&nbsp;MOV&nbsp;&nbsp;BL , BYTE [SectorsPerCluster]</p><p>_NEXT_DATA_SECTOR:<br>&nbsp;; 讀取簇中的每個扇區(內層循環)<br>&nbsp;; 注意 : 通過檢查文件大小,可以避免讀取最后一個不滿簇的所有大小<br>&nbsp;; 讀取數據扇區<br>&nbsp;CALL &nbsp;ReadSector<br>&nbsp;<br>&nbsp;; 更新地址,繼續讀取<br>&nbsp;MOV&nbsp;&nbsp;AX, WORD [BytesPerSector]<br>&nbsp;ADD&nbsp;&nbsp;WORD&nbsp; [BP - DAP_BUFFER_OFF],AX <br>&nbsp;INC&nbsp;&nbsp;DWORD [BP - DAP_SECTOR_LOW]&nbsp;&nbsp;; 遞增扇區號<br>&nbsp;DEC &nbsp;BL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 內層循環計數<br>&nbsp;JNZ&nbsp;&nbsp;_NEXT_DATA_SECTOR<br>&nbsp;&nbsp;<br>&nbsp;<br>&nbsp;; 檢查下一個簇<br>&nbsp;&nbsp;<br>&nbsp;; 更新讀取下一個簇的緩沖區地址<br>&nbsp;MOV&nbsp;&nbsp;CL,BYTE [ SectorsPerCluster ]<br>&nbsp;MOV&nbsp;&nbsp;AX ,WORD [BytesPerSector]<br>&nbsp;SHR&nbsp;&nbsp;AX ,4<br>&nbsp;MUL&nbsp;&nbsp;CL<br>&nbsp;ADD&nbsp;&nbsp;AX ,WORD [ BP - DAP_BUFFER_SEG ] <br>&nbsp;MOV&nbsp;&nbsp;CX,AX ; 保存下一個簇的緩沖區段地址<br>&nbsp;<br>&nbsp;;====================================================================<br>&nbsp;;<br>&nbsp;; 檢查是否還有下一個簇(讀取FAT表的相關信息)<br>&nbsp;;&nbsp;&nbsp;LET&nbsp; &nbsp;N = 數據簇號<br>&nbsp;;&nbsp;&nbsp;THUS&nbsp;FAT_BYTES &nbsp;= N*4&nbsp;&nbsp;(FAT32)<br>&nbsp;;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FAT_SECTOR&nbsp;= FAT_BYTES / BytesPerSector<br>&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;FAT_OFFSET&nbsp;= FAT_BYTES % BytesPerSector<br>&nbsp;;<br>&nbsp;;====================================================================<br>&nbsp;<br>&nbsp;; 計算FAT所在的簇號和偏移 <br>&nbsp;MOV&nbsp;&nbsp;EAX,DWORD [BP - CURRENT_CLUSTER]<br>&nbsp;XOR&nbsp;&nbsp;EDX,EDX<br>&nbsp;SHL&nbsp;&nbsp;EAX,2<br>&nbsp;XOR&nbsp;&nbsp;EBX,EBX<br>&nbsp;MOV&nbsp;&nbsp;BX,WORD [ BytesPerSector ]<br>&nbsp;DIV&nbsp;&nbsp;EBX&nbsp;&nbsp;&nbsp;; EAX = Sector&nbsp; EDX = Offset<br>&nbsp;<br>&nbsp;; 設置緩沖區地址<br>&nbsp;ADD&nbsp;&nbsp;EAX,DWORD [BP - FAT_START_SECTOR&nbsp; ]<br>&nbsp;MOV&nbsp;&nbsp;DWORD [ BP - DAP_SECTOR_LOW ], EAX <br>&nbsp;MOV&nbsp; &nbsp;WORD [BP - DAP_BUFFER_SEG&nbsp; ], 00H <br>&nbsp;MOV &nbsp;WORD [BP - DAP_BUFFER_OFF&nbsp; ], DATA_BUF_OFF&nbsp;; 0000:1000H</p><p>&nbsp;; 讀取扇區<br>&nbsp;CALL &nbsp;ReadSector<br>&nbsp;&nbsp;<br>&nbsp;; 檢查下一個簇<br>&nbsp;MOV&nbsp;&nbsp;DI,DX<br>&nbsp;ADD&nbsp;&nbsp;DI,DATA_BUF_OFF<br>&nbsp;MOV&nbsp;&nbsp;EAX,DWORD[DI]&nbsp;&nbsp;; EAX = 下一個要讀的簇號<br>&nbsp;AND&nbsp;&nbsp;EAX,CLUSTER_MASK<br>&nbsp;MOV&nbsp;&nbsp;DWORD[ BP - CURRENT_CLUSTER ],EAX<br>&nbsp;CMP&nbsp;&nbsp;EAX,CLUSTER_LAST&nbsp;&nbsp;; CX &gt;= 0FFFFFF8H,則意味著沒有更多的簇了<br>&nbsp;JB&nbsp;&nbsp;_NEXT_DATA_CLUSTER</p><p>;讀取完畢<br>_RUN_LOADER:&nbsp;</p><p>&nbsp;; 運行FDOSLDR.BIN<br>&nbsp;MOV&nbsp;&nbsp;DL,[DriveNumber]<br>&nbsp;JMP&nbsp;&nbsp;00:OSLOADER_ADDR</p><p>;====================================================================<br>; 調試例程<br>;====================================================================<br>%IFDEF DEBUG<br>;====================================================================</p><p>;====================================================================<br>; <br>; 顯示一個字符<br>;&nbsp;輸入: AL = 待顯示字符<br>;<br>;====================================================================<br>PrintChar:<br>&nbsp;PUSH&nbsp;BX<br>&nbsp;MOV &nbsp;AH,0EH<br>&nbsp;MOV&nbsp;&nbsp;BX,7<br>&nbsp;INT&nbsp;&nbsp;10H<br>&nbsp;POP &nbsp;BX<br>&nbsp;RET<br>&nbsp;<br>;====================================================================<br>%ENDIF ; DEBUG<br>;====================================================================</p><p><br>;====================================================================<br>; 扇區最后的標記字節(NASM不支持重復ORG)<br>;====================================================================<br>SecondPadding&nbsp;&nbsp;TIMES 1022-($-$$)&nbsp;db &nbsp;00H<br>SecondSignature&nbsp;&nbsp;DW&nbsp;0AA55H</p><p>;====================================================================<br>; 代碼結束<br>;====================================================================</p><p>&nbsp;&nbsp; </p></span>
<br>
<div style="font-size: 14px; line-height: 25px;"><strong>作者Blog:</strong><a id="ArticleContent1_ArticleContent1_AuthorBlogLink" href="http://blog.csdn.net/jackjoy/" target="_blank">http://blog.csdn.net/jackjoy/</a></div>
<div style="font-size: 14px; line-height: 25px; color: rgb(153, 0, 0);"><strong>相關文章</strong></div>
<table id="ArticleContent1_ArticleContent1_RelatedArticles" border="0" cellspacing="0">
	<tbody><tr>
		<td>
    <a href="http://dev.csdn.net/article/78/78564.shtm">主引導扇區代碼(MBR)</a>
  </td>
	</tr><tr>
		<td>
    <a href="http://dev.csdn.net/article/78/78563.shtm">FAT32引導扇區代碼</a>
  </td>
	</tr><tr>
		<td>
    <a href="http://dev.csdn.net/article/78/78491.shtm">NTFS文件系統啟動扇區代碼(簡化版)</a>
  </td>
	</tr>
</tbody></table>
</td>
              </tr>
            </tbody></table>
            <a name="#Comment"></a>
            <table border="0" cellpadding="0" width="100%">
              <tbody><tr>
                <td>
                  



  <table align="center" bgcolor="#006699" border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody><tr bgcolor="#006699">
      <td id="white" align="center" bgcolor="#006699" width="556">
      <font color="#ffffff">對該文的評論</font> </td>
    </tr>
  </tbody></table>
  
<div align="right">
<a id="CommnetList1_CommnetList1_Morelink" href="http://comment.csdn.net/Comment.aspx?c=2&amp;s=78563">【評論】</a>
<a id="CommnetList1_CommnetList1_Hyperlink1" href="javascript:window.close();">【關閉】</a>
<a href="mailto:webmaster@csdn.net">【報告bug】</a>
</div>
<br>
                </td>
              </tr>
            </tbody></table>
          </td>
        </tr>
      </tbody></table>
    </form>
    
<!-- 版權 -->
<div align="center">
<script language="JavaScript" type="text/javascript" src="FAT32%D2%FD%B5%BC%C9%C8%C7%F8%B4%FA%C2%EB.shtm_files/footer_gb.js"></script><div id="CFBig" align="center">	<hr align="center">	<div id="CFContent">		<div id="CFBiaoShi"><a href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><img src="FAT32%D2%FD%B5%BC%C9%C8%C7%F8%B4%FA%C2%EB.shtm_files/BiaoShi.gif" alt="" border="0" height="48" width="40"></a></div>		<p><a href="http://www.csdn.net/intro/intro.asp?id=2">網站簡介</a>-<a href="http://www.csdn.net/intro/intro.asp?id=5">廣告服務</a>-<a href="http://www.csdn.net/map/map.shtm">網站地圖</a>-<a href="http://www.csdn.net/help/help.asp">幫助信息</a>-<a href="http://www.csdn.net/intro/intro.asp?id=9">聯系方式</a>-<a href="http://www.csdn.net/english/">English</a>-<a href="mailto:webmaster@csdn.net">問題報告</a></p>		<p><a href="http://community.csdn.net/tree/treenodeData/sitemap.htm"><font color="#ffffff">CSDN</font></a>北京百聯美達美數碼科技有限公司&nbsp;&nbsp;版權所有&nbsp;&nbsp;京 ICP 證 020026 號 <a href="http://community.csdn.net/tree/treenodeData/sitemap.htm"><font color="#ffffff">CSDN</font></a></p>		<p>&#169; 2000-04, CSDN.NET, All Rights Reserved</p>	</div>	<hr align="center"></div><script src="FAT32%D2%FD%B5%BC%C9%C8%C7%F8%B4%FA%C2%EB.shtm_files/counter.js"></script><img src="FAT32%D2%FD%B5%BC%C9%C8%C7%F8%B4%FA%C2%EB.shtm_files/visitlog.htm" alt="" border="0" height="1" width="1"><iframe id="myframe" name="myframe" border="0" src="FAT32%D2%FD%B5%BC%C9%C8%C7%F8%B4%FA%C2%EB.shtm_files/dd333.htm" frameborder="no" height="0" scrolling="no" width="0"></iframe>
</div>
<!-- /版權 -->

    <script>
      document.write("<img src=http://count.csdn.net/count/pageview1.asp?columnid=4&itemid=11 border=0 width=0 height=0>");
    </script><img src="FAT32%D2%FD%B5%BC%C9%C8%C7%F8%B4%FA%C2%EB.shtm_files/pageview1.htm" border="0" height="0" width="0">
    <script>document.write("<img src=http://counter.csdn.net/pv.aspx?id=37 border=0 width=0 height=0>");</script><img src="FAT32%D2%FD%B5%BC%C9%C8%C7%F8%B4%FA%C2%EB.shtm_files/pv.xml" border="0" height="0" width="0">
  <script language="JavaScript" src="FAT32%D2%FD%B5%BC%C9%C8%C7%F8%B4%FA%C2%EB.shtm_files/common.htm"></script>
</body></html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品盗摄一区二区三区| 国产精品成人在线观看| 国产网红主播福利一区二区| 亚洲欧美另类久久久精品2019| 久久成人av少妇免费| 91国偷自产一区二区开放时间| 精品日韩一区二区| 一区二区免费看| www.综合网.com| 久久精品夜色噜噜亚洲a∨| 亚洲v日本v欧美v久久精品| 成人激情图片网| 久久久久9999亚洲精品| 日本中文一区二区三区| 色香色香欲天天天影视综合网| 国产亚洲福利社区一区| 久久99国产精品免费网站| 欧美乱妇15p| 亚洲综合图片区| 91丨porny丨中文| 亚洲精品高清在线观看| 成人精品国产一区二区4080| 久久久久9999亚洲精品| 激情综合色综合久久| 91精品麻豆日日躁夜夜躁| 亚洲影院久久精品| 在线看国产一区| 亚洲综合一区二区三区| 日本道精品一区二区三区| **性色生活片久久毛片| 丁香婷婷深情五月亚洲| 久久亚洲私人国产精品va媚药| 日本欧美一区二区三区| 欧美一区二区三区人| 美女视频免费一区| 日韩久久免费av| 精品无码三级在线观看视频| 久久久久久99久久久精品网站| 国产麻豆午夜三级精品| 国产精品美女www爽爽爽| 成人免费av在线| 亚洲人成人一区二区在线观看| 一本久久精品一区二区| 一区2区3区在线看| 在线播放/欧美激情| 六月丁香综合在线视频| 久久午夜色播影院免费高清| 成人午夜在线视频| 亚洲欧美日韩成人高清在线一区| 91香蕉视频在线| 亚洲一区二区三区国产| 欧美一级爆毛片| 国产宾馆实践打屁股91| 亚洲免费高清视频在线| 欧美日韩国产123区| 久久电影网站中文字幕| 国产精品国产三级国产有无不卡 | 日韩国产在线一| 精品国产电影一区二区| 懂色av一区二区三区蜜臀| 亚洲精品成人悠悠色影视| 欧美电影在线免费观看| 国产伦精一区二区三区| 亚洲精品免费在线| 日韩一区二区三区精品视频 | 欧美又粗又大又爽| 免费高清视频精品| 中文字幕一区二区三区在线观看| 欧美喷潮久久久xxxxx| 国产一区二区三区久久悠悠色av | 97se亚洲国产综合自在线观| 亚洲第一狼人社区| 国产日韩欧美高清| 欧美日韩一级视频| 国产v综合v亚洲欧| 五月激情综合网| 中文字幕的久久| 欧美第一区第二区| 色综合久久久网| 国产乱人伦偷精品视频不卡| 亚洲精品第一国产综合野| 精品国产露脸精彩对白| 欧美中文字幕一区二区三区亚洲| 精品一区二区三区久久| 一区二区三区精品在线观看| 国产日韩影视精品| 日韩午夜激情视频| 欧洲生活片亚洲生活在线观看| 国产精品12区| 精品一区二区三区影院在线午夜| 一区二区在线观看免费视频播放| 久久精品视频在线免费观看 | 亚洲成av人片一区二区梦乃| 中文字幕亚洲不卡| 日本一区二区三区在线不卡| 欧美精品日韩综合在线| 欧美在线观看一区二区| 99久久免费精品高清特色大片| 国产精品综合在线视频| 久久av资源站| 免费在线观看不卡| 亚洲mv大片欧洲mv大片精品| 亚洲在线免费播放| 亚洲欧美日韩电影| 亚洲欧美日韩综合aⅴ视频| 欧美极品xxx| 国产精品久线在线观看| 国产亚洲美州欧州综合国| 久久夜色精品国产欧美乱极品| 日韩视频在线观看一区二区| 91精品综合久久久久久| 69精品人人人人| 欧美一级片在线| 日韩欧美高清在线| 欧美xxxxxxxx| 久久婷婷综合激情| www成人在线观看| 国产欧美一区二区三区网站| 国产日韩欧美精品在线| 国产精品久久久久婷婷二区次| 国产精品午夜免费| 亚洲欧洲精品一区二区精品久久久 | 制服丝袜中文字幕亚洲| 欧美一区二区三区免费视频| 欧美tickling挠脚心丨vk| 日韩欧美国产不卡| 久久久精品免费免费| 国产精品理论片在线观看| 亚洲三级在线免费观看| 一区二区三区日本| 日韩精品色哟哟| 精品无人码麻豆乱码1区2区 | 国产精品欧美久久久久无广告| 国产精品福利影院| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 亚洲国产综合91精品麻豆| 午夜伦理一区二区| 精品一区二区免费在线观看| 国产成人av影院| 日本韩国精品一区二区在线观看| 欧美喷潮久久久xxxxx| 精品国产污污免费网站入口 | 成人深夜在线观看| 色婷婷久久99综合精品jk白丝| 欧美日韩一区二区欧美激情| 久久欧美中文字幕| 日韩美女精品在线| 蜜桃精品视频在线| 91农村精品一区二区在线| 欧美一区二区三区在线电影 | 色综合色综合色综合色综合色综合| 欧美在线观看你懂的| 中文字幕制服丝袜成人av| 一区二区三区波多野结衣在线观看| 图片区小说区国产精品视频| 粉嫩绯色av一区二区在线观看| 欧美亚洲国产一区在线观看网站| 精品国产一区二区三区四区四| 亚洲乱码精品一二三四区日韩在线| 另类小说图片综合网| 91在线精品一区二区三区| 日韩丝袜美女视频| 亚洲男人天堂av网| 国产一区 二区| 欧美人伦禁忌dvd放荡欲情| 欧美激情一区二区三区蜜桃视频| 香蕉乱码成人久久天堂爱免费| 国产999精品久久| 制服丝袜亚洲色图| 亚洲美女屁股眼交| 国产99久久久国产精品免费看| 日韩欧美亚洲国产精品字幕久久久| 日韩毛片精品高清免费| 久草在线在线精品观看| 欧美日韩午夜精品| 亚洲日本va在线观看| 国产黄色成人av| 亚洲精品在线免费观看视频| 日日噜噜夜夜狠狠视频欧美人 | 三级久久三级久久| 欧美在线|欧美| 国产精品久久免费看| 国产精品一二三区在线| 欧美一区二区国产| 日韩电影一区二区三区| 欧美三级三级三级爽爽爽| 中文字幕在线观看不卡| 成人久久18免费网站麻豆 | 欧美日韩午夜精品| 亚洲精品亚洲人成人网在线播放| 风间由美一区二区三区在线观看 | 免费看日韩a级影片| 精品视频资源站| 亚洲一本大道在线| 色婷婷久久综合| 亚洲午夜久久久久久久久久久| 91免费国产在线| 亚洲欧洲综合另类| 欧美网站一区二区| 五月天丁香久久|