代码

org  0x7c00;entry:mov  ax, 0mov  ss, axmov  ds, axmov  es, axmov  si, msgputloop:mov  al, [si]add  si, 1cmp  al, 0je   finmov  ah, 0x0emov  bx, 15int  0x10jmp  putloopfin:HLTjmp  finmsg:DB    0x0a,  0x0adb    "hello, world"db    0x0adb    0

运行结果:

分析
这个汇编代码主要是在屏幕上输出“hello world”。接着上一节说,当BIOS发现引导扇区时,会将这512字节的内容装载到内存的0000:7c00处(也就是汇编代码第一行写的那样),然后跳转到7c00处将控制权彻底交给这段代码。到此,计算机不再由BIOS中的程序来控制,而是由操作系统的一部分来控制。
看接下来的代码,给要用的寄存器ax赋值0,让ss、ds、es指向相同的段,以便在以后进行数据操作的时候能定位到正确的位置。si指向的是msg内容的起始地址,该内容就是字符串,putloop就是使用跳转指令实现循环,调用int 0x10打印字符在屏幕上。fin相当于进入死循环。
通过这样就代替了上一节用数组来存储一大堆数据,这里更改java代码,将这段汇编语言文件加载到二进制文件中。


public class OperatingSystem {/* private int[] imgContent = new int[]{0xeb,0x4e,0x90,0x48,0x45,0x4c,0x4c,0x4f,0x49,0x50,0x4c,0x00,0x02,0x01,0x01,0x00,0x02,0xe0,0x00,0x40,0x0b,0xf0,0x09,0x00,0x12,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x0b,0x00,0x00,0x00,0x00,0x29,0xff,0xff,0xff,0xff,0x48,0x45,0x4c,0x4c,0x4f,0x2d,0x4f,0x53,0x20,0x20,0x20,0x46,0x41,0x54,0x31,0x32,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7c,0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8a,0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09,0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xeb,0xee,0xf4,0xeb,0xfd};
*/private ArrayList<Integer> imgByteToWrite = new ArrayList<Integer>();private void readKernelFromFile(String fileName) {File file = new File(fileName);InputStream in = null;try {in = new FileInputStream(file);int tempbyte;while ((tempbyte = in.read()) != -1) {imgByteToWrite.add(tempbyte);}} catch(IOException e) {e.printStackTrace();return;}imgByteToWrite.add(0x55);imgByteToWrite.add(0xaa);imgByteToWrite.add(0xf0);imgByteToWrite.add(0xff);imgByteToWrite.add(0xff);}public OperatingSystem(String s) {/*  for (int i = 0; i < imgContent.length; i++) {imgByteToWrite.add(imgContent[i]);}imgByteToWrite.add(0x0a);imgByteToWrite.add(0x0a);for (int j = 0; j < s.length(); j++) {imgByteToWrite.add((int)s.charAt(j));}imgByteToWrite.add(0x0a);int len = 0x1fe;int curSize = imgByteToWrite.size();for (int k = 0; k < len - curSize; k++) {imgByteToWrite.add(0);}//0x1fe-0x1f: 0x55, 0xaa//0x200-0x203: f0 ff  ffimgByteToWrite.add(0x55);imgByteToWrite.add(0xaa);imgByteToWrite.add(0xf0);imgByteToWrite.add(0xff);imgByteToWrite.add(0xff);*/readKernelFromFile("boot.bat");int len = 0x168000;int curSize = imgByteToWrite.size();for (int l = 0; l < len - curSize; l++) {imgByteToWrite.add(0);}}public void makeFllopy()   {try {DataOutputStream out = new DataOutputStream(new FileOutputStream("system.img"));for (int i = 0; i < imgByteToWrite.size(); i++) {out.writeByte(imgByteToWrite.get(i).byteValue());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {OperatingSystem op = new OperatingSystem("hello, this is my first line of my operating system code");op.makeFllopy();}
}

首先将汇编语言通过nasm软件将刚才的汇编语言文件编译成boot.bat文件,java将此文件读入。

写一个操作系统(1)相关推荐

  1. 写一个操作系统有多难?自制 os 极简教程

    不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了满足程序员们自带的成就感,还是为 ...

  2. 我是如何学习写一个操作系统(完结):总结和系列索引

    前言 从一开始的引导程序到现在的文件系统已经有十篇了,算是自己对操作系统的学习的一个笔记,原本是想结合自己之前写的玩具操作系统FragileOS,但是之后就转到了结合Linux 0.11的代码去写这个 ...

  3. 自己动手写一个操作系统——MBR(1)

    文章目录 前言 MBR 1) 512 字节镜像 2) 0x55 和 0xAA qemu 运行 参考 前言 上篇<自己动手写一个操作系统--我们能做什么,我们需要做什么>我们介绍到 BIOS ...

  4. 自己动手写一个操作系统——MBR(2)

    前言 上篇文章<自己动手写一个操作系统--MBR(1)>,我们使用 dd 生成了一个 512 字节的镜像,并用 vim 将其最后两个字节修改成了 55 AA,以此来完成了 MBR 的构建. ...

  5. [从 0 开始写一个操作系统] 一、准备知识

    从 0 开始写一个操作系统 作者:解琛 时间:2020 年 8 月 29 日 从 0 开始写一个操作系统 一.准备知识 1.1 实现方案 1.2 gcc 1.2.1 AT&T 汇编基本语法 1 ...

  6. 从0写一个操作系统 | 01-环境搭建

    前言 前不久朋友推荐了一本书,叫做<操作系统真象还原>,看了一部分后觉得还蛮有趣的,想试着着手写一个操作系统,一边学习一边写. 本专栏会慢慢更新实现的过程,由于本人只能在工作之余钻研这本书 ...

  7. (1)从1开始写一个操作系统

    第一章 前言 偶然间使用到了RTX51-tiny做一些东西,它是keil自带的51操作系统,以小巧占用资源少著称,这里不细谈它是如何实现的,反正是一个真正的基于时间片的多任务系统. 往往我们在使用单片 ...

  8. 从0开始写一个操作系统

    前文 之前很早就写过关于这方面的文章,但过于简陋,于是趁着有点时间再次整理了下,并以代码的角度进行讲解一下.[由于水平有限,如有错误请批评指正] 正文 0 本文写的一个简单OS所实现的目标 系统内核对 ...

  9. 我是如何学习写一个操作系统(九):文件系统

    前言 这个应该是这个系列的尾声了,一个完整的操作系统可能最主要的也就是分成这几大模块:进程管理.内存管理和文件系统.计算机以进程为基本单位进行资源的调度和分配:而与用户的交互,基本单位则是文件 生磁盘 ...

  10. 我是如何学习写一个操作系统(八):内存管理和段页机制

    前言 多进程和内存管理是紧密相连的两个模块,因为运行进程也就是从内存中取指执行,创建进程首先要将程序和数据装入内存.将用户原程序变成可在内存中执行的程序,而这就涉及到了内存管理. 内存的装入 绝对装入 ...

最新文章

  1. 设计输出实数的格式,实数用%6.2f格式输出
  2. 机器学习揭示了人类大脑的新见解
  3. 一步一图,带你走进 Netty 的世界!
  4. curPos和tgtPos
  5. python 3d重建_三维人脸重建(一)——Python读取obj文件
  6. 从CDN到云计算,网宿科技定制化打造“双龙头”格局
  7. TP5实践小总结(1)
  8. Typora Beta版过期解决
  9. 浅析经典JVM垃圾收集器-Serial/ParNew/Parallel Scavenge/Serial Old/Parallel Old/CMS/G1
  10. 专访李华明:90后IT程序员的奋斗之路
  11. 假如某人年薪100万,如何分配月发和年终奖会使其纳税金额最少
  12. 转载:使用pythonr脚本实现微信公众号音频批量下载
  13. Youtube 视频下载
  14. hach vue 跳转_Vue路由实现、路由导航、路由模式
  15. vue 路由跳转打开新窗口(被浏览器拦截)
  16. 【IoT】 产品设计之结构设计:材料工艺选择及特点(PP、PVC、PE、PS、ABS、PC)
  17. 《画解数据结构》九张动图,画解队列
  18. 夏普电视显示网络无法连接到服务器,彻底解决SQL SERVER 2005无法远程连接的问题...
  19. BYOD与企业移动性的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 虚拟机问题:无法将网络更改为桥接状态:没有未桥接的主机网络适配器

热门文章

  1. python酒店数据分析_Python数据分析 I 全国旅游景点分析案例,哪里好玩一目了然...
  2. vue之sourcemap
  3. 全员远程办公,市值达 149 亿美元:GitHub 的最大竞争对手上市了!
  4. NR PDCP(一) overview
  5. sqlzoo刷题(部分题目含解题思路)
  6. 苹果税遭重击!法院判决:App Store必须90天内开放第三方支付,苹果市值一夜蒸发5477亿...
  7. (专升本)Excel(相对引用和绝对引用)
  8. linux+jira无法进入网页,修复 Jira 无法访问
  9. python入门第三天(持续)
  10. 批量关闭公众号推送_微信喊你「批量屏蔽公众号」啦!还有其他新功能!!