热门关键字:  2007  下载  web  Windows XP  Windows+XP
当前位置 :| 首页 >>网安文摘 >>技术文摘 >>Dos >>

FAT32 引导扇区代码

来源:西部网安 作者: 时间:2007-07-25 点击:
  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
共5页: 上一页 1 [2] [3] [4] [5] 下一页
上一篇:用 chkdsk 下查看存储空间分配情况   下一篇:政府网站频被“黑” 江西南昌政府网站遭黑客敲诈