5-寄存器与BIOS中断

时间:2021-11-20 19:36:17

在计算机系统中,数据存储采用三级存储架构——寄存器,内存和硬盘。寄存器在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的代码为例,介绍下中断调用的用法。

  1.     mov cx,#30  

  2.     mov dx,#0x1004  

  3.     mov bx,#0x000c  

  4.     mov bp,#msg  

  5.     mov ax,#0x1301  

  6.     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的探索之旅