• 操作系统学习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


     

  • 相关阅读:
    固定表头/锁定前几列的代码参考[JS篇]
    盘点mysql中容易被我们误会的地方
    cookie&session的Q&A故事[原理篇]
    网络第一道防线:验证码的故事[安全篇]
    2016,把一年的牛皮先吹了吧[生涯规划篇]
    微软职位内部推荐-Software Engineer II
    微软职位内部推荐-Senior Software Engineer
    微软职位内部推荐-Senior Software Engineer
    微软职位内部推荐-SW Engineer II for Cloud Servi
    微软职位内部推荐-SW Engineer II for Cloud Servi
  • 原文地址:https://www.cnblogs.com/voidobject/p/3975497.html
Copyright © 2020-2023  润新知