⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot.asm

📁 操作系统引导代码
💻 ASM
字号:
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
;Boot.asm
;START:2006/4/11
;AUTHOR:Tresss
;SYSTEM:WinXP+nasm
;HomePage: http://tresss.xfsoft.cn(临时域名)
;E-Mail:potianjing@gmail.com
;Character:BootLoader.
;Completed:2006.4.24
;
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑

  bits		16
  org		0x7C00
  jmp short Main
  NOP
;----------------Fat12分区数据区---------------------
  OEM	DB	'TresssOS'
  ByteOfSec DW	0x200
  SecOfClus DB	0x01
  NumOfReci DW	0x0001
  NumOfFats DB	0x02
  NumOfDirs DW	0x00E0		;十进制224
  NumOfSec DW	0x0B40		;2880
  MediaBPB DB	0xF0
  SecOfFats DW	0x0009
  SecOfTrk DW	0x0012		;18
  NumOfHeader DW	0x0002
  NumOfHide DD	0x00000000
  TotalOfSec DD	0x00000000
  NumOfDrv DB	0x00
  Reserved DB	0x00
  SigOfBoot DB	0x29
  IDOfVol DD	0x00000000
  LabOfVol DB	'Tresss 0.01'
  TypeOfFile DB	'Fat12  '
;-------------------分区数据结束--------------------
  Main:
  Xor ax,ax
  Mov ds,ax
  mov si,Msg
  Call ShowMessage
  xor ah,ah
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
;准备读取根目录区数据
;内存的前500H被BIOS占用,所以此处加载到内存500H之后
;计算出线形扇区位置后
;调用ReadSectors来读取数据.
;磁头,磁道,扇区的换算过程由ReadSectors来解决
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
  mov al,[MemStart]
  mov es,ax
  mov al,[SecOfFats]
  mov bl,[NumOfFats]
  mul bl
  add al,[NumOfReci]
  add al,[NumOfHide]		;AL为目录区起始扇区按现标准值,此时应该al=19
  mov [FatFSec],al		;保存Fat之前的扇区总数
  mov cx,ax
  mov al,[NumOfDirs]
  mov bl,[SizeOfDir]
  mul bl			;ax为目录区大小;
  mov [SizeDRoot],ax		;记录目录区大小;
  mov bx,[ByteOfSec]
  div bx			;AL为目录区占用几个扇区;此时应为14
  mov [RootDSec],al		;保存目录区占几个扇区到缓存区
  xor si,si
  call ReadSectors
;------------------读取根目录完成--------------------

;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
;从500H处开始查找要加载的文件FileImport
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
FindFile:
  xor al,al
  cmp [es:si],al		;i处.
  jz notok
  mov cl,11
  push si
  mov di,FileImport
CmpLoop:
  mov ah,[ds:di]
  mov al,[es:si]
  cmp ah,al
  jnz CmpNext			;不相等则比较下一个文件名
  inc si
  inc di
  loop CmpLoop			;比较下一个字符
  pop si
  jmp LoadFile			;找到文件,加载
CmpNext:
  pop si
  xor ah,ah
  mov al,[SizeOfDir]
  add si,ax			;指向下一个目录名.
  mov ax,[SizeDRoot]
  cmp si,ax			;比较是否已经查找到目录的最后
  jb FindFile			;循环比较下一个文件名.
;----------------查找文件结束--------------------------


;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
;错误处理,此处应加入错误提示信息
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
notok:				;错误处理,此处应显示一行信息.
  xor ax,ax
  int 16h
;-------------------错误处理结束----------------------

;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
;加载Fat区数据至内存500H+SizeDRoot处
;SizeDRoot由上面加载目录区时算出并保存.
;es:si指向文件目录信息
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
LoadFile:
;---------------先加载Fat区数据----------------------
  push si
  mov ax,[SizeDRoot]		;已加载目录区,此处跳过
  mov si,ax
  mov al,[SecOfFats]		;FAT占用扇区数
  mov cl,[NumOfReci]		;保留扇区数
  Call ReadSectors
  pop si			;si为内核文件在目录区的偏移
;----------------Fat加载完毕-------------------------
  mov ax,Word [es:si+1ah]
  push ax			;起始簇
  mov ax,[SecOfFats]
  mov bx,[ByteOfSec]
  mul bx			;算出fat区大小
  mov si,ax
  mov ax,[SizeDRoot]
  add si,ax			;内存起始位置
  pop ax
  push si
  push ax
Loading:
  Call ReadCluster		;读取当前簇内容
  mov al,[SecOfClus]
  mov bl,[ByteOfSec]
  mul bl
  add si,ax			;内存缓存区后移一簇大小
  pop ax			;取出簇号
  push si			;保存缓存区位置
  mov si,ax
  shr si,01h
  pushf
  add si,ax
  mov ax,[SizeDRoot]
  add si,ax
  mov ax,[es:si]
  popf
  jc GetHigh
  and ax,0fffh
  jmp iseof
GetHigh:
  mov cl,4
  shr ax,cl
iseof:
  cmp ax,0ff8h
  jae runknl
  pop si
  push ax
  jmp Loading
runknl:
  pop si
  pop si
  mov ax,es
  mov ds,ax
  Call ShowMessage
  jmp notok


ReadCluster:
  sub ax,2h
  mov bl,[FatFSec]
  add al,bl
  mov bl,[RootDSec]
  add al,bl
  mov cl,al			;起始扇区
  xor al,al
  inc al			;要读取的扇区数
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
;ReadSectors
;读取硬盘扇区数据到内存
;入口:al 要读取的扇区数,cl 起始扇区位置
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
ReadSectors:
  pusha
  push ax
  mov ax,cx
  mov bl,[SecOfTrk]
  div bl
  inc ah
  mov cl,ah			;Cl为实际要读取的扇区位置.
  xor ah,ah
  mov bl,[NumOfHeader]
  div bl
  mov ch,al			;磁道数
  mov dh,ah			;磁头号
  xor dl,dl
  pop ax			;要读取的扇区数
  mov bx,si
  mov ah,02
  int 13h

  popa
  ret

;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
;显示字符串
;∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑  
  ShowMessage:
    mov ah,0x0e
    mov bh,0x00
    mov bl,0x0c
  .nextchar:
    lodsb
    or al,al
    jz .brs
    int 0x10
    jmp .nextchar
    .brs
    ret
  
  Msg		db	"Welcome To Tresss Studio......"
  Mturn		db	13,10,2,3,">",0
  MemStart	db	50h				;最前的自由内存区500H
  FileImport	db	"tresss  bin",0
  SizeOfDir	db	32				;目录区,一个目录信息占多大
  FatFSec	db	0				;记录目录区之前有多少扇区
  RootDSec	db	0				;记录目录区占多少扇区
  SizeDRoot	db	0				;记录目录区占多当字节

  
  times 510-($-$$) db 0
  dw 0xaa55

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -