今天要开始继续BIOS编程的记录总结了。原因在于想理解BIOS中的原理和内部情况。
BIOS中断服务例程都是16位处在实模式下运行的,在而实模式具有以下几个特征:
1.只能寻址1MB。而实际能用的可能只有640KB还不到。
2.一次任务中只能运行一个程序(单任务)
3.偏移是16位的
在MS-DOS 1MB的内存空间即00000h~0FFFFFh。
1. 从0~3FFh这1024个字节是存放中断向量表,一共有256个条中断,每个中断向量占4个字节,存放一个中断服务程序的入口地址。而从00400h以上的内存逐步是BIOS(00400h~004FFh)和DOS数据区,软件BIOS,DOS内核及设备驱动(即操作系统),在上面就是命令行处理器的驻留部分以及应用程序可用的程序驻留区域直到9FFFFh,所谓640KB限制也就是从这00000h~9FFFFh。
2. 在往上是0A0000h~0B7FFFh,这部分是图形视频。0B8000h~0BFFFFh这段是文本和图形视频区(屏幕上看到的就是这段)。这两段合起来也就是从0A0000h~0B8FFFh这128KB的内存是VRAM就是显存
3. 从0C0000h开始到0EFFFFh这段是保留区
4. 最后从0F0000h到0FFFFh这段就是只读存储器中(ROM)的BIOS的位置啦。这也是我十分想要深入学习的区域。也是计算机操作系统的一个重要区域,其中包含系统诊断和配置软件以及应用程序使用的底层输入输出过程
最后做一个总结,MS-DOS的1MB内存空间中(00000h~0FFFFFh), 0~3FFh是中断向量表,400h~4FF是BIOS数据区,在上面是DOS数据区,软件BIOS,DOS内核及驱动程序,命令行处理器的驻留部分,应用程序驻留部分。到这里为止即0h ~ 9FFFFh这一共是640KB,也就是实际上可用部分,在上面是显存即从0A0000h~0B7FFFh这段是图形空间,0B8000h~0BFFFFh是屏幕上的内容,0C0000h~0EFFFFh是保留区,最后就是ROM BIOS即0F0000h~0FFFFFh。
常用设备有:
CON:控制台
LPT1 或者PRN:第一个并口打印机
LPT2,LPT3:并口2和并口3
COM1,COM2:串口1,串口2
NUL:空设备
常用的中断:
INT 10h视频服务: 控制光标位置,显示彩色文本,卷动屏幕和显示图形等过程
INT 16h键盘服务: 读取键盘和检查键盘状态的过程
INT 17h打印服务: 初始化打印和返回打印状态等过程
INT 1Ah时间服务: 获取计算机启动后的时钟滴答数以及刷新该计数器的过程
INT 1Ch用户定时器中断服务: 每秒18.2次空白过程
INT 21h MS-DOS服务: 输入输出,文件处理内存管理等
2号子程序: 在标准输出上显示一个字符并且把光标往前进一个位置;接受参数: ah = 2, dl = char;返回: 无
5号子程序: 在打印机上打印一个字符;接受参数: ah = 5 dl = char;返回: 无(默认在LPT1打印)
6号子程序: 在标准输出上显示一个字符;接受参数: ah = 6 dl = char;返回: 如果ZF = 0那么al包含字符ascii码
9号子程序: 在标准输出显示以$结尾的字符串;接受参数: ah = 9 ds:dx = 字符串物理地址;返回: 无
40h号子程序: 把字节数组写入文件或者设备;接受参数: ah = 40h bx = 文件或者设备句柄 (控制台 = 1) cx = 要写的字符数 ds:dx = 数组地址 ax = 已写字节数
1号子程序: 从标准输入读取一个字符;接受参数: ah = 1;返回: al = 字符ASCII码
6号子程序: 从标准输入读取一个字符且不等待;接受参数: ah = 6 dl = 0FFh;返回: 如果ZF = 0那么al中存放字符ASCII码
0Ah号子程序: 从标准输入读取缓冲字符数组;接受参数: ah = 0Ah ds:dx = 键盘输入结构地址;输入字符对ds:dx进行填充
0Bh号子程序: 获取标准输入缓冲区状态;接受参数: ah = 0Bh;返回: 如果有字符等待则al = 0FFh 否则al = 0h
3Fh号子程序: 从文件或者设备读取字节数组;接受参数: ah = 3Fh bx = 文件/设备句柄(0 = 键盘句柄) cx = 最多读取字符数 ds:dx = 输入缓冲区地址;返回: 实际读取字节数 (从键盘读入,按ENTER终止,自动添加0dh 0ah至末尾)
2Ah号子程序: 获取系统时间;接受参数: ah = 2Ah;返回: cx = 年 dh,dl = 月,日 。al = 星期(星期日为0其他则是1~6)