操作系统学习03_day

; haribote-ipl
; TAB=4
; 03_days\harib00g  ipl10.nas
;读取10个柱面
CYLS EQU  10    ;读取10个柱面

  ORG  0x7c00   


  ;以下的标记用于标准的FAT12格式软盘专用的代码
  JMP  entry
  DB  0x90
  DB  "HARIBOTE"  ; 启动区的名称
  DW  512    ;扇区(sector)大小512字节
  DB  1    ;簇的大小(必须为1扇区)
  DW  1    ;FAT的起始位置(一般从第一扇区开始)
  DB  2    ;FAT的个数(必须为2)
  DW  224    ;根目录的大小(一般设置成224项)
  DW  2880   ;该磁盘的大小必须是2880扇区
  DB  0xf0   ;磁盘的种类
  DW  9    ;FAT的长度(必须是9扇区)
  DW  18    ;1磁道扇区数 固定是18
  DW  2    ;磁头数(必须是2)
  DD  0    ;不使用分区,必须是0
  DD  2880   ;重复一次磁盘大小
  DB  0,0,0x29  ;意义不明 固定
  DD  0xffffffff  ;卷标号码
  DB  "HARIBOTEOS " ;磁盘的名称(11字节)
  DB  "FAT12   "  ;磁盘格式名称(8字节)
  RESB 18    ;先空出18字节


entry:
  MOV  AX,0   ;初始化寄存器
  MOV  SS,AX
  MOV  SP,0x7c00
  MOV  DS,AX


  MOV  AX,0x0820       ;启动区以后地址0x7e00--0x9fbff
  MOV  ES,AX   ;ES:BX  缓冲区段寻址
  MOV  CH,0         ;柱面0  
  MOV  DH,0   ;磁头0
  MOV  CL,2   ;扇区2
readloop:
  MOV  SI,0   ;记录失败次数的寄存器
retry:       
  MOV  AH,0x02   ;AH=0x02 : 读盘
  MOV  AL,1   ;一个扇区
  MOV  BX,0   ;
  MOV  DL,0x00   ;A驱动器
  INT  0x13   ;调用磁盘BIOS
  JNC  next   ;标志寄存器 如果进位标志为0
  ADD  SI,1   ;si加1
  CMP  SI,5   ;si
  JAE  error   ;si>=5时,跳转
  MOV  AH,0x00
  MOV  DL,0x00   ;A驱动器
  INT  0x13   ;
  JMP  retry
next:
  MOV  AX,ES   ;读取下一扇区
  ADD  AX,0x0020
  MOV  ES,AX   
  ADD  CL,1   
  CMP  CL,18   ;读18个扇区  
  JBE  readloop  
  MOV  CL,1
  ADD  DH,1
  CMP  DH,2
  JB  readloop  
  MOV  DH,0
  ADD  CH,1
  CMP  CH,CYLS
  JB  readloop  

  MOV  [0x0ff0],CH  ;将CYLS的值写到0xff0中  柱面
  JMP  0xc200   ;跳转到10个扇区后的程序中

error:
  MOV  SI,msg   ;显示错误信息
putloop:
  MOV  AL,[SI]   ;[si]内存地址
  ADD  SI,1   
  CMP  AL,0
  JE  fin
  MOV  AH,0x0e   
  MOV  BX,15   
  INT  0x10   ;调用显示 
  JMP  putloop
fin:
  HLT               ;让CPU停止;等待指令   
  JMP  fin    
msg:
  DB  0x0a, 0x0a  ;换行2次
  DB  "load error"
  DB  0x0a   ;换行
  DB  0

  RESB 0x7dfe-$  

  DB  0x55, 0xaa  ;启动区标志

------------------------

; haribote-os boot asm
; TAB=4

;asmhead.nas

BOTPAK EQU  0x00280000  ;
DSKCAC EQU  0x00100000  ;
DSKCAC0 EQU  0x00008000  ;

;有关BOOT_INFO
CYLS EQU  0x0ff0   ; 设定启动区
LEDS EQU  0x0ff1
VMODE EQU  0x0ff2   ; 关于颜色数目的信息.颜色的位数.
SCRNX EQU  0x0ff4   ; 分辨率的X(screen x)
SCRNY EQU  0x0ff6   ;
VRAM EQU  0x0ff8   ; 图像缓冲区的开始地址

  ORG  0xc200   ; 程序被加载到内存的地址

  MOV  AL,0x13   ;
  MOV  AH,0x00
  INT  0x10   ;调用显卡BIOS
  MOV  BYTE [VMODE],8 ; 记录画面模式
  MOV  WORD [SCRNX],320
  MOV  WORD [SCRNY],200
  MOV  DWORD [VRAM],0x000a0000

;

  MOV  AH,0x02
  INT  0x16    ; keyboard BIOS
  MOV  [LEDS],AL

;


  MOV  AL,0xff
  OUT  0x21,AL
  NOP      ;
  OUT  0xa1,AL

  CLI      ;

;

  CALL waitkbdout
  MOV  AL,0xd1
  OUT  0x64,AL
  CALL waitkbdout
  MOV  AL,0xdf   ; enable A20
  OUT  0x60,AL
  CALL waitkbdout

;

[INSTRSET "i486p"]    ;

  LGDT [GDTR0]   ;
  MOV  EAX,CR0
  AND  EAX,0x7fffffff ; bit31
  OR  EAX,0x00000001 ; bit0
  MOV  CR0,EAX
  JMP  pipelineflush
pipelineflush:
  MOV  AX,1*8   ;
  MOV  DS,AX
  MOV  ES,AX
  MOV  FS,AX
  MOV  GS,AX
  MOV  SS,AX

; bootpack

  MOV  ESI,bootpack ;
  MOV  EDI,BOTPAK  ;
  MOV  ECX,512*1024/4
  CALL memcpy

  MOV  ESI,0x7c00  ;
  MOV  EDI,DSKCAC  ;
  MOV  ECX,512/4
  CALL memcpy

  MOV  ESI,DSKCAC0+512 ;
  MOV  EDI,DSKCAC+512 ;
  MOV  ECX,0
  MOV  CL,BYTE [CYLS]
  IMUL ECX,512*18*2/4 ;
  SUB  ECX,512/4  ;
  CALL memcpy

  MOV  EBX,BOTPAK
  MOV  ECX,[EBX+16]
  ADD  ECX,3   ; ECX += 3;
  SHR  ECX,2   ; ECX /= 4;
  JZ  skip   ;
  MOV  ESI,[EBX+20] ;
  ADD  ESI,EBX
  MOV  EDI,[EBX+12] ;
  CALL memcpy
skip:
  MOV  ESP,[EBX+12] ;
  JMP  DWORD 2*8:0x0000001b

waitkbdout:
  IN   AL,0x64
  AND   AL,0x02
  JNZ  waitkbdout  ;
  RET

memcpy:
  MOV  EAX,[ESI]
  ADD  ESI,4
  MOV  [EDI],EAX
  ADD  EDI,4
  SUB  ECX,1
  JNZ  memcpy   ;
  RET


  ALIGNB 16
GDT0:
  RESB 8    ;
  DW  0xffff,0x0000,0x9200,0x00cf ;
  DW  0xffff,0x0000,0x9a28,0x0047 ;

  DW  0
GDTR0:
  DW  8*3-1
  DD  GDT0

  ALIGNB 16
bootpack:

----

; naskfunc
; TAB=4

[FORMAT "WCOFF"]    ; 制作目标文件的模式
[BITS 32]      ; 制作32位模式用的机械语言

;制作目标文件的信息
[FILE "naskfunc.nas"]   ; 源文件名信息

  GLOBAL _io_hlt   ; 程序中包涵的函数名

;以下是实际的函数
[SECTION .text]  ; 目标文件中写了这些之后再写程序

_io_hlt: ; void io_hlt(void);
  HLT
  RET


 

原文地址:https://www.cnblogs.com/voidobject/p/3975497.html