电子商务网站建设与维护期末考试,高中学校网站模板,阿里云主机卸载wordpress,iis7.5搭建网站一#xff0e;概述 根据以前写的一篇文章#xff1a;【操作系统】MBR主引导目录结构以及作用#xff0c;我们了解到BIOS在检测完内存、显卡#xff0c;把硬盘等一系列外设简单检测之后#xff0c;下一步将和主引导程序MBR进行交接#xff0c;将主控权交付给下一位嘉宾概述 根据以前写的一篇文章【操作系统】MBR主引导目录结构以及作用我们了解到BIOS在检测完内存、显卡把硬盘等一系列外设简单检测之后下一步将和主引导程序MBR进行交接将主控权交付给下一位嘉宾至此BIOS的任务就完成了继续睡去本篇文章我们来开始编写一个简单MBR程序并且让其完成从BIOS过渡到MBR这个过程至于MBR的本质工作启动引导程序等我们将在之后逐步完善其内容。
二.实现的功能 本次文章需要用Bochs模拟器详细可请参考之前写过的一篇文章【操作系统】Bochs安装和配置本次MBR实现的功能有
实现BIOS与MBR的过渡MBR启动后让其简单显示一些字符效果为在屏幕上面打印出“1 MBR”字符以便验证是否成功启动
三.源码和逐段解析 话不多说直接先把源码全部贴上后面再逐段解释 其中第一行
SECTION MBR vstart0x7c00 该段代码表示本程序在编译时将其实地址编译为0x7c00。
第二行到第六行
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax该段代码进行了寄存器的初始化工作因为ds、es、fs、ss等这类的寄存器不能通过赋值进行初始化所以需要使用其他寄存器进行间接初始化因为BIOS是通过jmp 0x7c00跳转到MBR的此时段寄存器cs:ip的值分别为0和0x7c00所以将cs的值赋予给力ax通过通用寄存器ax来中转。Ps:cs不是通用寄存器属于段寄存器在程序运行中会被频繁使用所以不能进行初始化寄存器使用喔。
第七行
mov sp,0x7c00 该代码为初始化栈指针将栈指针指向0x7c00的位置
第九行到第十四行
mov ax,0x0600
mov bx,0x0700
mov cx,0
mov dx,0x184f
int 0x10 该段代码为清屏函数因为BIOS在检测硬件时会显示一些硬件信息为了看清楚我们自己的输出字符所以使用了BIOS的0x10中断0x06号上卷全部行的功能其中ax的高位表示调用的功能号(AH0x06)低位表示上卷的行数AX0X00,如果为0表示全部。bx表示上卷行属性。cx的高低位置CL,CH分别表示窗口左上角(X,Y)位置dx的高低位置DL,DH分别表示窗口右下角X,Y位置在VGA文件模式中一行只能容纳80个字符共25行所以右下角坐标最大可以为7924最后执行以下BIOS的10号中断。
第十六到第十九行
mov ah,3
mov bh,0
int 0x10 该段代码为获取光标位置函数调用3号子功能获取光标位置并且将位置存入ah寄存器中使用bh来存储带获取的光标的页号最后再次执行下BIOS的10号中断。
第二十一行到第二十八行
mov ax,message
mov bp,ax
mov cx,5
mov ax,0x1301
mov bx,0x2
int 0x10 该段代码实现了打印字符串的功能将需要打印的字符数据message存入到通用寄存器ax进行中转将数据存入到bp寄存器中es:bp为串首地址此时es和cs保持一致message在下面的第三十一行就进行了定义
message db 1 MBR cx寄存器中保存字符串的长度本文为5包含空格。紧接着调用13号显示字符以及属性的子功能此时ah传入0x13而al则为设置写入字符的方式方式共有以下几种 本文中使用了al0x01的方式而bh中存储的是要显示的页号本文中bx0x2所以此处为第0页bl为字符属性bl0x2为黑底绿字的意思最后再次执行以下BIOS的10号中断。
第三十行到第三十三行
jmp $
message db 1 MBR
times 510-($-$$) db 0
db 0x55,0xaa 该段代码进行了收尾也是本篇文章的精华之处使用jmp $使得程序进入死循环作用相当于which(1)其中“$”表示本行指令的地址而“$$”则表示本section的起始地址所以“$-$$”则是指本行到本section的偏移量。由于MBR的最后两个字节是固定的0x55和0xaa所以要预留两个字节故本扇区剩余的空间需要使用“0”来进行填充通过510字节减去上面所算出来的偏移量得出的就是剩余的空间将剩余的空间填充满“0”并在最后的两个字节中固定为0x55和0xaa使其变成MBR程序。
四.运行 代码编写完成后我们保存一下代码本文保存文件名为A.S并且使用nasm对代码进行编译
nasm –o A.bin A.S 此时我们就可以开始运行调试了我们需要用到之前写过的一篇文章【操作系统】Bochs安装和配置里面的两个东西
使用Bximage工具生成的空白镜像本文文件名为test.img大小随意大于512个字节即可Bochs模拟硬件环境的配置文件文章中文件名为boch.disk 我们首先将生成的A.bin文件写入到空白镜像中
dd if./A.bin of./test.img bs512 count1 convnotrunc 上述代码的具体参数可以自行百度不再次赘述将代码写入到镜像后我们再将镜像文件加入到Bochs的模拟硬件环境配置文件中根据文章中所描述的我们直接将新生成的镜像写入配置文件的以下位置即可 保存一下修改后的配置文件我们开始运行Bochs模拟器进行模拟操作
./Bochs –f boch.disk(你自己的硬件配置文件名) 运行成功后会显示以下信息并且默认为【6】 此时我们再按一次回车即可开始模拟 我们在控制台中输入“c”具体含义请查看上面所说的文章继续往下运行就能看到弹出的窗口中出现了我们所要的字符串