微机课设启动过程.docx
- 文档编号:8992867
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:206.91KB
微机课设启动过程.docx
《微机课设启动过程.docx》由会员分享,可在线阅读,更多相关《微机课设启动过程.docx(16页珍藏版)》请在冰豆网上搜索。
微机课设启动过程
课程设计(综合实验)报告
(2012--2013年度第1学期)
名称:
微机原理课程设计
题目:
微机启动过程分析
院系:
控制与计算机工程学院
班级:
学号:
学生姓名:
指导教师:
设计周数:
成绩:
日期:
年月日
一、课程设计(综合实验)的目的与要求
分析安装微软操作系统的PC计算机启动过程的两个阶段------硬盘识别及分区识别阶段的两段代码的执行过程。
要求自己找一台符合要求的微机,提取硬盘主引导记录和分区引导记录,采用DEBUG工具,通过分析给出正确的反汇编清单,加上注释,给出框图,说明道理。
二、设计(实验)正文
计算机的启动过程(从打开电源到操作系统启动之前)
1、当电源开关按下时,电源开始向主板和其他设备供电,此时电压并不稳定,于是,当主板认为电压并没有达到CMOS中记录的CPU的主频所要求的电压时,就会向CPU发出RESET信号(即复位,不让CPU进一步运行),不过仅一瞬间不稳定的电压就能达到符合要求的稳定值,此时复位信号撤销,CPU马上从基本内存的BIOS段读取一条跳转指令,跳转到BIOS的真正启动代码处,如此,系统BIOS启动,此后的过程都由系统BIOS控制。
2、系统BIOS启动后会进行加电自检POST(PowerOnSelfRest)。
不过这个过程进行得很快,它主要是检测关键设备(如电源、CPU芯片、BIOS芯片、基本内存等电路是否存在以及供电情况是否良好。
如果自检出现了问题,系统喇叭会发出警报声(根据警报声的长短和次数可以知道到底出现了什么问题)。
3、如果自检通过,系统BIOS会查找显卡BIOS,找到后会调用显卡BIOS的初始化代码,此时显示器就开始显示了(这就是为什么自检失败只能靠发声进行提醒了)。
显卡BIOS会在屏幕上显示显卡的相关信息(不过现在的笔记本似乎并不显示这个)。
4、显卡检测成功后会进行其他设备的测试,通过后系统BIOS重新执行自己的代码,并显示自己的启动画面,将自己的相关信息显示在屏幕上,而后会进行内存测试(这些在现在的计算机上也看不到了),仅仅是短暂出现系统BIOS设置页面,此时就可以对系统BIOS进行需要的设置了,完成后会重新启动。
5、此后BIOS会检测系统的标准硬件(如硬盘、软驱(虽然现在很多计算机已没有软驱了)串行和并行接口等)检测完成后会接着检测即插即用设备,、,如果有的话就为该设备分配中断、DMA通道和I/O端口等资源,到了这里,所有的设备都已经检测完成了,老机会进行一次清屏并显示一个系统配置表,如果和上次启动相比出现了硬件变动,BIOS还会更新ESCD,即“ExtendedSystemConfigurationData”(扩展系统配置数据),它是系统BIOS用来与操作系统交换硬件配置信息的数据,这些数据被存放在CMOS中。
现在的机器则不再显示这些了。
6、当上面的所有步骤都顺利进行以后,BIOS将执行最后一项任务:
按照用户指定的启动顺序进行启动(即我们经常需要用到的设置系统从哪里启动,一般默认是硬盘,如果需要安装系统,还会设置为光驱或USB设备),注意,这里是指的启动顺序,如果设置为从光驱启动,而光驱中又没有光盘的话,系统还是会接着从硬盘启动的。
微机启动过程一览表
-A100
XXXX:
XXXXMOVAX,0201(用功能号2读1个扇区)
XXXX:
XXXXMOVBX,1000(把读出的数据放入缓冲区的地址为CS:
1000)
XXXX:
XXXXMOVCX,0001(读0柱面,1扇区)
XXXX:
XXXXMOVDX,0080(指定第一物理盘的0磁头)
XXXX:
XXXXINT13
XXXX:
XXXXINT3
XXXX:
XXXX(按回车键)
-G=100
由于win7系统中这一方法并不适用,因此通过winhex软件进行引导记录的导出,以及w32dsm进行反汇编,从而得到引导记录的汇编语言程序。
0000-0088
MasterBootRecord
主引导程序
主引导
程序
0089-01BD
出错信息数据区
数据区
01BE-01CD
分区项1(16字节)
分区表
01CE-01DD
分区项2(16字节)
01DE-01ED
分区项3(16字节)
01EE-01FD
分区项4(16字节)
01FE
55
结束标志
01FF
AA
三、课程设计(综合实验)总结或结论
反汇编清单
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;设置栈SS:
SP=0:
7C00
;
0000:
7C00xorax,ax
0000:
7C02movss,ax
0000:
7C04movsp,7C00h
0000:
7C07sti
;
;DS=ES=0
;
0000:
7C08pushax
0000:
7C09popes
0000:
7C0Apushax
0000:
7C0Bpopds
;将后面的代码复制到低端内存,为加载
;活动分区的引导扇区腾出空间,因为引导
;扇区也必须加载到0:
7C00
0000:
7C0Ccld
0000:
7C0Dmovsi,7C1Bh
0000:
7C10movdi,61Bh
0000:
7C13pushax
0000:
7C14pushdi
0000:
7C15movcx,1E5h
0000:
7C18repemovsb
;跳到低端内存的代码继续执行
0000:
7C1Aretf
;开始扫描分区表(PartitionTable),寻找活动分区
0000:
061Bmovbp,7BEh;600h+1BEh,分区表起始偏移为1BEh
0000:
061Emovcl,4;分区表中有4个分区表项
loc_620:
0000:
0620cmp[bp+0],ch;是活动分区吗?
(此时ch中的值为0)
0000:
0623jlloc_62E;活动分区的标志是80h,如果解释成有符号数,则小于0
0000:
0625jnzloc_63A;引导标志的合法值只能是0和80h,其它的值则出错
0000:
0627addbp,10h;指向下一个表项(每一个表项的长度为10h字节)
0000:
062Alooploc_620;依次扫描所有分区表项
;没有发现活动分区,无法启动OS,按照规范调用Int18h
;早期的BIOS的Int18h中断服务程序就是启动ROM-Basic,
;现在的BIOS一般是打印错误信息
0000:
062Cint18h
;找到活动分区后,还要检查剩余分区的启动标志是否为0
;不允许存在多个活动分区
loc_62E:
0000:
062Emovsi,bp
loc_630:
0000:
0630addsi,10h;下一个分区表项
0000:
0633deccx
0000:
0634jzloc_64F;所以剩余分区都扫描完
0000:
0636cmp[si],ch;启动标志是否为0?
0000:
0638jzloc_630;是则合法,检查下一分区
;分区启动标志不合法,打印错误信息
;"Invalidpartitiontable"
loc_63A:
0000:
063Amoval,byte_7B5
loc_63D:
0000:
063Dmovah,7
0000:
063Fmovsi,ax
loc_641:
0000:
0641lodsb
0000:
0642
loc_642:
0000:
0642cmpal,0
0000:
0644jzloc_642;打印完错误信息后,进入死循环
0000:
0646movbx,7
0000:
0649movah,0Eh
0000:
064Bint10h;调用Int10h显示一个字符
0000:
064Djmpshortloc_641
;开始加载活动分区的引导扇区
loc_64F:
;将一个标志的初始值清0。
这个标志表示是否尝试过备份的引导扇区
;[bp+10h]的字节肯定是没用的空间
0000:
064Fmov[bp+10h],cl
0000:
0652callsub_69B
0000:
0655jnbloc_681
loc_657:
0000:
0657incbyteptr[bp+10h];标志已经尝试过加载备份的引导扇区
;如果活动分区是FAT32分区,尝试加载备份的引导扇区
0000:
065Acmpbyteptr[bp+4],0Bh;FAT32
0000:
065Ejzloc_66B
0000:
0660cmpbyteptr[bp+4],0Ch;FAT32(需用扩展Int13h访问)
0000:
0664jzloc_66B
;加载引导扇区失败,显示错误信息
;"Errorloadingoperatingsystem"
0000:
0666moval,byte_7B6
0000:
0669jnzloc_63D
loc_66B:
;FAT32的备份引导扇区号=引导扇区号+6
0000:
066Baddbyteptr[bp+2],6
0000:
066Faddwordptr[bp+8],6
0000:
0673adcwordptr[bp+0Ah],0
0000:
0677callsub_69B
0000:
067Ajnbloc_681
;连备份的引导扇区也坏了,就没辙了!
0000:
067Cmoval,byte_7B6
0000:
067Fjmpshortloc_63D
;在把控制权交给引导扇区前,要先检查引导扇区的签名(signature)
;防止把控制权交给已经损坏的引导扇区
0000:
0681
loc_681:
0000:
0681cmpwordptrds:
[7DFEh],0AA55h;签名就是扇区最后的2个字节
0000:
0687jzloc_694
;引导扇区损坏,则尝试用备份引导扇区
0000:
0689cmpbyteptr[bp+10h],0;已经是备份的引导扇区?
0000:
068Djzloc_657
;备份引导扇区也坏了,死翘翘
0000:
068Fmoval,byte_7B7
0000:
0692jmpshortloc_63D
;交权给引导扇区,让它去完成OS的引导
0000:
0694
loc_694:
0000:
0694movdi,sp;di=sp=7C00h
0000:
0696pushds
0000:
0697pushdi
0000:
0698movsi,bp;把活动分区表项指针传给引导扇区
0000:
069Aretf;跳到0:
7C00
;读取引导扇区的子过程
sub_69Bprocnear
0000:
069Bmovdi,5;磁盘I/O错允许重试次数为5次
0000:
069Emovdl,[bp+0];分区的启动标志其实就是硬盘号
0000:
06A1movah,8
0000:
06A3int13h
0000:
06A5jbloc_6CA;如果取参数失败,认为BIOS肯定不支持扩展
Int13h;只好用传统Int13h
;计算用传统Int13h能访问的最大逻辑扇区号
;计算公式为:
(最大磁头号+1)*每道扇区数*(最大磁道号+1)
;注意这个计算次序是有讲究的,因为(最大磁头号+1)*每道扇区数
;的结果可以用16位寄存器就可以存放。
如果先用磁道号来计算,
;乘的结果就必须用两个寄存器来存放,导致第二步乘计算复杂化
0000:
06A7moval,cl
0000:
06A9andal,3Fh
0000:
06ABcbw;ax中为第道扇区数
0000:
06ACmovbl,dh
0000:
06AEmovbh,ah;bh=0,ah肯定为0
0000:
06B0incbx
0000:
06B1mulbx;(最大磁头号+1)*每道扇区数
0000:
06B3movdx,cx
0000:
06B5xchgdl,dh
0000:
06B7movcl,6
0000:
06B9shrdh,cl;dx中为(最大磁道号+1)
0000:
06BBincdx
0000:
06BCmuldx;(最大磁头号+1)*每道扇区数*(最大磁道号+1)
;判断引导扇区是否可以用传统Int13h来访问
;如果引导扇区的逻辑扇区号>=刚才算出的扇区号,必须用扩展Int13h来读取
;否则就用传统Int13h来访问
;注意一下双字数的比较方法!
0000:
06BEcmp[bp+0Ah],dx
0000:
06C1jaloc_6E6
0000:
06C3jbloc_6CA
0000:
06C5cmp[bp+8],ax
0000:
06C8jnbloc_6E6
0000:
06CA
;用传统Int13h来读引导扇区
loc_6CA:
0000:
06CAmovax,201h
0000:
06CDmovbx,7C00h
0000:
06D0movcx,[bp+2]
0000:
06D3movdx,[bp+0]
0000:
06D6int13h
0000:
06D8jnblocret_72B
;读取失败可以重试,试完规定的次数后还失败就没办法了
0000:
06DAdecdi
0000:
06DBjzlocret_72B
;重试前重置一下磁盘系统
0000:
06DDxorah,ah
0000:
06DFmovdl,[bp+0]
0000:
06E2int13h
0000:
06E4jmpshortloc_6CA
;检查BIOS是否支持扩展Int13h
0000:
06E6
loc_6E6:
0000:
06E6movdl,[bp+0]
0000:
06E9pusha
0000:
06EAmovbx,55AAh
0000:
06EDmovah,41h
0000:
06EFint13h
0000:
06F1jbloc_729
0000:
06F3cmpbx,0AA55h
0000:
06F7jnzloc_729
0000:
06F9testcl,1;必须支持Fixeddiskaccess这个功能子集
0000:
06FCjzloc_729
0000:
06FEpopa
;扩展Int13h读扇区
0000:
06FF
loc_6FF:
0000:
06FFpusha
;在栈中构造磁盘地址包(DiskAddressPacket)
0000:
0700push0
0000:
0702push0
0000:
0704pushwordptr[bp+0Ah]
0000:
0707pushwordptr[bp+8];要读扇区的LBA地址(4个word)
0000:
070Apush0
0000:
070Cpush7C00h;引导扇区读到0:
7C00h
0000:
070Fpush1;读一个扇区
0000:
0711push10h;包长度16个字节
0000:
0713movah,42h
0000:
0715movsi,sp
0000:
0717int13h
0000:
0719popa;这里用了一个小技巧,一下子从栈中弹出8个word
;(地址包刚好是8个word)
0000:
071Apopa;这才是真正的恢复保存的通用寄存器的值
0000:
071Bjnblocret_72B
0000:
071Ddecdi;不成功有重试的机会
;注意这里也有个小技巧:
dec指令不改变CF的状态
0000:
071Ejzlocret_72B;直到所有重试次数用完
;重试前重置磁盘系统
0000:
0720xorah,ah
0000:
0722movdl,[bp+0]
0000:
0725int13h
0000:
0727jmpshortloc_6FF
loc_729:
0000:
0729popa
0000:
072Astc
locret_72B:
0000:
072Bretn
sub_69Bendp
0000:
072Cdb'Invalidpartitiontable',0
0000:
0744db'Errorloadingoperatingsystem',0
0000:
0763db'Missingoperatingsystem',0
0000:
07B5byte_7B5db2Ch
0000:
07B6byte_7B6db44h
0000:
07B7byte_7B7db63h
0000:
07FEdw0AA55h;MBR的signature
;--------------------------------------------------------------------------------
四、参考文献
1、《清华大学TPC—2003A实验指导书》,2006版
2、《新编16/32位微型计算机原理及应用》,李继灿主编,清华大学出版社,2008版,第四版
3、《微机原理实验指导书》,杨国田、高明明编写,校内待出版,2002年3月,第一版
附录(设计流程图、程序、表格、数据等)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 启动 过程
![提示](https://static.bdocx.com/images/bang_tan.gif)