Q:FAT32 引导扇区代码
A:;====================================================================
;
; FlyingDragon OS Boot Sector FOR FAT32
;
; Author: Jack
; V0.01 2005-07-23 17:39
; V0.02 2005-08-07 09:29
;
; Build : nasm -f bin FAT32.ASM -oFAT32.BIN
;
;====================================================================================
;
; BIOS在启动中的角色:
; (1) BIOS装载引导驱动器上的0扇区(CHS = 0:0:1)内容到内存线性地址7C00H处;
; (2) BIOS检查所装载的扇区是否有启动标记(510、511字节分别为55H和AAH);
; (3) CPU寄存器DL被设置为分配给引导驱动器的驱动器号,00H为软驱A,80H为硬盘C;
; (4) BIOS跳转到其装载的扇区中的代码(即7C00H处),将控制权转交给引导代码。
;
; 引导代码应该初始化以下寄存器:
; (1) DS:某些BIOS设置其值为0,某些设置其为40H,它应该被设置为(7C00H-BOOT_ORG)/16;
; 其中,BOOT_ORG为引导代码的ORG值,该值通常为7C00H(这意味着DS应设置为0);
; (2) SS和SP(堆栈):这两个寄存器的初始值依赖于BIOS;
; (3) CS个IP(通过JMP指令):大多数的BIOS进入启动代码的地址为0000:7C00H,但是某些
; BIOS却跳转到07C0:0000H。由于短跳转和条件跳转是IP相关的,因此如果没有使用
; 远跳转或者绝对跳转,则不需要重置CS和IP;然而,DS仍旧必须是正确的值。
;
;=====================================================================================
;
; 常规内存( 0000 0000H - 000F FFFFH,即0-1MB )在系统启动时的使用情况
;
;=====================================================================================
;
; ---------------------------------
; | 0000 0000 - 0000 03FF | 1024B IDT read only
; |-------------------------------|
; | 0000 0400 - 0000 04FF | 256B BIOS Data Area , read only
; |-------------------------------|
; | 0000 0500 - 0000 7BFF |* 30464B Free Memory , read/write (29.75KB)
; |------------------------------ |
; | 0000 7C00 - 0000 7DFF | 512B Boot Sector , read/write
; |------------------------------ |
; | 0000 7E00 - 0000 7FFF | 512B Free Memory , read /write
; |------------------------------ |
; | 0000 8000 - 0009 FBFF | 607KB Free Memory , read / write( 32K - 639KB )
; |------------------------------ |
; | 0009 FC00 - 0009 FFFF |** 1KB EBDA extended BIOS data area
; |------------------------------ |
; | 000A 0000 - 000A FFFF | 64KB Video Memory
; |------------------------------ |
; | 000B 0000 - 000B 7FFF | 32KB Mono Video Text Memory
; |------------------------------ |
; | 000B 8000 - 000B FFFF | 32KB Color Video Text Memory
; |------------------------------ |
; | 000C 0000 - 000C 7FFF | 32KB Video BIOS , read only
; |------------------------------ |
; | 000C 8000 - 000E FFFF | 160KB Adapter ROM,read only
; |------------------------------ |
; | 000F 0000 - 000F FFFF | 64KB System BIOS, read only
; |------------------------------ |
; | 0010 0000 - 0010 FFEF |***64KB-16 High Memory Area,read/write ( 1MB开始处 )
; |------------------------------ |
; | 0010 FFF0 - | Free Extended Memory, read/write
; |------------------------------ |
;
; * 空闲内存实际并非从 0000 0500处开始,BIOS数据区实际上会利用从0000 0500开始的少量字节,例如
; 00000500处保存的是打印屏幕状态,当按下打印屏幕(PrintScreen)键时,低级键盘BIOS初始化打印屏
; 幕功能,键盘BIOS触发中断5打印屏幕处理程序。正因为BIOS数据区越过了256B的界限,因此DOS实际
; 上是从0000 0522开始装载的。为保险起见,可从0000 0600开始利用空闲内存。(1.5K - 31K 29.5KB)
;
; ** 有些机器上没有这段BIOS扩展数据区。
;
; *** 如果没有使用扩展高端内存区域程序(例如Emm386.exe),则从0010 0000 (1MB )开始的内存都是可用的。
;
;
;=====================================================================================
;
BITS 16 ; 生成16位代码而不是32位代码
SECTION .TEXT ; 代码段
ORG 7C00H ; 指定程序被装入内存的起始位置
;====================================================================
;
; 宏和常量定义
;
;====================================================================
? EQU 0 ; NASM不支持DW ?这样的语法,可以使用这样的定义
; 模拟,以使代码的可读性更强
DATA_BUF_SEG EQU 0200H ; 用于读取根目录或文件内容的缓冲区(8K) 段地址
DATA_BUF_OFF EQU 2000H
STACK_ADDR EQU 7BD0H ; 堆栈栈顶(注意:堆栈大小约为20K)
OSLOADER_ADDR EQU 8000H ; FDOSLDR.BIN放入内存中的起始位置,这就意味着
; 装载程序及相关资源的尺寸不能超过608K
; 8000H - A000H (32K - 640K )
OSLOADER_SEG EQU 0800H ; 起始段地址
SECOND_SECTOR EQU 03H ; 第二个引导扇区的扇区号(第四个扇区)
SECOND_ADDR EQU 7E00H ; 第二个引导扇区的装载位置
;====================================================================
; 用堆栈保存若干中间变量( SS = 0 BP = 7C00H )
;====================================================================
FAT_START_SECTOR EQU 4 ; FAT表的起始扇区号 DWORD
ROOT_START_SECTOR EQU 8 ; 根目录的起始扇区号 DWORD
DATA_START_SECTOR EQU 12 ; 数据区起始扇区号 DWORD
FAT_ENTRY_SECTORS EQU 14 ; FAT表所占的扇区数 WORD
ROOT_ENTRY_SECTORS EQU 16 ; 根目录所占的扇区数 WORD
DIR_PER_SECTOR EQU 17 ; 每个扇区所容纳的目录 BYTE
DISK_EXT_SUPPORT EQU 18 ; 磁盘是否支持扩展BIOS BYTE
CURRENT_CLUSTER EQU 40 ; 当前正在处理的簇号 DWORD
;====================================================================
; 扩展磁盘服务所使用的地址包
;====================================================================
DAP_SECTOR_HIGH EQU 24 ; 起始扇区号的高32位 ( 每次调用需要重置 ) DWORD
DAP_SECTOR_LOW EQU 28 ; 起始扇区号的低32位 ( 每次调用需要重置 ) DWORD
DAP_BUFFER_SEG EQU 30 ; 缓冲区段地址 ( 每次调用需要重置 ) WORD
DAP_BUFFER_OFF EQU 32 ; 缓冲区偏移 ( 每次调用需要重置 ) WORD
DAP_RESERVED2 EQU 33 ; 保留字节
DAP_READ_SECTORS EQU 34 ; 要处理的扇区数(1 - 127 )
DAP_RESERVED1 EQU 35 ; 保留字节
DAP_PACKET_SIZE EQU 36 ; 包的大小为16字节
;====================================================================
;
; 目录项结构(每个结构为32字节)
;
;====================================================================
OFF_DIR_NAME EQU 0 ; 目录项的偏移 BYTE[11]
OFF_DIR_ATTRIBUTE EQU 11 ; 目录属性 BYTE
OFF_NT_RESERVED EQU 12 ; 保留属性 BYTE
OFF_CREATE_TIME_HUNDREDTH EQU 13 ; 创建时间 BYTE
A:;====================================================================
;
; FlyingDragon OS Boot Sector FOR FAT32
;
; Author: Jack
; V0.01 2005-07-23 17:39
; V0.02 2005-08-07 09:29
;
; Build : nasm -f bin FAT32.ASM -oFAT32.BIN
;
;====================================================================================
;
; BIOS在启动中的角色:
; (1) BIOS装载引导驱动器上的0扇区(CHS = 0:0:1)内容到内存线性地址7C00H处;
; (2) BIOS检查所装载的扇区是否有启动标记(510、511字节分别为55H和AAH);
; (3) CPU寄存器DL被设置为分配给引导驱动器的驱动器号,00H为软驱A,80H为硬盘C;
; (4) BIOS跳转到其装载的扇区中的代码(即7C00H处),将控制权转交给引导代码。
;
; 引导代码应该初始化以下寄存器:
; (1) DS:某些BIOS设置其值为0,某些设置其为40H,它应该被设置为(7C00H-BOOT_ORG)/16;
; 其中,BOOT_ORG为引导代码的ORG值,该值通常为7C00H(这意味着DS应设置为0);
; (2) SS和SP(堆栈):这两个寄存器的初始值依赖于BIOS;
; (3) CS个IP(通过JMP指令):大多数的BIOS进入启动代码的地址为0000:7C00H,但是某些
; BIOS却跳转到07C0:0000H。由于短跳转和条件跳转是IP相关的,因此如果没有使用
; 远跳转或者绝对跳转,则不需要重置CS和IP;然而,DS仍旧必须是正确的值。
;
;=====================================================================================
;
; 常规内存( 0000 0000H - 000F FFFFH,即0-1MB )在系统启动时的使用情况
;
;=====================================================================================
;
; ---------------------------------
; | 0000 0000 - 0000 03FF | 1024B IDT read only
; |-------------------------------|
; | 0000 0400 - 0000 04FF | 256B BIOS Data Area , read only
; |-------------------------------|
; | 0000 0500 - 0000 7BFF |* 30464B Free Memory , read/write (29.75KB)
; |------------------------------ |
; | 0000 7C00 - 0000 7DFF | 512B Boot Sector , read/write
; |------------------------------ |
; | 0000 7E00 - 0000 7FFF | 512B Free Memory , read /write
; |------------------------------ |
; | 0000 8000 - 0009 FBFF | 607KB Free Memory , read / write( 32K - 639KB )
; |------------------------------ |
; | 0009 FC00 - 0009 FFFF |** 1KB EBDA extended BIOS data area
; |------------------------------ |
; | 000A 0000 - 000A FFFF | 64KB Video Memory
; |------------------------------ |
; | 000B 0000 - 000B 7FFF | 32KB Mono Video Text Memory
; |------------------------------ |
; | 000B 8000 - 000B FFFF | 32KB Color Video Text Memory
; |------------------------------ |
; | 000C 0000 - 000C 7FFF | 32KB Video BIOS , read only
; |------------------------------ |
; | 000C 8000 - 000E FFFF | 160KB Adapter ROM,read only
; |------------------------------ |
; | 000F 0000 - 000F FFFF | 64KB System BIOS, read only
; |------------------------------ |
; | 0010 0000 - 0010 FFEF |***64KB-16 High Memory Area,read/write ( 1MB开始处 )
; |------------------------------ |
; | 0010 FFF0 - | Free Extended Memory, read/write
; |------------------------------ |
;
; * 空闲内存实际并非从 0000 0500处开始,BIOS数据区实际上会利用从0000 0500开始的少量字节,例如
; 00000500处保存的是打印屏幕状态,当按下打印屏幕(PrintScreen)键时,低级键盘BIOS初始化打印屏
; 幕功能,键盘BIOS触发中断5打印屏幕处理程序。正因为BIOS数据区越过了256B的界限,因此DOS实际
; 上是从0000 0522开始装载的。为保险起见,可从0000 0600开始利用空闲内存。(1.5K - 31K 29.5KB)
;
; ** 有些机器上没有这段BIOS扩展数据区。
;
; *** 如果没有使用扩展高端内存区域程序(例如Emm386.exe),则从0010 0000 (1MB )开始的内存都是可用的。
;
;
;=====================================================================================
;
BITS 16 ; 生成16位代码而不是32位代码
SECTION .TEXT ; 代码段
ORG 7C00H ; 指定程序被装入内存的起始位置
;====================================================================
;
; 宏和常量定义
;
;====================================================================
? EQU 0 ; NASM不支持DW ?这样的语法,可以使用这样的定义
; 模拟,以使代码的可读性更强
DATA_BUF_SEG EQU 0200H ; 用于读取根目录或文件内容的缓冲区(8K) 段地址
DATA_BUF_OFF EQU 2000H
STACK_ADDR EQU 7BD0H ; 堆栈栈顶(注意:堆栈大小约为20K)
OSLOADER_ADDR EQU 8000H ; FDOSLDR.BIN放入内存中的起始位置,这就意味着
; 装载程序及相关资源的尺寸不能超过608K
; 8000H - A000H (32K - 640K )
OSLOADER_SEG EQU 0800H ; 起始段地址
SECOND_SECTOR EQU 03H ; 第二个引导扇区的扇区号(第四个扇区)
SECOND_ADDR EQU 7E00H ; 第二个引导扇区的装载位置
;====================================================================
; 用堆栈保存若干中间变量( SS = 0 BP = 7C00H )
;====================================================================
FAT_START_SECTOR EQU 4 ; FAT表的起始扇区号 DWORD
ROOT_START_SECTOR EQU 8 ; 根目录的起始扇区号 DWORD
DATA_START_SECTOR EQU 12 ; 数据区起始扇区号 DWORD
FAT_ENTRY_SECTORS EQU 14 ; FAT表所占的扇区数 WORD
ROOT_ENTRY_SECTORS EQU 16 ; 根目录所占的扇区数 WORD
DIR_PER_SECTOR EQU 17 ; 每个扇区所容纳的目录 BYTE
DISK_EXT_SUPPORT EQU 18 ; 磁盘是否支持扩展BIOS BYTE
CURRENT_CLUSTER EQU 40 ; 当前正在处理的簇号 DWORD
;====================================================================
; 扩展磁盘服务所使用的地址包
;====================================================================
DAP_SECTOR_HIGH EQU 24 ; 起始扇区号的高32位 ( 每次调用需要重置 ) DWORD
DAP_SECTOR_LOW EQU 28 ; 起始扇区号的低32位 ( 每次调用需要重置 ) DWORD
DAP_BUFFER_SEG EQU 30 ; 缓冲区段地址 ( 每次调用需要重置 ) WORD
DAP_BUFFER_OFF EQU 32 ; 缓冲区偏移 ( 每次调用需要重置 ) WORD
DAP_RESERVED2 EQU 33 ; 保留字节
DAP_READ_SECTORS EQU 34 ; 要处理的扇区数(1 - 127 )
DAP_RESERVED1 EQU 35 ; 保留字节
DAP_PACKET_SIZE EQU 36 ; 包的大小为16字节
;====================================================================
;
; 目录项结构(每个结构为32字节)
;
;====================================================================
OFF_DIR_NAME EQU 0 ; 目录项的偏移 BYTE[11]
OFF_DIR_ATTRIBUTE EQU 11 ; 目录属性 BYTE
OFF_NT_RESERVED EQU 12 ; 保留属性 BYTE
OFF_CREATE_TIME_HUNDREDTH EQU 13 ; 创建时间 BYTE






