码迷,mamicode.com
首页 > 其他好文 > 详细

30天自制操作系统(第三天)

时间:2015-01-06 17:31:29      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

    磁头是一个针状的磁性设备,既可以从软盘的正面接触磁盘,也可以从软盘背面接触磁盘。与光盘不同,软盘磁盘是两面都能记录数据的。 因此我们有正面和反面两个磁头,分别是磁头1号和磁头0号。     指定了柱面和磁头后,在磁盘的这个圆环上,还能记录很多位信息,按照整个圆环位单位读写的话,实在有点多,所以把圆环均等分成几 份,软盘为18份,每一份称为一个扇区。     1张软盘有80个柱面,2个磁头,18个扇区,且一个扇区512字节     MOV CX,[1234]   实质是   MOV CX,[DS:1234]  默认段寄存器是DS,所以DS在使用前必须预先指定为0,否则地址的值要加上这个数的16倍 就会读写到其他的地方,引起混乱。

    保存到磁盘映像里:     使用make install指令,将磁盘映像写入磁盘     在windows里打开那个磁盘,把haribote.sys保存到磁盘上     使用工具将磁盘备份为磁盘映像

    一般向一个空软盘保存文件时:     1.文件名会写在0x002600     2.文件的内容会写在0x004200以后的地方

   在设置画面信息后,还要将画面信息保存在内存里面,

   映像文件,根据我的理解,即是不是本来的东西,只是一种代替形式

    HLT是I/O指令,MOV是转送指令,ADD是演算指令

bootpack.c

/*告诉C编译器,有一个函数在别的文件里面*/
void io_hlt(void);
/*函数申明不用{},而用;,函数在别的函数里*/
void HariMain(void)
{
    fin:
    io_hlt();
    /*这里想写上HLT,但C语言中不用HLT!*/
    goto fin;
}


naskfunc.nas

;naskfunc
;TAB=4

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

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

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

;以下是实际函数

[SECTION .text]     ;目标文件中写了这些之后在写程序
_io_hlt:    ; void io_hlt(void);
        HLT
        RET

 

ipl10.nas

;hello-os
;TAB=4

CYLS    EQU        10
    ORG     0X7C00          ;指明程序的装载地址  

;以下这段是标准FAT12格式软盘专用代码
     JMP     entry
    DB        0x90
    DB        "HARIBOTE"      ;启动扇区的名称可以使任意的字符串
    DW        512                ;每个扇区的大小(必须为512字节)
    DB        1               ;簇的大小(必须为1个扇区)
    DW        1                ;FAT的起始位置(一般从第一个扇区开始)
    DB        2                ;FAT的个数(必须为2)
    DW        224                ;根目录的大小(一般设置为224)
    DW        2880            ;该磁盘的大小(必须是2880扇区)
    DB        0xf0            ;磁盘的种类(必须是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
    MOV     ES,AX
    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            ;没出错的话就跳转到next
    ADD        SI,1          
    CMP     SI,5            
    JAE        error           ;SI>=5跳转到error
    MOV     AH,0x00
    MOV     DL,0x00         ;A驱动器
    INT     0x13            ;重置驱动器
    JMP     retry

next:
    MOV     AX,ES           ;把内存地址后移0x200
    ADD        AX,0x0020
    MOV     ES,AX            ;因为没有ADD ES,0x200指令
    ADD     CL,1             ;往CL里面加1
    CMP     CL,18    
    JBE        readloop         ;如果CL<=18,跳转至readloop
    MOV     CL,1
    ADD     DH,1
    CMP     DH,2
    JB        readloop          ;如果DH<=2,跳转到readloop
    MOV     DH,0
    ADD     CH,1
    CMP        CH,CYLS
    JB        readloop           ;如果CH<CYLS,则跳转到readloop
    MOV        [0x0ff0],CH
    JMP     0xc200
    
error:
    MOV     SI,msg

putloop:
    MOV     AL,[SI]     
    ADD     SI,1          ;给SI加1
    CMP        AL,0
    JE        fin
    MOV        AH,0x0e     ;显示一个文字
    MOV      BX,15       ;指定字符颜色
    INT      0x10        ;调用显卡BIOS
    JMP      putloop

fin:
    HLT                 ;让CPU停止循环,等待指令
    JMP      fin        ;无限循环

msg:
    DB        0X0a,0X0a   ;换行两次
    DB        "load error"
    DB        0x0a
    DB        0
    RESB    0x7dfe-$          ;填写0x00,直到0x001fe
    DB        0x55, 0xaa

 

30天自制操作系统(第三天)

标签:

原文地址:http://www.cnblogs.com/wolf940509/p/4206339.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!