预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共41页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第1章保护模式编程一 如果想更深、更亲近的了解电脑软件。那么学习cpu是你的必选!!386是CPU史的一大 转折点,那386做基础课是最好不过了。那么我们将开始进行学习之旅!!!大家跟我一块学 习吧,呵呵!!! 1.1准备工作 l1、NASM编译环境(当然Masm也可以但是用它来写COM程序比较 麻烦) l2、虚拟机 VirtualPC(Windows平台,执行比较快,即模拟又虚拟硬件)、 WMWarve(WIndows平台虚拟硬件,)、 Bochs(支持Windows平台、也支持在Linux平台上运行有RPM版本的) 我们这些生长在Windows这棵大树下的朋友们,还是用VirtualPC吧.。 l3、写虚拟启动镜像文件的程序 :不知道我观察的对不对?用Nasm编译一个bin然后将它转换为img镜像文件的时候。 只要文件大小符合软驱的标准就能启动。那么就代表a.bin与a.img文件的内容一模样就是 文件大小不一样!我是不太了解镜像文件格式.我用的是VirtualPC。 1.2开始接触引导程序 1.2.1Com文件 Com文件是纯二进制的文件,也是直接与Cpu交换的顺序指令文件。Com文件的大小 是有限制的,不能超过64KB.因为8086时代的CPU地址线是20位的,20位能表达的数值也 就是fffffh(1MB)。而寄存器最高也只是16位,无法用5个F的形式来表达地址,所以用CS(段 基地址)*16:IP(偏移地址)来寻址!80386后通用寄存器都得到了32位扩展!而Cpu地址线也得 到了32位的扩展。引导程序前期是需要进入实模式的,因为这是硬件上的限制是IA32的限 制。386cpu只有两种模式:实模式与保护模式!!!!,, 1.2.2引导程序 引导程序也是有限制的,这个限制是靠Bios处理的,开机后Bios经过自检后,会从软驱或 者硬盘的0面0磁道1扇区搜寻一个程序文件。该文件的数据必需是等于512Byte,并且以 aa55h结尾的(高高低低)。那么bios会认为它是引导程序,这个时候就会把该512byte装载到 内存7c00开始处。然后将主控权交给程序的第一行代码。那么这个时候程序脱离Bios的控 制。Cpu将执行程序的代码. 1.2.3写一个引导程序 引导程序可以说是非常简单: 1、boot.asm(nasm的源文件如下) ;-----------------------欲编译,这里改成100h就是com程序------------------------------------------- %define_BOOT_DEBUG_;做调试的时候用100h %ifdef_BOOT_DEBUG_ org0100h %else org07c00h;告诉编译器以下代码段将从07c00h内存地址处开始 %endif movax,cs;让数据段与附加段寄存器跟代码段一样,因为COM代码数据是混合. movds,ax moves,ax call_HelloWorld;让程序显示一个HelloWorld jmp$;$表示当前地址无限循环 _HelloWorld: movax,strHello;取得字符串的地址 movbp,ax;给堆栈基寄存器 movcx,strLen movax,1301H;ah代表功能号 movbx,000ch;页号为0(BH=0)黑底红字(BL=0Ch,高亮 movdx,0001h;显示的行与列 int10h;bios10h显示中断 ret strHello:db"HelloWorld" strLenequ$-strHello times510-($-$$)db0;times重复定义510-($-$$)个$$表示段的起始地址 dw0xAA55 那么引导程序完成了,用 nasmboot.asm-oa.com 就可以运行看效果.,如改成引导程序只需把%define_DEBUG_BOOT_注释然后nasm boot.asm-oa.bin然后用工具将a.bin转换成软驱大小的镜像文件载入虚拟机启动就可以. 第2章保护模式编程二 8086到80386的跳转,80386与8086在硬件上的区别在这就不说了!!那么80386与8086 在软件逻辑上面的区别就是:8086是实模式,而80386不仅包括实模式,而且还可以进入保 护模式!!! 保护模式不仅不受64KB内存寻址的限制,而且还拥有4GB的寻址空间。这是因为386 扩展了20地址线,将它扩展成32位了(32位能表达的字节数就是4GB).此时的段寄存器不再 是段基地了,而被叫做是选择子,存放的是一个段描述符的索引值.而我们的通用寄存器与EIP 也是32位的,可以表达4GB地址!不