bios提供了一组服务,可以帮助我们操纵硬件,避免我们直接与硬件细节打交道
当触发软中断时,会自动从中断向量表中取出想用的中断程序的首地址,来执行中断程序,参数通过寄存器传递
一、Bios的INT10中断
-
INT10中断是BIOS用于控制显示屏的关键接口,包括设置显示器模式、光标管理和显示特性等
INT 0x10 是显示类指令:
INT 0x10, AH = 1 -- set up the cursor
INT 0x10, AH = 3 -- 获取光标位置
INT 0x10,AH = 0xE -- 显示字符
INT 0x10, AH = 0xF -- get video page and mode
INT 0x10, AH = 0x11 -- set 8x8 font
INT 0x10, AH = 0x12 -- detect EGA/VGA
INT 0x10, AH = 0x13 -- 显示字符串,具体寄存器设置可以参考:http://www.ctyme.com/intr/rb-0210.htm
INT 0x10, AH = 0x1200 -- Alternate print screen
INT 0x10, AH = 0x1201 -- turn off cursor emulation
INT 0x10, AX = 0x4F00 -- video memory size
INT 0x10, AX = 0x4F01 -- VESA get mode information call
INT 0x10, AX = 0x4F02 -- select VESA video modes
INT 0x10, AX = 0x4F0A -- VESA 2.0 protected mode interface -
在调用 BIOS 函数之前,需要先设置 AH 或 AX(或 EAX) 寄存器,然后执行对应的 INT 指令
-
AH=0xE 的功能是显示字符,同时光标前移(寄存器值的设置:AL=字符,BL=在图形模式下表示文字的颜色,BH=目前的显示页·在图形模式下为0)
二、实操(显示字符)
通过INT10中断的AH中断功能来在qemu显示器上显示字符,从而表明引导程序已经正常运行了(即把磁盘的第一个扇区512字节的内容成功的加载到了内存中的0x7C00处)
接着编译一下,再调试,结果如下:
三、Bios的INT13中断
bios提供了磁盘读取接口,方便我们从磁盘加载loader
-
先通过BIOS把boot程序的代码(也就是磁盘第0扇区的内容)加载到内存中,再通过执行boot程序来加载loader到内存中。
-
目前loader还暂时未编写,接下来先编写boot模块中用来加载loader的代码
-
boot程序的功能是:加载磁盘上的从第1扇区开始到指定扇区结束的内容(也就是存放loader的几个扇区)到内存中的指定的位置
-
INT 13H直接磁盘服务Direct Disk Service
00H —磁盘系统复位
01H —读取磁盘系统状态
02H —读扇区
03H —写扇区
04H —检验扇区
05H —格式化磁道
06H —格式化坏磁道
07H —格式化驱动器
08H —读取驱动器参数
09H —初始化硬盘参数
0AH —读长扇区
0BH —写长扇区
0CH —查寻
0DH —硬盘系统复位
0EH —读扇区缓冲区
0FH —写扇区缓冲区
10H —读取驱动器状态
11H —校准驱动器
12H —控制器RAM诊断
13H —控制器驱动诊断
14H —控制器内部诊断
15H —读取磁盘类型
16H —读取磁盘变化状态
17H —设置磁盘类型
18H —设置格式化媒体类型
19H —磁头保护
1AH —格式化ESDI驱动器
-
02H 功能:读扇区
入口参数:AH=02H
出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明寄存器值的设置:
AL=扇区数
CH=柱面 (填0)
CL=扇区 (填1,表示从第1个扇区开始读取)
DH=磁头 (填0)
DL=驱动器,00H7FH:软盘;80H0FFH:硬盘 (填0x80,表示硬盘)
ES:BX=缓冲区的地址 (段地址+一个偏移的形式)(前面的_start代码里面已经将es寄存器设为0了,e而BX寄存器是存放如上图所示的内存的0x8000这个地址)
四、实操(磁盘读取)
接着编译一下。编译后,用16进制方式打开磁盘映像文件,定位到第一个扇区:
简单的修改一下用来测试:
调试后,接着在调试控制台(是与GDB交互的一个接口)输入一些命令来查看测试结果:
-exec x /20xb 0x8000
查看内存中0x8000地址开始的20个字节,20xb中的x意思是用16进制表示
(上面的调试过程试了好几次才成功,之前提示无法进行下一步,这次等的时间长一点成功了,可能是读写磁盘比较慢所以需要等待一段时间?也可能是其他原因,暂时没有搞明白具体原因。)
标签:02,显示字符,INT,AH,boot,扇区,0x10,--,磁盘 From: https://www.cnblogs.com/kakafa/p/18312145