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

Hello World汇编版

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

; cherry-os
ORG 0x7c00 ;指定程序装载的位置;下面用于描述FAT12格式的软盘
JMP entry
DB 0x90
DB "CHRRYIPL" ;启动区的名称可以是任意的字符串,但长度必须是8字节
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个磁道(track) 有几个扇区 必须是18
DW 2; 磁头个数 必须是2
DD 0; 不使用分区,必须是0
DD 2880; 重写一次磁盘大小
DB 0,0,0x29 ;扩展引导标记 固定0x29
DD 0xffffffff ;卷列序号
DB "CHERRY-OS  " ;磁盘的名称(11个字节)
DB "FAT12   " ;磁盘的格式名称(8字节)
TIMES 18 DB 0; 先空出18字节 这里与原文写法不同;程序核心
entry:MOV AX,0  ;初始化寄存器MOV SS,AXMOV SP,0x7c00MOV DS,AXMOV ES,AXMOV SI,msg
putloop:MOV AL,[SI]ADD SI,1CMP AL,0JE finMOV AH,0x0e ;显示一个文字MOV BX,15 ;指定字符的颜色INT 0x10 ;调用显卡BIOSJMP putloop
fin:HLT ;CPU停止,等待指令JMP fin ;无限循环
msg:DB 0x0a , 0x0a ;换行两次DB "hello, cherryOS"DB 0x0aDB 0TIMES 0x1fe-($-$$) DB 0 ;填写0x00,直到0x001feDB 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/

转载于:https://www.cnblogs.com/sea-stream/p/10850361.html

自制操作系统-使用汇编显示 hello world相关推荐

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

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

  2. 写在《30天自制操作系统》上市之前

       这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...

  3. 操作系统源代码_计算机自制操作系统(八):仿生DOS操作系统源代码

    一.真机运行 我们已经完成了仿生DOS操作系统的制作,并在上一章的末尾给大家在虚拟机上做了演示.今天,我们要将该操作系统在真机上启动运行,是不是非常期待自己做出的第一款比较有意义的操作系统? 在&qu ...

  4. 30天自制操作系统——第五天

    第五天 参考<30天自制操作系统>GDT&IDT - 谷月轩 - 博客 梳理一下文件 现在我们拥有这么9个文件: ipl10.nas InitialProgramLoader, 占 ...

  5. 《30天自制操作系统》从入门到放弃

    前言 以下均是废话,大部分来自摘抄,只是记录本人放弃的过程!!!切记是摘抄!!! 相关资料在:https://download.csdn.net/download/wxkhturfun/2253304 ...

  6. 自制操作系统1:先动手操作

    参考如下链接:https://blog.csdn.net/tyler_download/article/details/51729141 做一个最简单操作系统.这个文章又参考了日本人写的一本书< ...

  7. 30天自制操作系统第三天

    操作系统实验日志3 学号 201708010402 姓名 徐冰娜 专业年级班级 实验日期 2019.9.28 实验项目 第3天:进入32位模式并导入C语言 智能1701 30天自制操作系统第三天 操作 ...

  8. 30天自制操作系统——第一天制作一个Hello word操作系统

    入手一本<30天自制操作系统>,内容诙谐有趣,很适合对操作系统一窍不通的新手. 据作者所言,这本书的最终目标是从零开始编写一个五脏俱全的图形操作系统,不用什么基础,而且只需30天!! 没有 ...

  9. 《30天自制操作系统》第9天

    第九天 内存管理 1.整理源文件 这一节只是进行了代码整理,把鼠标键盘相关的内容转移到了特定的文件里. 2.内存容量检查(1) 要做内存管理,首先得知道内存的容量,怎么知道内存的容量呢?BIOS可以告 ...

最新文章

  1. mysql客户端如何创建用户_mysql的创创建用户阶段 开启客户端登录和授权阶段
  2. 数字化转型方法论_双中台:企业数字化转型的核心战略与方法论
  3. 深入理解javascript原型链
  4. linux取消设置环境变量,linux设置环境变量
  5. 南京邮电大学java第三次实验报告
  6. 破解 京东登录滑块验证
  7. 增长黑客手册——01
  8. CEPH HEALTH错误(二):HEALTH_WARN mds cluster is degraded
  9. 如何清除 iPhone 上的其他存储来释放空间
  10. 京东区块链之科普篇:京东在区块链技术领域的应用与布局
  11. 华为路由器:清除配置
  12. sqlite如何创建数据库
  13. sys/types.h,sys/stat.h与fcntl.h的作用
  14. VirtualBox 不能为虚拟电脑 打开一个新任务 VERR_NEM_VM_CREATE_FAILED
  15. springboot实现图片上传和图片删除
  16. 日本大阪强制公务员下班,每天18点半电脑自动关机…这能行?!
  17. 做个寡言,但心有一片海的人
  18. Proxmox VE(PVE)配置xterm.js终端
  19. chm 已取消到该网页的导航 或者 无法显示网页 的问题
  20. 电子电路设计——三路报警电路设计

热门文章

  1. dos远程登录oracle,DOS批处理下 操作telnet实现自动远程登录操作
  2. Python入门--以主程序的方式运行,if __name__==‘__main__‘
  3. hdu 4417 树状数组查询区间不是1到n时需要转换,例[0,5]变成[1,6]
  4. maven项目的pom文件中常用的简单的标签理解
  5. cisco 模拟器安装及交换机的基本配置实验心得_网络工程师的Python之路 -- 自动监测网络配置变化...
  6. 伙伴系统二叉树可视化笔记
  7. 考研数据结构--排序汇总(自用)
  8. Unity3D基础29:消息发送
  9. Codeforces Round #323 (Div. 2): C. GCD Table(思维题)
  10. 八种常用排序算法参考