自制操作系统第三天

sunshineguest

今天要干什么?

  1. 继续开发
  2. 制作启动区
  3. Makefile入门

一:

对原有的helloos.nas进行了再次开发,其中用到了一些新的指令:

1:"MOV AX,0",相当于"AX=0;"这样一个赋值语句。同样,"MOV SS,AX"就相当于"SS=AX;",相当于变量空间赋值语句。

2:再来说说AX和SS是什么。CPU里有一种名为寄存器的储存电路,相当于机器语言中的变量,具体有代表性的寄存器有8个.

AX--accumulator,累加寄存器

CX-counter, 计数寄存器

DX-data, 数据寄存器

BX-base,基址寄存器

SP-stack pointer,基址指针寄存器

BP-base-pointer,基址指针寄存器

SI-source index,源变址寄存器

DI-destination index,目的变址寄存器

这些寄存器全都是16位寄存器,因此可以存储16位的二进制数

在这8个寄存器中,不管使用哪一个,差不多都能进行同样的计算,但如果都用AX来进行各种运算的话,程序就可以写的很简洁。

"ADD CX,0x1234" 编译成81 C1 34 12,是一个四字节的命令

而 "ADD AX,0x1234"编译成05 34 12,是一个3字节的命令

这8个寄存器全部合起来才只有16个字节

另一方面:

AL-累加寄存器低位(accumulator low)

CL-技术寄存器低位(counter low)

DL-数据寄存器低位(data low)

BL-基址寄存器低位(base low)

AH-累加寄存器高位(accumulator high)

CH-技术寄存器高位(counter high)

DH-数据寄存器高位(data high)

BH-基址寄存器高位(base high)

还有一个段寄存器(segment register),都是16位寄存器

ES-附加段寄存器(extra segment)

CS-代码段寄存器(code segment)

SS-栈段寄存器(stack segment)

DS-数据段寄存器(data segment)

FS-(segment part2)

QS-(segment part3)

JMP entry这个指令,其实把他写成JMP 0x7c50也完全没有问题,因为entry就是0x7c50.在汇编语言中,所有标号都仅仅是单纯的数字,每个标号对应的数字,是由汇编语言编译器根据ORG指令计算出来的。

MOV SI,msg会怎么样?Msg的地址是0x7c74,所以这个指令就是把0x7c74带入到SI寄存器中去。

MOV AL,SI.如果这个命令是"MOV AL,SL"的话,不用说大家也都能明白他的意思。加了中括号代表内存。

对于CPU来说,内存实际上是外部存储器,也就是说CPU要通过子i的一部分管脚(引线)向内存发送电信号,告诉内存(严格来说,CPU和内存之间还有称之为芯片(chipset)的控制单元)

BYTE、WORD、DWORD等英文单词都是汇编语言的保留字

MOV BYTE 678,123 #这个指令是要用内存的"678"号地址来保持"123"这个数值。

MOV WORD 678,123 #在这种情况下,内存地址中的678号和旁边的679号都会做出反应,一共是16位。这时123被解释成一个16位的数值,也就是0000 0000 0111 1011,下位的0111 1011保存在678号,上位的0000 0000被保存在679号。

可以用寄存器来指定内存地址的指令:BX、BP、SI、DI等其他的AX、CX、DX、SP不能用来指定内存地址。

MOV有一个规则,元数据和目的数据必须位数相同。也就是说,能向AL里带入的就只有BYTE,这样依赖就可以省略BYTE,即可以写成:

MOV AL,SI #把SI地址的1个字节的内容读入到AL中。

CMP是比较指令。或许有人想,比较指令是干什么的呢?简单来说,他是if语句的一部分

IF(a==3){处理;}即对a和3进行比较,将其翻译成机器语言时,必须先写"CMP a,3"告诉CPU比较的对象,然后再写"如果二者相等,需要做什么"

JE是条件跳转指令中之一。(条件跳转指令,就是根据比较的结果决定跳转或不跳转)。就JE指令而言,如果比较结果相等,则跳转到指定的地址。

CMP AL,0

JE fin

这两条指令,就相当于:

If(AL==0){goto fin;}# 如果AL==0,fin结束

BIOS(basic input output system)(基本输入输出系统(程序))程序:

****电脑里有个名为BIOS的程序,出厂时就组装在电脑主板上的ROM单元里,****电脑厂家在BIOS中预先写入了一些开发人员会用到的一些程序函数,非常方便,甚至包括了电脑的预定画面

INT就是用来调用这些函数的指令,INT的后面是个数字,使用不同的数字可以调用不同的函数。使用0x10即(16)号函数,它的功能是控制显卡。

显示一个字符

AH=0x0e;

AL=character code;

BH = 0;

BL = color code;

返回值:无

注:退格(back space)、CR、LF都会被当作控制字符处理

还有HLT指令:(让CPU进入停止(睡眠)状态),如果没有HLT指令,cpu就会不停的权力去执行JMP指令,这会让CPU的符合达到100%,一个HLT指令,技能节能环保,又能节约电费,还能延长电脑的使用寿命呢

注意:在内存的0xf0000号地址附近,还存放这BIOS程序本身,这里不能随便使用

启动区的内容的装载地址:(规定的)

0x0007c00-----0x00007dff

二:制作启动区

在02------day的hellos4这个文件夹,首先

修改heloos.nas 把文件名改为ipl.nas,然后改造asm.bat 将输出的文件名改为ipl.bin(顺便输出列表文件ipl.lst),

增加一个makeing.bat文件,它是以ipl.bin为基础,制作硬盘影响文件的hellos.img的批处理文件

利用作者开发的磁盘映像管理工具edimg.exe,先读入一个空白的磁盘映像文件,然后再开头写入ipl.bin的内容,最后将结果输出为名为hellos.mg的磁盘映像文件,这样从编译到测试的步骤就变得非常简单了,这个可以跟着教程做一遍,不过下面的方法更便捷实用。

三:Makefile入门

到helloss为止,做出来的程序与最初开发的源程序是完全一样的,在开发过程中,使用一个名为Makefile的东西。

Makefile就像是一个非常聪明的批处理文件。写法很简单。

执行流程:

这是今天最终的代码(手打一遍就能用):

hello.nas文件

MakeFile文件

运行效果:今天直接用VMware虚拟机运行(生成的img文件,进行软盘启动)的

获取文中代码资源看第一天评论。

参考链接:

https://blog.csdn.net/qq_43696276/article/details/125871594?spm=1001.2014.3001.5502

相关推荐
国科安芯1 小时前
低轨卫星姿态与轨道控制系统中高可靠MCU的选型研究——基于AS32S601的抗辐照性能试验数据分析
分布式·科技·单片机·嵌入式硬件·系统架构
智造ERP规划9 小时前
项目型制造成本核算:WBS成本归集、变更冲击量、完工百分比,三个逻辑讲透
数据库·系统架构·软件工程·制造
智造ERP规划10 小时前
项目型制造财务核算全流程:收入什么时候确认、成本怎么归集、开票≠收款,一条链讲透
大数据·系统架构·软件工程·制造
星蓝_starblue1 天前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
画中有画1 天前
RAG 大模型应用系统架构设计
系统架构
微三云 - 廖会灵 (私域系统开发)1 天前
消费返物业费系统架构设计与技术实现:智慧社区消费返利平台全链路方案
系统架构
Sam_Deep_Thinking1 天前
用Java 17从0到1写一个mini版RPC,理解远程调用的本质
java·面试·rpc·程序员·系统架构
Sam_Deep_Thinking1 天前
如何维持缓存的一致性?
java·缓存·面试·程序员·系统架构
youngerwang2 天前
【系统架构案例分析每日深耕 Day 5】解释器/规则引擎架构在风控系统中的应用
系统架构·解释器模式·案例分析·风控系统
BerrySen1782 天前
基于Python的高性能多智能体协同RAG(检索增强生成)系统架构与生产级实现指南
人工智能·python·系统架构