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

📄 boot.asm

📁 纯C论坛·电子杂志·2004.10期.SP1(总第1期)SP1
💻 ASM
字号:
;文件名: boot.asm
;作  者; 谢煜波
;Emailv: xieyubo@126.com
;
;内存分配如下
;内存起始地址为 0x90000
;最大结束地址为 0x9ffff
;最大共 64KB       
;所有启动代码在一个段内,方便调用
;启动代码共分两部分,一是boot,一是setup,这点照搬linux 0.11的设计
;但与其不同的是,boot不会将自己搬到0x90000处,而直接跳到 0x90100处运行
;0x90000~0x900ff (256B) 系统保留来存放一些从BIOS中取出的关键数据
;0x90100~0x904ff (1KB):此处开始存放setup,setup大小为1KB

[BITS 16]                                                  ;编译成16位的指令
[ORG 0x7C00]
;----------------------------------------------------------------------------------------------
jmp	Main
;----------------------------------------------------------------------------------------------
;数据定义
MSG                db             "Loading pyos ..."  ;输出信息
                   db             13 , 10 , 0         ;13表示回车,10表示换行,
                                                      ;0表示字符串结束
BOOTSEG            equ            0x0000              ;boot所在的段基址    
SETUPSEG           equ            0x9000              ;setup所在的段基址
SETUPOFFSET        equ            0x0100              ;setup所在的偏移量
SETUPSIZE          equ            1024                ;setup的大小,必须是512的倍数
BOOTDRIVER         db             0                   ;保存启动的驱动器号
;----------------------------------------------------------------------------------------------
ShowMessage:  
  ;以下程序行为显示输出信息
  mov              ah , 0x0e                          ;设置显示模式
  mov              bh , 0x00                          ;设置页码
  mov              bl , 0x07                          ;设置字体属性
  
  .nextchar:
  lodsb
  or               al , al
  jz               .return
  int              0x10
  jmp              .nextchar
  
  .return:  
  ret
;-----------------------------------------------------------------------------------------------  
Main:    
  mov              [BOOTDRIVER] , dl                  ;得到启动的驱动器号

  ;以下程序设置数据段
  mov              ax , BOOTSEG
  mov              ds , ax
  mov              si , MSG  
  
  call             ShowMessage                        ;显示信息
  
  ;读入setup
  ;从磁盘的第二个扇区读到0x90100处
  .readfloopy:
  mov              ax , SETUPSEG            
  mov              es , ax
  mov              bx , SETUPOFFSET
  mov              ah , 2
  mov              dl , [BOOTDRIVER]
  mov              ch , 0
  mov              cl , 2
  mov              al , SETUPSIZE / 512               ;读入扇区数( 2个共1KB )
  int              0x13
  jc               .readfloopy
  
  ;把启动驱动器号保存在0x90000处
  mov               al , [BOOTDRIVER]
  mov               [0] , al
  
  ;跳转
  jmp               SETUPSEG : SETUPOFFSET
;---------------------------------------------------------------------------
times 510-($-$$) db 0
db 0x55
db 0xAA

⌨️ 快捷键说明

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