Windows (开机)读软盘第一个扇区的读法的具体表格

Hello World汇编版

就是将16进制编写的代码使用汇编语言编写出来

; cherry-os
ORG 0x7c00 ;指定程序装载的位置 ;下面用于描述FAT12格式的软盘
JMP entry
DB 0x90
DB "CHRRYIPL" ;启动区的名称可以是任意的字符串,但长度必须是8字节
DW ; 每一个扇区的大小,必须是512字节
DB ;簇的大小(必须为1个扇区)
DW ;FAT的起始位置(一般从第一个扇区开始)
DB ;FAT的个数 必须是2
DW ;根目录的大小 一般是224项
DW ; 该磁盘的大小 必须是2880扇区
DB 0xf0;磁盘的种类 必须是0xf0
DW ;FAT的长度 必须是9扇区
DW ;1个磁道(track) 有几个扇区 必须是18
DW ; 磁头个数 必须是2
DD ; 不使用分区,必须是0
DD ; 重写一次磁盘大小
DB ,,0x29 ;扩展引导标记 固定0x29
DD 0xffffffff ;卷列序号
DB "CHERRY-OS " ;磁盘的名称(11个字节)
DB "FAT12 " ;磁盘的格式名称(8字节)
TIMES DB ; 先空出18字节 这里与原文写法不同 ;程序核心
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 ;调用显卡BIOS
JMP putloop
fin:
HLT ;CPU停止,等待指令
JMP fin ;无限循环
msg:
DB 0x0a , 0x0a ;换行两次
DB "hello, cherryOS"
DB 0x0a
DB TIMES 0x1fe-($-$$) DB ;填写0x00,直到0x001fe DB 0x55, 0xaa

将这个文件保存为cherryOS.asm,使用nasm生成cherryOS.img

nasm cherryOS.asm -o cherryOS.img

使用QEMU运行我们的系统

qemu-system-i386 cherryOS.img

效果图:

代码说明

书中使用的是NASK,我们使用的是NASM,部分语法不同,这里总结一下。

1
2
3
4
5
NASK代码 NASM代码
JMP entry -> JMP SHORT entry
RESB <填充字节数> -> TIMES <填充字节数> DB <填充数据>
RESB 0x7dfe-$ -> TIMES 0x1fe-($-$$) DB 0
ALIGNB 16 -> ALIGN 16, DB 0

下面对一个语句做专门说明

1
TIMES 0x1fe-($-$$) DB 0

这一句其中出现了$与$$这样的符号。
$ 是当前位置
$$ 是段开始位置
$ - $$ 是当前位置在段内的偏移
比如我们前面输入了130个字节,那么$ - $$就是130,使用0x1fe-($ - $$)就可以计算出到达0x1fe还需要多少个字节。
这样就保证了我们循环填充后所停在的位置是0x1fe

上面的代码中出现了FAT12格式,IPL这样的词语。这里简要说明。

FAT12: Windows MS-DOS所采用的软盘格式。后面我们将使用FAT32作为我们系统的格式。
启动区: 软盘的第一个扇区成为启动区。
扇区: 计算机读写软盘的过程中不是一个字节一个字节的读写,而是以512字节为一个单位进行读写的。因此,软盘的512个字节就是一个扇区。扇区就是最小的读写单元。
IPL:initial program loader的缩写。启动程序加载器,启动区只有区区512字节,实在是太小了。所以我们需要一个专门的程序IPL去启动操作系统
bootsrap:鞋带。操作系统的启动就是操作系统的一个自救过程,我们一般将操作系统的启动机制叫做bootstrap。

几个语句:
ORG:这个指令将告诉编译器,在代码开始执行的时候,这些代码将被装载到哪个地址中,比如我们在这里指定的地址是0x7c00。(为什么是0x7c00,IBM的大佬们当年规定的就是这个数字,我也没办法)
JMP:JMP,跳转,转到对应的语句。
MOV:这个不多说了,相当于赋值语句。MOV AX,0 就是将0赋值给AX
HLT:让CPU停止动作的指令,并不是完全的停止,只是让CPU进入等待状态。
INT:BIOS中断指令,这里我们用到INT0x10调用显卡,更多的有关BIOS的中断可以自行百度。

四个代码块:
entry:程序的开始,主要用来初始化寄存器和将msg的地址放入SI
putloop:用于显示一个字符,整个流程就是这个代码段所表示的过程,AH默认0x0e,AL表示字符,BH默认为0,BL表示颜色。具体参考INT0x10中断内容。
fin:让CPU进行等待。这个代码段要在代码中看,我们是这么写的CMP AL,0 JE fin。JE表示 jump if equal。所以这句话的意思是,如果AL==0 那么跳转到fin。也就是说我们msg中的信息显示完成后,就让CPU进入无限等待状态。
msg:用于显示我们的内容

几个寄存器:
虽然这都是基础了,但是还是写一下,省的大家百度了
AX 累加寄存器 BX 基址寄存器 CX计数寄存器 DX数据寄存器
SP 栈指针寄存器 BP 基址指针寄存器 SI 源变址寄存器 DI 目的变址寄存器
ES 附加段寄存器 CS 代码段寄存器 SS 堆栈段寄存器 DS 数据段寄存器
L与H:H表示高位,L表示地位,AL表示AX寄存器低位,AH表示AX寄存器的高位

整体流程:

    • 首先进入entry,entry中完成了对寄存器的初始化,并且将msg的地址放到SI中,此时可以将SI理解成一个在msg数据中滑动的指针。
    • msg内部是我们需要显示的字符串
    • 进入putloop,这个循环用于将msg的字符一个一个打印出来。如果AH = 0时,进入fin。
    • 进入fin,程序变为无限等待状态。

参考:

http://blackblog.tech/2018/07/18/CreateOSDay2/

自制操作系统-使用汇编显示 hello world的更多相关文章

  1. 自制操作系统Antz(13) 显示图片

    显示图片只是在多媒体课上看着bmp格式图片的突发奇想,然后就实现在了我自己的操作系统 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 效果图: 显示图片的原理 在之前显卡操作时 ...

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

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

  3. 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统

    Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...

  4. 《30天自制操作系统》笔记(06)——CPU的32位模式

    <30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...

  5. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

  6. 《30天自制操作系统》笔记(02)——导入C语言

    <30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...

  7. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

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

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

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

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

随机推荐

  1. hdu 5212 反向容斥或者莫比

    http://acm.hdu.edu.cn/showproblem.php?pid=5212 题意:忽略.. 题解:把题目转化为求每个gcd的贡献.(http://www.cnblogs.com/z1 ...

  2. hdu 1875 最小生成树 prime版

    最小生成树prime版 大致的步骤 首先选取一个到集合最近的点 然后标记起在集合内部 然后更新最短距离 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    ...

  3. NHiberante从.net framework转移到.net standard(.net core 2.2)时遇到的坑及填坑

    在.net framework中的创建session代码先贴一个 public class SessionBuilder { private static ISessionFactory _sessi ...

  4. 设计模式(三)——装饰器模式(Decorator Pattern)

    发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装 ...

  5. exp/imp 数据库数据导出/导入

    一.exp数据导出 1.导出全部数据 exp 用户名/密码@服务名 file=文件存储路径/xxx.dmp log=日志存储路径/xxx.log full=y 例: [oracle@dbservice ...

  6. 【2017-09-04】JavaWeb内置对象

    Jsp页面中引入别的页面 include命令 <%@ include file="要引入的页面路径"%> 页面中的form表单提交方式: post: 提交内容不可见, ...

  7. C语言计算两个日期间隔天数

    在网上看到了一个C语言计算日期间隔的方法,咋一看很高深,仔细看更高神,很巧妙. 先直接代码吧 #include <stdio.h> #include <stdlib.h> in ...

  8. xargs 使用详解

    参考转载:https://www.cnblogs.com/f-ck-need-u/p/5925923.html#auto_id_12 xargs 作用:将管道传输过来的stdin进行处理(分割.分批) ...

  9. 由java派生出来的证书错误

    未安装请求对应接口证书时的异常:> javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: ...

  10. KubeEdge v0.2发布,全球首个K8S原生的边缘计算平台开放云端代码

    KubeEdge开源背景 KubeEdge在18年11月24日的上海KubeCon上宣布开源,技术圈曾掀起一阵讨论边缘计算的风潮,从此翻开了边缘计算和云计算联动的新篇章. KubeEdge即Kube+ ...