第1章 背景知识
让我们在轻松的背景知识介绍中开始Win32汇编之旅。本章将对Win32平台的历史和现状做简要介绍,同时对80386处理器,以及Windows操作系统中涉及Win32汇编的基础知识部分做快速充电。
1.1 Win32的软硬件平台
1.1.1 80x86系列处理器简史
Win32可以在多种硬件平台上运行,但使用最广泛的硬件平台是基于Intel公司80x86系列处理器的微型计算机。
自1978年6月Intel公司推出它的第一个16位微处理器8086以来,计算机技术就开始进入飞速发展的时期。8086芯片的主频为4.43 MHz,集成的晶体管数大约为2.9万个,运算器的位长为16位,采用了20条地址线,可以寻址的范围为220个字节地址,即1 MB;1982年,该公司发布了80286处理器,芯片上集成了12万个晶体管,主频提高到了12 MHz。
1985年Intel公司推出32位的80386处理器,芯片上集成的晶体管数为27.5万个,主频提高到了33 MHz,地址线则扩展到32条,直接寻址的能力达到4 GB。80386处理器在设计的时候考虑了多用户及多任务的需要,在芯片中增加了保护模式、优先级、任务切换和片内的存储单元管理等硬件单元。80386的出现使Windows和UNIX等多任务的操作系统可以在PC上运行。直到现在,运行于80x86处理器之上的多任务操作系统都是以80386的运行模式为基础的。
1989年,Intel公司推出80486处理器,在芯片内集成了浮点处理器和8 KB的一级缓存,片内的晶体管数达到了118万个,并把主频提高到50 MHz~66 MHz。80486处理器开始使用流水线技术,即在CPU中由5~6个不同功能的电路单元组成一条指令处理流水线,然后将一条指令分成5~6步后再由这些电路单元分别执行,由此提高CPU的运算速度。电路单元的数目就是流水线的深度。为了使计算机中的其他部件不至于成为CPU速度发展的瓶颈,80486处理器开始使用了倍频技术,即让处理器速度(CPU主频)数倍于系统总线速度(外频)。
从80386开始,在Intel公司向市场大量推出处理器芯片的同时,其他一些电脑公司和厂商如AMD和Cyrix等,也纷纷投入大量的人力财力进行处理器的开发和研制,并很快把研制出的产品推向市场。这些CPU芯片和80386芯片兼容,在编程上可以使用与Intel处理器相同的指令集。
1993年3月Intel公司推出80586处理器。由于无法阻止其他公司把自己的兼容产品也叫做x86,所以把产品取名为Pentium,并且进行了商标注册,同时启用了中文名称“奔腾”。Pentium芯片中集成了310万个晶体管,内置16 KB缓存,主频有60 MHz和66 MHz两个版本,后来逐步提高,到1995年6月时主频提高到了133 MHz。Pentium处理器采用许多新技术,其中最重要的变化是采用了超标量体系结构。即将两个同时工作的指令执行部件封装在同一芯片中,用两条并行的通道来执行指令,这相当于两个CPU同时工作,大大提高了处理速度。在586时代,AMD和Cyrix等其他公司也推出了相应档次的CPU,命名为5x86和K5等。
1995年11月,Intel公司推出代号为P6的新一代Pentium Pro处理器,中文名称为“高能奔腾”。Pentium Pro芯片中集成了550万个晶体管,主频分150 MHz~200 MHz多个版本。片内集成了3条平行的指令执行通道,相当于3个CPU并行工作,并用超流水线技术将流水线的深度提高到了14级。P6处理器内置16 KB一级高速缓存,并将256 KB或512 KB的二级高速缓存芯片与CPU内核芯片同时封装在一个外壳中,缩短了CPU和二级高速缓存之间的线路走线距离。同时,P6处理器开始使用乱序执行和分支预测技术,这使下一条指令不一定要等到前一条指令执行完毕后才可以开始。所有这些技术使这种CPU在运行32位指令系统时的执行效率明显高于上一代Pentium。
随着CPU和操作系统的发展,多媒体技术开始流行,依靠浮点处理器已经不能满足多媒体音频和视频信号的实时处理任务了。1997年年初,Intel公司在Pentium Pro芯片上增加了专用于多媒体处理的57条指令和8个64位专用寄存器,命名为Pentium MMX。Pentium MMX使用了450万个晶体管,最高主频达到了233 MHz。
1997年5月,Intel公司又向市场推出了Pentium II芯片,中文名称为“奔腾II代”。Pentium II内集成了750万个晶体管,最高主频达到了300 MHz,也具有MMX的功能。这种处理器将二级高速缓存移到芯片外,以提高芯片成品率。为了照顾低端市场,1998年Intel公司推出了除去二级高速缓存的Pentium II简化版,命名为Celeron处理器。由于其缺乏片内二级高速缓存,对速度的影响非常巨大,使Celeron处理器的实际性能非常低。1998年4月,Intel公司又把128 KB二级高速缓存加回到Celeron处理器中,命名为Celeron A处理器。Celeron A的主频从300 MHz开始。
1999年,Intel公司推出集成了950万个晶体管,主频为450 MHz~500 MHz,外频为100 MHz的Pentium III处理器。这种处理器新增了SSE指令集,提供70条全新的指令,可以大大提高3D运算、动画片、影像与音效等功能,增强了视频处理和语音识别的功能。这套指令集主要为浏览WWW网页而设计。Pentium III处理器在芯片内集成了64 KB的一级缓存,并将512 KB的二级缓存安装在外壳卡盒内。
2000年11月,Intel公司发布集成4200万个晶体管的Pentium 4处理器,主频达到了1.4 GHz,系统总线速度为400 MHz,流水线的深度提高到20级,并增加了SSE2指令集,提供144条新指令用于提高摄像、多媒体、3D图像和密集运算等方面的速度。到2005年,Pentium 4处理器的主频已经提升到了3 GHz以上。
在如此高的主频下,电压和发热量成为继续提高主频的主要障碍,导致无法再通过简单提升时钟频率来提升CPU性能。面对主频之路走到尽头,Intel开始寻找其他方式来提升处理器的性能,而最具实际意义的创新是增加CPU内处理核心的数量。多核时代开创于2005年春季,其标志是Intel的Pentium D双核芯片,2006年1月Intel发布了首款双核移动处理器Core Duo,时至今日,四核技术的CPU也已经发布。
从第一块微处理器诞生至今,处理器技术发展出不少新的体系结构。从微处理器的指令系统来看,有两种分支走向,一种是CISC;一种是RISC。CISC即复杂指令系统计算机。从PC诞生以来,人们一直沿用CISC指令集方式。它的指令不等长,指令的条数比较多,编程和设计处理器时都较为麻烦。在CISC之后,人们发明了RISC,即精简指令系统。这种指令系统采用等长的指令,且指令数较少,通过简化指令可以让计算机的结构更为简单,进而提高运算速度。
Intel的80x86系列处理器看起来属于CISC体系,但实际上,从Pentium处理器开始,都已不是单纯的CISC体系了。因为它们引入了很多RISC体系里的先进技术来大幅度提高性能。但是,好马也得配好鞍——没有软件支持的CPU再快也不是好CPU。为了兼容已有的软件,80x86系列处理器也不得不背上沉重的历史包袱。如CPU的位长还是停留在32位;在寄存器、运行模式与内存管理模式等方面还是继承了早期的80386模式;80386以后的处理器虽然增加了不少新指令,但大多用于多媒体扩展,其中很少有和操作系统密切相关的指令。所以,如果不涉及3D及密集运算方面的运算,仅从操作系统的角度看,这些处理器只能算是一个快速的80386处理器而已。
1.1.2 Windows的历史
Win32指的是32位的Windows系操作系统。Microsoft公司有一系列的Windows操作系统,下面先简单介绍Windows的历史。
谈到Windows的历史就不能不谈MS-DOS的历史。MS-DOS的技术源自CP/M操作系统。1973年,第一个8位磁盘操作系统CP/M出现,这种操作系统有较好的层次结构,它利用BIOS隔离硬件和操作系统的其他模块,有很好的可移植性和易用性。在此基础上,西雅图计算机公司于1978年开始开发QDOS,此后又成功研制出16位微型机的实验性操作系统86-DOS。
也正是在这段时期,IBM公司正在开发基于8086处理器的IBM PC,急需一个配套的操作系统,但和CP/M开发者之间的谈判不是很顺利,这时Microsoft公司乘虚而入。Microsoft没有足够的时间开发新的操作系统,于是找到了西雅图计算机公司,双方达成了由Microsoft经销86-DOS操作系统的协议。以86-DOS操作系统为基础,Microsoft很快开发出MS-DOS 1.0版本。1981年8月,MS-DOS 1.0和IBM PC一起发布。
MS-DOS 1.0还不支持硬盘和分层目录结构,文件管理中继承了CP/M操作系统的许多功能,但仅支持单面软盘。到了1983年,为了支持带硬盘的PC/XT计算机,经过较大地改造并吸取了UNIX的很多优点后,MS-DOS升级到2.0版本,可以支持32 MB大小的硬盘分区。1984年,MS-DOS升级到3.0版本,开始支持1.2 MB软盘,用于PC/AT计算机。1986年,为了支持3.5英寸软盘,MS-DOS升级到3.2版本。
1987年,为了兼容IBM和PS/2个人计算机,MS-DOS升级到3.3版,这也是最流行的DOS版本。1990年,Microsoft推出MS-DOS 5.0,开始支持2.88 MB的软盘,并可以把部分系统代码放到高端内存运行,空出低端内存供应用程序使用,同时将磁盘单个分区的支持容量提高到了2 GB。
一直到MS-DOS的最后版本6.22为止,绝大多数的PC上运行的就是这个字符界面的操作系统。当时要想玩转DOS,必须有专业计算机知识,不然“Bad command or filename”之类的提示随处可见,对此一般用户还真会不知所措。所以,“虽然界面简陋却令人兴奋”的Windows 1.0于1985年11月正式发布时,还是为沉闷的屏幕带来了一丝清新,毕竟它使非专业的人员使用计算机变得容易。在增强了键盘和鼠标接口后,1987年微软又推出了Windows 2.0版。由于当时的硬件和DOS功能的限制,Windows并不实用,所以这两个版本并不成功。Windows 2.0版发布不久,Intel公司的80386处理器发布,Microsoft推出使用80386处理器V86模式的Windows 2.1,即Windows/286。
在接下来的时间里,基于Intel 80x86微处理器的IBM兼容机已经快速普及,这给Microsoft开发新的Windows系统提供了发展空间和市场。Microsoft公司对Windows的内存管理和图形界面做了重大改进,在1990年5月份推出了Windows 3.0,可以支持Intel 80286/386/486微处理器的保护模式,并可以访问达16 MB的内存。Windows 3.0一面世便在商业上取得了惊人的成功,从而一举奠定了Microsoft在操作系统上的垄断地位。1992年4月,Microsoft推出了更稳定的Windows 3.1,可以支持True Type字体。Windows 3.1是16位Windows中最流行的版本。
1993年5月,Microsoft发布了具备安全性和稳定性特征的32位操作系统Windows NT 3.11,主要针对网络和服务器市场。“NT”代表“新技术”(New Technology)。NT 3.11是Windows系列中使用32位编程模式的第一个版本。它充分利用80386及以上处理器的平坦地址空间和保护模式等新技术,并可以移植到Alpha、MIPS和Power PC等不同的处理器平台上运行。
随后,Microsoft借Windows东风,于1995年8月推出新一代操作系统Windows 95(又名Chicago)。Windows 95实现了很友好的用户界面,支持即插即用功能,支持主流多媒体设备和DirectX编程接口,成为Microsoft发展史上的一个里程碑,也是操作系统发展史上的一个里程碑。从此,Windows 9x便取代了Windows 3.x和MS-DOS操作系统,成为个人计算机平台的主流操作系统。
在20世纪90年代后期,Microsoft根据家庭个人用户和商业办公用户的不同需求,分别提供Window 9x和Windows NT这两个系列的操作系统,Windows 9x注重用户界面及其他易用性特征,而NT系列则在纯32位内核的稳定性和可靠性等企业级特征上下工夫;另一方面,特别针对不同规模商业用户的需求,Windows NT系列分为工作站版和服务器版等多个版本。在Windows 9x系列上,从Windows 95 OSR2版起,Microsoft先后发布了Windows 98,Windows 98 SE和Windows Me这三个面向家庭和个人用户的PC操作系统;而在商用操作系统领域,继Windows NT 3.11之后,Microsoft相继发布了Windows NT 3.5和4.0两代操作系统,并在NT 4.0上采用了Windows 95式的用户界面。2000年,Microsoft发布采用纯32位内核并照顾了家庭消费类应用软件的Windows NT 5.0,即Windows 2000。
为了利用MS-DOS时代大量的应用程序,保持向下的兼容性,Windows 9x的内核模块还有许多地方使用16位程序,但在编程上支持32位的编程模式。Windows NT系列和Windows 9x系列操作系统都支持Win32 API(Application Programming Interface),即Windows 32位应用程序编程接口,Win32 API为应用程序提供了大量的系统功能调用,通过Win32 API调用Windows系统相当于在MS-DOS中通过中断方式调用系统功能。就像DOS汇编程序中随处可见的INT 21h指令一样,Windows应用程序中Win32 API也随处可见。
随着时代的发展,针对个人用户领域,Microsoft于2001年10月发布了Windows XP,2007年1月份发布了Windows Vista;针对商业操作系统领域,于2003年5月发布了Windows Server 2003,2008年2月发布了Windows Server 2008。虽然两个系列的操作系统侧重点各不相同,个人操作系统侧重于文档管理、游戏、个人通讯、流媒体等功能,商业操作系统侧重于活动目录、组策略和管理、磁盘管理等面向服务器的功能,但是从编程的角度来讲,这些操作系统并没有多少不同之处,仍然使用Win32 API作为编程接口。
1.1.3 Win32平台的背后——Wintel联盟
Windows是伴随着Intel 80x86系列处理器从弱小逐渐成为霸主的。在20世纪90年代,Intel 80x86系列处理器更新换代最快的时期也就是Microsoft的Windows系列最红的时期。在这个时期,Windows标志和Intel Inside标志几乎是每一台桌面PC上都有的烙印。Microsoft和Intel公司一软一硬,完全统治着全球PC机的市场,成为整个PC时代的象征,被世人称为Wintel联盟。
从20世纪80年代起,当时规模甚小的Microsoft和Intel正式携手,逐步垄断了计算机产业硬件与软件的主要领域。每当Microsoft推出功能更强的软件后,Intel处理器的需求量就上升;同样,当Intel生产出速度更快的处理器后,Microsoft的软件因有了更好的平台而显得更易用。Intel有多快的CPU,Microsoft就有相应的、庞大的软件来支持它。Microsoft的应用程序不管有多庞大,需要多快的速度,Intel的新处理器又总能满足它。业界也必须出奇一致地放弃原有的软硬件平台,转到新平台上去。因为,谁跟不上Wintel的步伐,谁就极有可能被淘汰出局。
Wintel联盟不仅是针对竞争对手的联盟,它还是迫使用户升级的同盟。在升级的循环中,多数用户往往为了一个应用而被迫升级整个系统。Intel有多快的CPU,Microsoft就有多花哨、多庞大的操作系统与之相配合。操作系统的升级即意味着应用软件的全面升级,而应用软件的升级则意味着用户整个系统必须升级。如果用户还在原有的系统上工作,那么就再也得不到新软件的支持了,因为,所有的应用软件公司都不愿意在过时的操作系统上投资开发自己的应用软件。大家都有体会,运行Windows 95很快的Pentium II/250把Windows 98一装上去,立刻慢了下来,等到升级到了Pentium III/450,Windows 98运行起来很快了,Windows 2000又出来了,“快速”的PIII又成了老牛。在又一轮的升级下,CPU爬到了1 GHz以上,等到Windows 2000运行起来很舒畅了,再试一下Windows XP,用户升级的欲望又出来了!结果,用户口袋里的银子永远不会有满的一天。
时钟走过2000年,Wintel联盟已呈衰减之势。Sun,IBM,Oracle,Linux,垄断和司法部等名词让Microsoft感到头痛;AMD的速龙和钻龙处理器也让Intel手忙脚乱。Microsoft和Intel在利益上的冲突也越来越公开化,整个业界都感受到了Wintel联盟将土崩瓦解的气息。
不管业界风起云涌也好,一片死寂也好,Intel 80x86平台和Windows是桌面计算机上最流行的配置已是不争的事实。为了自由和创新,我们可以去学习Linux,但在更多的时候,学会Win32编程是不得已的选择,即使是全世界的计算机中只剩50%在运行Windows,Windows程序员仍然有广阔的用武之地,这也算是无奈之际给自己一个理由吧!