在计算机系统中,数据存储采用三级存储架构——寄存器,内存和硬盘。寄存器在CPU的芯片内,其访问速度和CPU的计算速度差不多,但成本比较高,而且CPU的体积也决定了寄存器不可能有较大的容量。在编写focus系统的启动代码部分,因为要使用汇编语言,因此,就需要直接操作寄存器。那么我们就先了解下CPU内部的一些寄存器。
这里andrew感到很抱歉,因为没有办法深入的去介绍细节性的东西了,如果andrew要将focus编写过程中所有的细节都详细的介绍,那么andrew光写文章都要写几个月,这个有点不太现实,所以andrew想了想,遇到一些知识点,如果这些点大家很容易找到的话,andrew就对这些点大致的介绍一下,给大家指一个方向,大家知道该自学一些什么内容,其实andrew介绍的话,也是和别人的资料差不多,相当于复述一下,意义也不大,而且还是消耗很多时间去写这些东西,所以,请朋友们见谅哈。
通用寄存器
AX——累加寄存器
CX——计数寄存器
DX——数据寄存器
BX——基址寄存器
SP——栈指针寄存器
BP——基址指针寄存器
SI——源变址寄存器
DI——目的变址寄存器
CPU中有8个通用寄存器,这8个寄存器都是16位的,这些寄存器既具有一般功能,也具有各自的特殊功能。
其中AX,CX,DX和BX寄存器还可以当作两个8位寄存器使用。
AL——累加寄存器低位
AH——累加寄存器高位
CL——计数寄存器低位
CH——计数寄存器高位
DL——数据寄存器低位
DH——数据寄存器高位
BL——基址寄存器低位
BH——基址寄存器高位
在INTER的CPU中,数据在用小端模式存储,即数据的低位放在低地址,数据的高位放在高地址。以AX寄存器为例,如果AX寄存器中的数据为0x1234,那么AL里存放的是低位0x34,AH里存放的是高位0x12。
段寄存器
ES——附加段寄存器
CS——代码段寄存器
SS——堆栈段寄存器
DS——数据段寄存器
段寄存器用于存放对数据访问时的段基址。
CPU还有状态寄存器,内存管理寄存器和控制寄存器。状态寄存器记录CPU运行过程中的状态和运算结果等,内存管理寄存器用于存储对内存方位需要的数据信息,控制寄存器控制这CPU工作的模式等。这一部分内容可以参考INTER的编程指南,大家可以在http://download.csdn.net/detail/andrew_yau/7429355
下载,andrew上传的,可以免费下载,但好像要申请一个CSDN帐号。后面在编程的时候,也会适当的介绍一些关于寄存器的内容。
在上一次的代码中,使用到了BIOS的0x10号中断,andrew这里和大家介绍一下BIOS中断的使用。BIOS中断为操作系统的启动提供了一些低级的服务,这个和编写应用程序使用的库函数有些像,在C语言中调用printf函数可以打印字符串,操作系统的代码不能够调用库函数,但BIOS能够给我们提供一些相关服务的功能。BIOS的参考资料andrew上传在http://download.csdn.net/detail/andrew_yau/7429337
大家可以*下载。andrew以上一次boot.s的代码为例,介绍下中断调用的用法。
mov cx,#30
mov dx,#0x1004
mov bx,#0x000c
mov bp,#msg
mov ax,#0x1301
int 0x10
AH=13H
BH=页码
BL=属性(若 AL=00H 或 01H)
CX=显示字符串长度
(DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址
AL=显示输出方式
0——字符串中只含显示字符,其显示属性在 BL 中。显示后,光标位置不变
1——字符串中只含显示字符,其显示属性在 BL 中。显示后,光标位置改变
2——字符串中含显示字符和显示属性。显示后,光标位置不变
3——字符串中含显示字符和显示属性。显示后,光标位置改变
出口参数:无
这是BIOS0x10号中断的详细解释。CX寄存器存放要显示寄存器的长度,在代码中设置为30个。DX中存放的是显示坐标,即在屏幕中显示的位置。ES:BP是要显示的字符串的地址,ES在之前已经设为0x07c0,那么BP即存放的是字符串大偏移地址。AH=0x13,即功能号,决定0x10号中断执行是做什么事情,一个中断号可以做很多事情,例如显示字符串,显示一个字符,配置显示器等都有0x10号中断完成,但具体完成什么功能有AH中的功能号决定。AL中为显示的模式。其实BIOS的中断调用使用起来还是很方便的。
跟着昨天的内容,昨天完成了focus的引导扇区代码,这写代码只是显示了两行字符串,除此之外什么都没做。其实512字节的代码确实能做的事情太有限了,那么那么大的操作系统程序,是怎么运行呢?当然是靠引导扇区的程序了。引导扇区的代码量少是因为BIOS只能把一个扇区的内容拷贝到内存,这一部分作为排头兵,在内存中占领了据点之后,再把操作系统剩下的代码搬移到内存,这就是引导扇区代码的主要内容。
搬移程序就要将程序从软驱中读取到内存,这就涉及到如何读软驱的问题了,刚刚讲过的,用BIOS中断哈,BIOS的0x13号中断提供了对磁盘的服务。
AH=0x02;读盘
AH=0x03;写盘
AL=处理对象的扇区数;
CH=柱面号&0xff;
CL=(扇区号&0x3f)|((柱面号&0x300)>>2);
DH=磁头号;
DL=驱动器号;
ES:BX=缓冲区地址
返回值:
CF=0;没有错误
CF=1;有错误,错误码在AH中
今天的代码andrew先将引导扇区代码加入读盘的功能,让其能够加载后续的代码。完整的代码andrew将其放在博客中,因为andrew考虑到,用手机来阅读可能没有电脑上那么舒服,如果介绍的内容很多而且内容太专业,可能大家刚看一会就不会再看了,所以andrew决定以后微信上只介绍些概念性的,以及一些关键点的代码。完整的代码放在博客中,有兴趣的朋友可以在电脑上进行学习。
谢谢。
————————————————————————
QQ:64879927
博客:http://blog.csdn.net/andrew_yau
请关注focus微信公共平台:OS的探索之旅