|
OFF_CREATE_TIME EQU 14 ; 创建时间 WORD OFF_CREATE_DATE EQU 16 ; 创建时间 WORD OFF_LAST_ACCESS_DATE EQU 18 ; 上次访问时间 WORD OFF_START_CLUSTER_HIGH EQU 20 ; 起始簇号高位 WORD OFF_LAST_UPDATE_TIME EQU 22 ; 上次更新时间 WORD OFF_LAST_UPDATE_DATE EQU 24 ; 上次更新时间 WORD OFF_START_CLUSTER_LOW EQU 26 ; 起始簇号低位 WORD OFF_FILE_SIZE EQU 28 ; 文件尺寸 DWORD
; 相关常量 DIR_NAME_DELETED EQU 0E5H ; 该项已经被删除 DIR_NAME_FREE EQU 00H ; 该项是空闲的(其后也是空闲的) DIR_NAME_DOT EQU 2EH ; 特殊目录 . 或 .. DIR_NAME_SPACE EQU 20H ; 不允许的字符 DIR_ENTRY_SIZE EQU 32 ; 每个目录项的尺寸,其结构如上所示
;文件属性 DIR_ATTR_READONLY EQU 01H ; 只读文件 DIR_ATTR_HIDDEN EQU 02H ; 隐藏文件 DIR_ATTR_SYSTEM EQU 04H ; 系统文件 DIR_ATTR_VOLUME EQU 08H ; 卷标号(只可能出现在根目录中) DIR_ATTR_SUBDIR EQU 10H ; 子目录 DIR_ATTR_ARCHIVE EQU 20H ; 归档属性 DIR_ATTR_LONGNAME EQU 0FH ; 长文件名 DIR_ATTR_LONGNAME_MASK EQU 3FH ; 长文件名掩码 你复制的文字来自西部网安
; 簇属性 CLUSTER_MASK EQU 0FFFFFFFH ; 簇号掩码(FAT32=〉FAT28) CLUSTER_FREE EQU 00000000H ; 簇是空闲的 CLUSTER_RESERVED EQU 00000001H ; 簇是保留的 CLUSTER_MIN_VALID EQU 00000002H ; 最小有效簇号 CLUSTER_MAX_VALID EQU 0FFFFFF6H ; 最大有效簇号 CLUSTER_BAD EQU 0FFFFFF7H ; 坏簇 CLUSTER_LAST EQU 0FFFFFF8H ;0xFFFFFFF8-0xFFFFFFFF表示文件的最后一个簇
;==================================================================== ; ; 启动扇区(512字节) ; ;==================================================================== _ENTRY_POINT:
; 3字节的跳转指令 JMP SHORT _BOOT_CODE ; 跳转到真正的引导代码 网安官方站 NOP ; 空指令以保证字节数为3
; 8字节的OEMName OEMName DB “FDOS1.00“
;==================================================================== ; ; BPB( BIOS Parameter Block ) ; ;==================================================================== BytesPerSector DW ? ; 每个扇区的字节数 (512 1024 2048 4096) SectorsPerCluster DB ? ; 每个簇的扇区数 ( 1 2 4 8 16 32 64 128 ) ; 两者相乘不能超过32K(簇最大大小) ReservedSectors DW ? ; 从卷的第一个扇区开始的保留扇区数目; ; 该值不能为0,对于FAT12/FAT16,该值通常为1; ; 对于FAT32,典型值为32; NumberOfFATs DB ? ; 卷上FAT数据结构的数目,该值通常应为2 RootEntries DW ? ; 对于FAT12/FAT16,该值表示32字节目录项的数目; ; 对于FAT32,该值必须为0; NumberOfSectors16 DW ? ; 该卷上的扇区总数,该字段可以为0,如果该字段 ; 为0,则NumberOfSectors32不能为0;对于FAT32, ; 该字段必须为0 MediaDescriptor DB ? ; 介质类型 SectorsPerFAT16 DW ? ; 该字段标识一个FAT结构占有的扇区数(FAT12/FAT16), ; 对于FAT32卷,该字段必须为0; SectorsPerTrack DW ? ; 用于INT 0x13中断的每个磁道的扇区数 HeadsPerCylinder DW ? ; 用于INT 0x13中断的每个柱面的磁头数 westsafe.net HiddenSectors DD ? ; 包含该FAT卷的分区之前的隐藏扇区数 NumberOfSectors32 DD ? ; 该字段包含该卷上的所有扇区数目,对于FAT32,该字段 ; 不为0;FAT12/FAT16可根据实际大小是否超过65536个扇 ; 区数决定是否采用该字段;
;==================================================================== ; ; EBPB ( Extended BIOS Parameter Block ) ; ;==================================================================== SectorsPerFAT32 DD ? ; 对于FAT32,该字段包含一个FAT的大小,而SectorsPerFAT16 ; 字段必须为0; ExtFlags DW ? ; 标志 FSVersion DW ? ; 这是文件系统的版本,高字节为主版本,低字节为次版本; RootDirectoryStart DD ? ; 根目录的起始簇号,通常为2; FSInfoSector DW ? ; FSINFO结构在FAT32卷保留区域的扇区号 BackupBootSector DW ? ; 如果该字段不为0,则表示在保留区域保存的启动记录的扇区号 ; 通常为6,不推荐其他值; Reserved1 TIMES 12 DB ? ; 保留字段,格式化程序应将该字段清0 DriveNumber DB ? ; 用于INT 0x13的驱动器号,0x00为软盘,0x80为硬盘 NTReserved DB ? ; 保留字节(用于Windows NT,即NTFS),对于FAT文件 ; 系统,应始终为0 BootSignature DB 29H ; 扩展引导标志(值为0x29) VolumeId DD ? ; 卷的序列号 你复制的文字来自西部网安 VolumeLabel times 11 DB ? ; 卷标号,该字段与根目录中的11字节卷标相同 ; NASM目前尚不支持DUP语法 FileSystemType DB ’FAT32 ’ ; 文件系统类型
;==================================================================== ; ; 真正的启动代码从这开始( 偏移:0x3E ) ; 其功能是搜索磁盘的根目录,查找FDOSLDR.BIN文件,将其读入内存并运行。 ; ;==================================================================== _BOOT_CODE:
; 初始化相关寄存器及标志位 CLI ; 先关掉中断 CLD ; 方向为向前递增 XOR AX,AX ; AX = 0 MOV DS,AX ; 设置数据段寄存器 DS:SI MOV ES,AX ; 设置附加段寄存器 ES:DI westsafe.net MOV SS,AX ; 设置堆栈段寄存器 MOV BP,7C00H ; 设置基址寄存器 MOV SP,STACK_ADDR ; 设置堆栈栈顶 STI ; 允许中断
;==================================================================== ; 保存启动的磁盘编号 ;==================================================================== MOV [DriveNumber],DL; 该值由BIOS设置,如果是从USB启动,该值为0x80 ; 即为第一个硬盘的编号,该值将用于后续的磁盘 ; 读取调用
;==================================================================== ; 准备FAT32文件系统常用的常数,以便后面的操作 ;==================================================================== ; ; [隐藏扇区][保留扇区][FAT][DATA] ; ;====================================================================
;==================================================================== ; 检查是否支持磁盘中断INT 13H的扩展 ;==================================================================== MOV BYTE [BP - DISK_EXT_SUPPORT],00H ; 00H表示不支持磁盘扩展 MOV DL,[DriveNumber] MOV AH,41H MOV BX,055AAH INT 13H JC _NO_DISK_EXTENSION ; 如果失败,进位标志为1或者BX值不对( AA55 or 55AA )
; 设置磁盘支持扩展中断标志
共5页: 上一页 [1] 2 [3] [4] [5] 下一页
|
评论列表
用户名: (新注册) 密码: 匿名评论