[读书笔记]30 天自制操作系统 day1 从计算机结构到汇编程序入门

1. 前言

我们参考书籍为:
http://download.csdn.net/detail/zhyh1435589631/9689433
http://download.csdn.net/detail/zhyh1435589631/9689424

附带光盘: http://download.csdn.net/detail/zhyh1435589631/9689421

2. 实现

2.1 二进制文件工具编辑

这里我们这里使用的是winHex 18.5 http://download.csdn.net/detail/zhyh1435589631/9689420, 通过照这个工具我们可以非常容易的编辑二进制文件
这里写图片描述
然后配置 install.bat, run.bat 可以得到最终的实现效果
这里写图片描述
很容易理解, 我们实际得到的系统镜像文件一定是二进制形式表述的, 因而可以通过直接编辑二进制文件进行操作

2.2 汇编程序

我们当然也可以采用汇编指令的方式进行执行, 通过编译(nask.exe)下面这段汇编代码, 我们一样可以得到相同的helloos.img
其中, RESB 表示从现在的地址开始空出 xx 个字节空间出来
helloos.nas

    DB  0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
    DB  0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
    DB  0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
    DB  0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
    DB  0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
    DB  0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
    DB  0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
    DB  0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
    RESB    16
    DB  0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
    DB  0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
    DB  0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
    DB  0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
    DB  0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
    DB  0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
    DB  0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    368
    DB  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
    DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    4600
    DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    1469432

2.3 带注释版本

  1. 由于光盘中是日文的, 可以参考书本相关内容, 可以看到汇编语言开头有一段内容用来表明 文件格式 FAT12, 由于软盘大小一般为1440 x 1024 byte = 1474560 byte, 每个扇区一般都是 512 byte, 故而有 2880 个扇区。
  2. 信息段显示末尾(ie, 第一个扇区末尾) 一定是 0x55 0xaa 结尾, 否则会报错
  3. RESB 0x1fe-$ 表示从当前位置到 0x1fe 位置所有数据都填充 数据 0
    1. 这样就不用根据输出的提示字符的不同而每次进行修改这段数据了
  4. 启动区一般被称为是 IPL, 主要用于加载真正的系统启动程序
  5. 根据注释我们可以很容易的修改提示字符:
    这里写图片描述
    这里写图片描述
    这里写图片描述
; hello-os
; TAB=4

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

        DB      0xeb, 0x4e, 0x90
        DB      "HELLOIPL"      ; ブートセクタの名前を自由に書いてよい(8バイト)
        DW      512             ; 1セクタの大きさ(512にしなければいけない)
        DB      1               ; クラスタの大きさ(1セクタにしなければいけない)
        DW      1               ; FATがどこから始まるか(普通は1セクタ目からにする)
        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      "HELLO-OS   "   ; ディスクの名前(11バイト)
        DB      "FAT12   "      ; フォーマットの名前(8バイト)
        RESB    18              ; とりあえず18バイトあけておく

; プログラム本体

        DB      0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
        DB      0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
        DB      0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
        DB      0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
        DB      0xee, 0xf4, 0xeb, 0xfd

; メッセージ部分

        DB      0x0a, 0x0a      ; 改行を2DB      "hello, world"
        DB      0x0a            ; 改行
        DB      0

        RESB    0x1fe-$            ; 0x001feまでを0x00で埋める命令

        DB      0x55, 0xaa

; 以下はブートセクタ以外の部分の記述

        DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    4600
        DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    1469432
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值