qq:992591601 欢迎交流

2016-03-31作

2016-06-01、2016-06-27改

我总结了些基本原理:

1.软盘的第一个扇区为启动区

2.计算机读软盘是以512字节为单位来读写,所以第一个扇区为512字节

3.一张软盘1440KB,2880个扇区

4.第一扇区为启动区,加载操作系统用

5.启动区结束标志位55AA

一个简单的开机引导程序(这个算是很基本的了):

; hello-os
; TAB=4 ORG 0x7c00 ; bios 将程序加载到0x7c00 + 偏移地址执行 ;以下,FAT12格式引导程序专用代码 JMP entry
DB 0x90
DB "HELLOIPL" ; name
DW ; size of a sector(must be 512byte)
DB ; size of a cluster(must be a sector)
DW ; FAT begin from 1st sector
DB ; FAT num
DW ; size of root directory
DW ; size of disk(2880 sectors)
DB 0xf0 ; type of disk
DW ; length of FAT(must be 9 sectors)
DW ; how many sectors with a track
DW ; head num
DD ; 不使用分区
DD ; size of disk(2880 sectors)
DB ,,0x29
DD 0xffffffff
DB "HELLO-OS "
DB "FAT12 "
RESB ; 先空出18字节 ; the main part of the program entry:
MOV AX,
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,
CMP AL,
JE fin
MOV AH,0x0e
MOV BX,
INT 0x10
JMP putloop
fin:
HLT ; 让CPU停止,等待指令
JMP fin ; 无限循环 msg:
DB 0x0a, 0x0a
DB "hello, world"
DB 0x0a
DB RESB 0x7dfe-$ ; 填写0x00直到0x7dfe,0x7dfe – 0x7c00 = 510 DB 0x55, 0xaa ;bootsector end mark

解析:

org 0x7c00;

告诉nask,在开始执行的时候,将这些机器语言指令装载到内存哪一部分。

org是伪指令,是给编译器来读的,而不是给计算机执行的,

另外,操作系统的引导区域,是被固定分配在0x00007c00 - 0x00007dff

mov si,msg;

msg是标号,本质是一个数字。而标号的计算是依靠之前的org指令。

mov al,[si];

将si所指向地址存储单元中的数据送给al。

虽然我们可以用寄存器来指定内存地址,但可以用作此用途的寄存器只有bx,bx,di,si。

cmp al,0; je fin;

if(al == 0)

{

goto fin;

}

int指令中断显示字符。不多说。

hlt指令,让cpu停止动作。

makefile的用法:

2016.06.01

我加入自己的思想写下这样代码

sonnos.asm

    org 07c00h
CYLS EQU ;以下,FAT12格式引导程序专用代码
JMP entry
DB 0x90
DB "HELLOIPL" ; name
DW ; size of a sector(must be 512byte)
DB ; size of a cluster(must be a sector)
DW ; FAT begin from 1st sector
DB ; FAT num
DW ; size of root directory
DW ; size of disk(2880 sectors)
DB 0xf0 ; type of disk
DW ; length of FAT(must be 9 sectors)
DW ; how many sectors with a track
DW ; head num
DD ; 不使用分区
DD ; size of disk(2880 sectors)
DB ,,0x29
DD 0xffffffff
DB "HELLO-OS "
DB "FAT12 "
RESB ; 先空出18字节 entry:
mov ax,
mov ss,ax
mov sp,0x7c00
mov ds,ax ;read disk mov ax,0x0820
mov es,ax
mov ch, ;柱面0
mov dh, ;磁头0
mov cl, ;扇区2 readloop:
mov si, ;记录失败次数 retry:
mov ah,0x02 ;ah=0x02:读入磁盘
mov al, ;a sector
mov bx,
mov dl,0x00 ;A驱动器
int 0x13 ;调用磁盘bios
jnc next ;没出错跳转next
add si,
cmp si, ;大于则跳转
jae error
mov ah,0x00
mov dl,0x00
int 0x13 ;重置驱动器
jmp retry next:
mov ax,es
add ax,0x0020
mov es,ax
add cl,
cmp cl,
jbe readloop ; if cl <= 18 readloopへ
mov cl,
add dh,
cmp dh,
jb readloop ; if dh < 2 readloopへ
mov dh,
add ch,
cmp ch,CYLS
jb readloop ; if ch < CYLS readloopへ mov ax,cs ; print poem
mov ds,ax
mov es,ax
call PrintStr
;jmp $ ; 读完软盘后从C language开始执行 mov [0x0ff0],ch
jmp 0xc200 error:
mov si,msg PrintStr:
mov ax,BootPoem
mov bp,ax
mov cx,
mov ax,01301h
mov bx,00009h
mov dh,
mov dl,
int 10h
ret msg:
db 0x0a, 0x0a
db "load error"
db 0x0a
db BootPoem:
db "Hold fast to dreams"
db 0x0a
db "For if dreams die"
db 0x0a
db "Life is a broken-winged bird "
db 0x0a
db "That can never fly"
db 0x0a
db "Hold fast to dreams"
db 0x0a
db "For when dreams go"
db 0x0a
db "Life is a barren field"
db 0x0a
db "Frozen only with snow"
db 0x0a times -($-$$) db ; 接下来510字节写0
dw 0xaa55 ; 最后一个字0xaa55是引导程序结束标志

1,实现开机引导后,屏幕蓝色字体打印一首英文诗歌

2,使用nasm编译器,不像书中使用自制的nask

default :
../z_tools/make.exe img sonnos.bin : sonnos.asm Makefile
../z_tools/nasm.exe sonnos.asm -o sonnos.bin helloos.img : sonnos.bin Makefile
../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \
wbinimg src:sonnos.bin len: from: to: imgout:helloos.img asm :
../z_tools/make.exe -r sonnos.bin img :
../z_tools/make.exe -r helloos.img run :
../z_tools/make.exe img
copy helloos.img ..\z_tools\qemu\fdimage0.bin
../z_tools/make.exe -C ../z_tools/qemu install :
../z_tools/make.exe img
../z_tools/imgtol.com w a: helloos.img clean :
-del sonnos.bin src_only :
../z_tools/make.exe clean
-del helloos.img

自制操作系统(二) 让bootsector开机启动打印一首诗的更多相关文章

  1. 自制操作系统 (三) 从启动区执行操作系统并进入C世界

    qq:992591601 欢迎交流 2016.04.03 2016.05.31 2016.06.29 这一章是有些复杂的,我不太懂作者为什么要把这么多内容都放进一天. 1读入了十个柱面 2从启动区执行 ...

  2. systemctl 配置mysql 开机启动

    在centos 7 环境下对服务的管理已经不再用service 命令了,而是改为systemctl 命令来管理服务. 一.创建systemctl 的对mysql服务的配置文件: touch /usr/ ...

  3. Centos 7 Redis 安装并开机启动

    一.下载并编译 cd /usr/local/bin目录可以自己选,我将redis安装到/usr/local/bin目录下.wget http://download.redis.io/releases/ ...

  4. 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...

  5. 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...

  6. 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...

  7. 关于U盘启动操作系统《30天自制操作系统》

    原本的启动是从img启动的,并且这个img是用FAT12文件系统进行格式化的(详细去搜索FAT12文件格式,这里给大家推荐一篇http://www.doc88.com/p-646605198560.h ...

  8. linux开机启动

    开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程.分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机 ...

  9. 30天自制操作系统(三)进入32位模式并导入C语言

    1 制作真正的IPL IPL(Initial Program Loader),启动程序装载器,但是之前并没有实质性的装载任何程序,这次作者要开始装载程序了. 虽然现在开发的操作系统啥功能也没有,作者说 ...

随机推荐

  1. Func的介绍

    经常看到  Func<int, bool>...这样的写法,看到这样的就没有心思看下去了.我们学技术还是需要静下心来. 对Func<int,bool>的Func转到定义看它的解 ...

  2. css属性word-spacing和letter-spacing的区别

    word-spacing和letter-spacing用来定义单词或者字母之间的水平空白间隔.顾名思义,word-spacing定义了单词之间的空白,例如: <div style="w ...

  3. nvidia 各种卡

    cudnn是针对maxwell优化的啊, maxwell下的各种卡都是游戏卡,具体可以见: https://developer.nvidia.com/maxwell-compute-architect ...

  4. POJ 1236-Network of Schools (图论-有向图强联通tarjan)

    题目链接:http://poj.org/problem?id=1236 题目大意:N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题 ...

  5. node.js 基础学习笔记3 -http

    http模块,其中封装了一个高效的HTTP服务器和一个建议的HTTP客户端 http.server是一个基于事件的HTTP服务器 http.request则是一个HTTP客户端工具,用户向服务器发送请 ...

  6. AngularJS学习---REST和自定义服务(REST and Custom Services) ngResource step 11

    1.切换目录 git checkout step- npm start 2.效果图 效果图和step 10的没有什么差别,这里主要的改动都是代码,代码做了很多优化,这里效果图就不再贴出来了. 3.实现 ...

  7. CodeForces 607C (DP) Hard problem

    题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...

  8. 使用 IntraWeb (41) - 数据控件速查

    TIWDBCheckBox 所在单元及继承链: IWDBStdCtrls.TIWDBCheckBox 主要成员: property AutoEditable: Boolean //根据 DataSou ...

  9. 集合与Iterator

    Iterator模式 是遍历集合类的标准访问方法.为的是不暴露类的内部结构,将访问逻辑从集合类中抽象出来. 想循环遍历数组,链表等结构数据,客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦 ...

  10. NOIP2012 题解

    Vigenère 密码 这个名字实在打不来... 题解:模拟 #include <cstdio> #include <cstring> +; bool cj; int cl, ...