sunshineguest
今天要干什么?
- 继续开发
- 制作启动区
- 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