关于上一节,我测试了发现3e、4c、4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了。 50不会输出HelloWorld,可能需要hex偶数且在0x3e~4f区间吧。上节复制并运行命令如下:

copy /y helloos-Copy.img ..\z_tools\qemu\fdimage0.bin && ..\z_tools\make.exe -C ../z_tools/qemu

先不管上一节了,这节我们写HelloWorld

看不清请右击“从新窗口打开图片”,下为P29 P39两页对照

MOV就是赋值,没什么难的。所以我们用P39来研究,方便一点。

既然C语言是顺序结构,那汇编就更是了(事实上的确是),所以我们先挑后面容易的打印字符部分来看

H、L是寄存器高低位,高位0x0e为当前光标处显示字符功能,低位为字符内容(这里通过把数组每个元素赋值给加法寄存器低位)

这一段是这么执行的(C语言的标签):entry => putloop(循环n次) => fin(无限次循环)

goto 就是跳转到标签所在位置,并从标签开始往下执行。如

int i = ;

try:
printf("%s", "Hello");
i--;
go:
printf("%s", "World");
to:
if (i < )
goto try;

这个会执行try => go => to,再跳转到try,重新try go to这样顺序执行下来。(直到i<0才停止)

再看msg标签部分

按照ASCII码表,这个msg明显就是"\n\nhello, world\n\0"嘛,'\0'是字符串结束符 (NUL),'\0a'是换行符'\n'(LF)

关于HLT,总之就是暂停并等下一次操作。这里是为了节省cpu资源

 该汇编指令是处理器“暂停”指令。“暂停” HaLT,没有操作数[1] 
功能:
使程序停止运行,处理器进入暂停状态,不执行任何操作,不影响标志。
当复位(外语:RESET)线上有复位信号、CPU响应非屏蔽中断、CPU响应可屏蔽中断3种情况之一时,CPU脱离暂停状态,执行HLT的下一条指令。

那个输出字符到屏幕的功能是这样实现的:

这里有一个的INT 0x10是一个叫BIOS中断的东西,参考: BIOS 中断向量表 和 BIOS中断大全

看了一下,从我开始找操作系统相关的资料到现在,基本上有用的全面的资料都能在维基百科里找到...没有科学就绝望了

作者说无法显示字体颜色,应该就是这个原因吧?


研究完了打印部分,我们来看最主要的部分,给寄存器赋值部分

AX = 0

然后注意,SS = AX是把AX的值赋给SS,AX的值是数值0 但并不是地址。所以这一列就只是将AX SS DS ES都初始化为0,

而SP = 0X7C00 和 SI = msg 才是这部分的重点

所以我们得找一下 栈指针和源变址 两个寄存器的作用

这么多寄存器,我们得找一下他们的作用:

寄存器速记(第二个字母)

S segment 段寄存器
X 基于八的extend 16位寄存器
P pointer 指针寄存器

寄存器名(省略寄存器三字):

AX 加法(add)

SS 栈段(Stack segment)

SP 栈指针

DS 数据段

ES 附加段(extra)

我猜:

SP栈指针 指向整个程序/操作系统开始的地方

SI存放msg标签的数据,即"\n\nhello, world\n\0",然后由之后的程序把SI所存的地址值不断+1并不断赋值给AL(这个寄存器存放着需要中断变量/函数INT 10要打印的字节),类似于c语言的data = a[++i],并且判断AL == 0成立时跳出循环,以此实现在屏幕上打印HelloWorld的功能

事实上:

也就是说标签名代表了标签所在地址

大概就是这样了,具体看书里的即可

重要参考资料:

《30天自制操作系统》笔记4 --- (Day2 下节)了解如何用汇编写操作系统中的HelloWorld的更多相关文章

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

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

  2. C++编写操作系统(1):基于 EFI 的 Bootloader

    很久以前就对操作系统很好奇,用了这么多年Windows,对他的运作机理也不是很清楚,所以一直想自己动手写一个,研究一下操作系统究竟是怎么实现的.后来在网上也找到过一些教程(比如:<自己动手写操作 ...

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

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

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

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

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

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

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

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

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

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

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

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

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

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

随机推荐

  1. 基于仿射的非刚体配准方法(i) 法向

    为啥闲呢,因为work干完了. 为啥补档呢,因为有新work了. 呃,因为新work让人自闭. 我现在干完了两部分.一是把最近邻的部分迁移过来. 二是求法向. 首先是给三个点,就能确定平面——因为是三 ...

  2. raspberry pi 4b 常见的一些配置信息

    实验记录地址 https://gitee.com/dhclly/icepi.raspberry-pi 针脚图 面包板 gnd & vcc VCC:电路的供电电压: GND:指板子里面总的地线. ...

  3. VS 中批量格式化、删除未使用的 using 语句代码的插件

    插件名称:Format All Files 插件地址:https://marketplace.visualstudio.com/items?itemName=munyabe.FormatAllFile ...

  4. 使用Charles进行HTTPS抓包及常见问题

    在渗透过程中,需要对每一个参数,每一个接口,每一个业务逻辑构建测试用例,为此,抓包分析是必不可少的一个过程.在PC端,Burpsuite成为了渗透必备的神器,然而,使用Burpsuite有时候抓取不到 ...

  5. 图片服务器FastDFS的安装及使用

    FastDFS介绍 FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS ...

  6. 【09】Nginx:静态压缩 / 日志切割 / 防盗链 /恶意解析/ 跨域

    写在前面的话 上一节我们谈了关于 nginx 服务器的一些简单的安全优化问题,能够帮助我们解决一部分线上服务存在的安全隐患.但是想要提升用户体验这是原因不够的,我们还需要从服务的优化方面入手. 本节更 ...

  7. AJAX发送异步请求教程详解

    AJAX 一.AJAX简介 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可 ...

  8. PIE属性表多字段的文本绘制

    最近研究了PIE SDK文本元素的绘制相关内容,因为在我们的开发中,希望可以做到在打开一个Shp文件后,读取到属性表的所有字段,然后可以选择一些需要的字段,将这些字段的所有要素值的文本,绘制到shp图 ...

  9. Python - 字符串 - 第七天

    Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号( ' 或 " )来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hel ...

  10. eclipse 导出 jar包详细步骤

    如图所示: