发表于:2010-02-21 15:23:08
楼主
;====================================================================
;
; FlyingDragon MBR (masterBoot Record )
;
; Author : Jack
; History:
; 0.01 - 2005-08-13 19:34 采用传统的CHS磁盘调用
; 0.02 - 2005-08-23 19:44 优先采用扩展磁盘调用
;
; Build : nasm -f bin MBR.ASM -oMBR.BIN
;
;====================================================================================
;
; MBR(masterBoot Record )主引导记录包含两部分的内容,前446字节为启动代码及数据,而
; 从446(0x1BE)开始则是分区表,分区表由四个分区项组成,每个分区项数据为16字节,记录了
; 启动时需要的分区参数。
;
; 在CPU上电之后,若由硬盘启动,则BIOS将硬盘的主引导记录(位于0柱面、0磁道、1扇区)读
; 入7C00处,然后将控制权交给主引导代码。主引导代码的任务包括:
; (1) 扫描分区表,找到一个激活(可引导)分区;
; (2) 找到激活分区的起始扇区;
; (3) 将激活分区的引导扇区装载到内存7C00处;
; (4) 将控制权交给引导扇区代码;
;
; 如果主引导代码无法完成上述任务,它将显示以下错误信息之一:
; No active partition.
; Invalid partition table.
; Error loading operating system.
; Missing operating system.
;
;====================================================================================
; FAT16分区尺寸与LBA
;====================================================================================
; LBA HeadsPerCylinder SectorsPerTrack Maximum Size for Boot Partition
; Disabled 64 32 1GB
; Enabled 255 63 4GB
;
; 为了适应超过8G的硬盘,Windows2000忽略了Start CHS和End CHS,而使用StartLBA和TotalSector
; 来确定分区在整个磁盘中的位置和大小。
;
;====================================================================================
; 分区表项结构(16字节)
;====================================================================================
;
; typedef struct _PARTITION_ENTRY
; {
; Uch ar BootIndicator; // 能否启动标志
; Uch ar StartHead; // 该分区起始磁头号
; Uch ar StartSector; // 起始柱面号高2位:6位起始扇区号
; Uch ar StartCylinder; // 起始柱面号低8位
; Uch ar PartitionType; // 分区类型
; Uch ar EndHead; // 该分区终止磁头号
; Uch ar EndSector; // 终止柱面号高2位:6位终止扇区号
; Uch ar EndCylinder; // 终止柱面号低8位
; ULONG StartLBA; // 起始扇区号
; ULONG TotalSector; // 分区尺寸(总扇区数)
; }PARTITION_ENTRY,*PPARTITION_ENTRY;
;
;====================================================================================
; 主引导记录(MBR)结构
;====================================================================================
; typedef struct _MASTER_BOOT_RECORD
; {
; Uch ar BootCode【446】;
; PARTITION_ENTRY Partition【4】;
; USHORT Signature;
; }MASTER_BOOT_RECORD,*PMASTER_BOOT_RECORD;
;
;====================================================================================
BITS 16 ; 生成16位代码而不是32位代码
SECTION .text ; 代码段
ORG 0600H ; 指定程序被装入内存的起始位置
;====================================================================
;
; 宏和常量定义
;
;====================================================================
? EQU 0 ; NASM不支持DW ?这样的语法,可以使用这样的定义
; 模拟,以使代码的可读性更强
ACTIVE_FLAG EQU 80H ; 激活(可引导)分区标志
NOT_ACTIVE_FLAG EQU 00H ; 不激活标志
MBR_MOVE_ADDR EQU 0600H ; MBR先移动自身到该位置然后再运行
BOOT_SIGNATURE EQU 0AA55H ; 启动标志
SEC_SIG_OFF EQU 01FEH ; 启动扇区的标志位置
;====================================================================
; 分区表项结构偏移
;====================================================================
BootIndicator EQU 0 ; 能否启动标志
StartHead EQU 1 ; 该分区起始磁头号
StartSector EQU 2 ; 起始柱面号高2位:6位起始扇区号
StartCylinder EQU 3 ; 起始柱面号低8位
PartitionType EQU 4 ; 分区类型
EndHead EQU 5 ; 该分区终止磁头号
EndSector EQU 6 ; 终止柱面号高2位:6位终止扇区号
EndCylinder EQU 7 ; 终止柱面号低8位
StartLBA EQU 8 ; 起始扇区号
TotalSector EQU 12 ; 分区尺寸(总扇区数)
;===================================================