汇编语言程序设计教程.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流汇编语言程序设计教程.精品文档.西华师范大学计算机学院自编教材汇编语言程序设计教程贺春林、赖晓风、王朝斌、高建清编著钟乐海、潘 伟 赵玉萍赵 西华师范大学计算机学院二00六年三月前 言汇编语言是面向机器的低级语言,通过学习汇编语言,才能真正理解计算机的工作原理和工作过程,才能深入地了解高级语言的一些概念。应用汇编语言,程序员可以直接操纵计算机的硬件,用汇编语言,才能编写出运行速度快、占有空间小的高效程序。即便是在高级语言功能非常强大的今天,一些程序设计语言不断被淘汰,新的优秀的编程语言不断出现,汇编语言仍然处于重要地位,发挥着它的重要作用,并且不能由其它语言所替代。“汇编语言程序设计”,是计算机各专业的一门重要基础课,也必修的核心课程之一,它是“操作系统”和“微机原理与接口技术”等其它核心课程的先修课。计算机技术在发展,汇编语言也在发展,汇编语言教学也需要发展和改革,为了适应计算机技术应用的发展和变化,为了适应计算机应用型本科和专科教学改革的要求,根据我们对“汇编语言程序设计”课程教学的体会,组织编写了这本“汇编语言程序设计教程”。其指导思想是着重于基本概念、指令和基本程序设计;对输入输出、DOS功能调用、中断等程序设计,以及32位汇编程序设计,只要求学生能够理解或者有所了解,为后续的课程打下基础,以适应少学时的教学要求。本书以Intel 80x86指令系统和MASM 6.x为主体,全面而系统地介绍16/32位整数、浮点、多媒体指令的汇编语言程序设计方法。全书可分为基础和提高两部分。前4章作为基础部分,以当前“汇编语言程序设计”课程的教学为目标,为读者讲解16位基本整数指令及其汇编语言程序设计的知识。基础部分的主要内容是:汇编语言程序设计的基础知识、8086指令详解、MASM伪指令和操作符、程序格式、程序结构及其设计方法。提高部分的后5章,从不同的方面介绍了汇编语言程序设计的深入内容和实际应用知识。提高部分各章的内容相对独立,主要有:32位80x86 CPU的整数指令系统及其编程、汇编语言与C/C+的混合编程、80x87 FPU的浮点指令系统及其编程、多媒体扩展MMX指令系统和SSE指令系统。本书各章配有丰富的习题和详细的上机指导,附录提供了Debug、PWB和CodeView开发工具的使用说明。 本书可选作高等院校汇编语言程序设计课程的教材或参考书,主要读者为计算机及相关学科的本、专科学生。由于本书具有内容广博、语言浅显、结构清晰、实例丰富等特点,所以本书的适应面非常广泛,例如电子、自动控制等专业的高校学生和成教学生,计算机应用开发人员,深入学习微机应用技术的普通读者等。本书可以作为计算机专业本科及专科汇编语言课程的教材或参考书,也可以作为Windows程序设计人员的参考书,还可以作为其它高级语言程序设计人员的参考书。由于作者水平有限,书中难免有错误和不妥之处,恳请读者给予指正和提出修改意见。第1章 绪论1.1 汇编语言概述1.1.1 汇编语言按照确定的算法解决具体问题所必须的指令序列称为程序,它是由数据、指令和字符等构成的,在执行前应预先将它们以二进制代码形式存储在存储单元中。 所谓指令是指控制计算机执行某一特定操作的命令。而一台计算机所能识别的指令的全体称为指令系统,它反映计算机基本功能的强弱。机器指令是以二进制代码形式表示的,能直接为计算机识别而执行的命令,它通常由操作码和操作数两部分组成。8086/8088指令系统有约100多条基本指令。汇编语言是一种面向机器的语言,汇编语言的指令与机器指令是一一对应的。它用符号、文字来表示指令,所以它又称符号语言。用汇编语言编写的程序是不能被计算机直接识别和执行的(如同用高级语言编写的程序),它需要翻译成目标程序后方可执行,这个过程我们称为汇编。汇编语言虽然没有高级语言在使用上简单方便,但因它与机器语言是一一对应的,故可充分利用计算机硬件系统的特性,提高编程技巧和编程质量。另外,利用汇编语言处理I/O设备是汇编语言的独到之处,所以它是无法为其他语言所取代的。汇编程序的类型有:自汇编程序、交叉汇编程序、微汇编程序、浮动汇编程序和宏汇编程序。汇编语言(ASM)虽然较机器语言在阅读、记忆及编写方面都前进了一大步,但对描述任务、编程设计仍感不便,于是产生了具有机器语言优点,而又能较好地面向问题的语言,即宏汇编语言(MASM)。宏汇编语言不仅包含一般汇编语言的功能,而且用了高级语言使用的数据结构,是一种接近高级语言的汇编语言。例如它提供了记录、结构和字符串操作;具有宏处理、条件汇编及磁盘操作系统DOS功能调用等多种功能;程序的开发以及调试手段也比较完善,因而宏汇编语言是一种更高级的汇编语言。1.1.2 汇编语言的特点由于汇编语言使用指令助记符和符号地址,所以他要比机器语言容易掌握得多。与高级语言相比,汇编语言具有以下特点:(1)汇编语言与及其关系密切(2)汇编语言程序效率高(3)编写汇编语言源程序繁琐(4)汇编语言程序调试困难1.1.3 汇编语言的主要应用场合:(1)程序执行占用较短的时间,或者占用较小存储容量的场合。 (2)程序与计算机硬件密切相关,程序直接控制硬件的场合。 (3)需提高大型软件性能的场合。 (4)没有合适的高级语言的场合。 1.2数据表示和类型1.2.1 进位计数制以及不同计数制间的相互的转换在日常生活中我们所用的是十进制数,但在计算机中我们用的是二进制数,作为汇编语言程序设计对二进制数与十进制数的转换是必不可少的。1. 各种进位计数制 表1.1 二、八、十和十六进制数码的对照关系表十进制二进制八进制十六进制0000101112102231133410044510155611066711177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F16100002010(1)十进制数 十进制数就是我们在日常生活中所用的数,它共有0,1,2,3,4,5,6,7,8,9这十个数码,它的计数方法是“逢十进一”。对于十进制数的运算大家应该都知道,这里就不多说了。 (2)二进制数二进制数是最简单的进位计数制,它只有0,1二个数码,计数方法是“逢二进一”。二进制数的运算十分简单,加法是“逢二进一”,减法是“借一当二”。例如“11+10=101;101-10=11”至于乘法和除法和我们日常相似,只不过不是“逢十进一”而是“逢二进一”罢了。 (3)八进制数和十六进制数很显然八进制数是0到7这八个数码组成,且是“逢八进一”,而十六进制数是由0到9和A,B,C,D,E和F(英语大写字母分别代表10到15)这十六个数码组成的,它的进位方式是“逢十六进一”。在下面我将给出二,八,十和十六进制数码的对照关系表。如表1.1所示:2.数制的转换 (1)将十进制数转换成二进制数例 试将十进制数 125.6875转换成二进制数。整数的转换:除2取余先将125除以2在右边记下余数,然后以此类推,直到最后的差为0,最后我们将余数倒着排列即得结果。 小数的转换:乘2取整小数的转换正好与整数的转换相反,先将0.6875乘以2得结果1.3750,则在右边记下整数位1,再将去整数位后的0.375乘以2记下结果,依此类推,直到最后小数部分为0或结果以达到精度要求。(2)将十进制数转换成八/十六进制数方法如上,只不过乘/除数为8或16。(3)二,八/十六进制数转换成十进制数转换方法是利用数制的一般表达式写成相应的幂运算形式,然后求和得到。例:572.34(8)=5*82+7*8+2+3*8-1+4*8-2=378.4375 (4)二进制数与八进制数的转换因为23=8,所以二进制数转换成八进制数只需将二进制数从小数点开始每3位转成一位八进制数(整数由左向右,小数相反)。 例如:101 111 010 . 011 100(2) =572.34(8)八进制数转换成二进制数只需将每一位八进制数用三位二进制数表示,小数点位置不变。 例如:175.54(8)=001 111 101.101 100B=1111101.1011B。至于十六进制数与二进制数的转换只需将每隔3位改为每隔4位即可。1.2.2 原码,补码和反码在计算机中参加运算的数有正负之分,通常在计算机中我们用X=X0X1X2XN-1来表示一个二进制数,并规定当X0=0时X为正数,X0=1时X为负数.在计算机中这种表示法有原码,补码和反码三种。1. 原码原码的定义为: 所能表示数的范围为:例: 根据X(原)所能表示的整数范围公式,我们可以计算出当n=8时,原码表示范围是-127,127。原码的表示法简单易懂,但是它最大的缺点是运算复杂。所以人们引进了补码。2. 补码补码的定义为:所能表示数的范围为:例: 根据X(补)所能表示的整数范围公式我们可以计算出当n=8时补码表示范围是-128,127;根据补码的定义公式我们可以计算出任何一个数的补码,如X=-2FH根据公式X(补)=100H-2FH=D1H。用补码进行加减运算是很简单的,公式为X+Y补=X补+Y补;X-Y补=X补+-Y补。加法公式是非常简单的,但减法中我们只知道Y补而不知道-Y补,利用一个口诀就可解决这个问题,口诀是"将Y补连同符号位一起按位求反后末为加一可得-Y补"。我们现在虽然有了公式和口诀,但是还有符号位的问题没有解决,而另一个口诀可以解决这个问题。口诀是"符号位参加运算,符号位相加,若有进位,则进位舍去"。如:63H-72H=63H+8EH=0F1H(用十六进制时最高位为字母时前加0)。注意:运算有时会产生溢出,如57+81>127。当我们用N=8的补码运算就会溢出,因为当字长N=8时补码的表示范围是 -128,127。 3. 反码反码的定义为:所能表示数的范围为:例: 根据X(反)所能表示的整数范围公式,我们可以计算出当n=8时反码表示范围是 -127,127。 1.2.3 数的定点和浮点表示法在计算机中,针对小数点的处理有两种方法:定点表示法浮点表示法。1. 定点表示法定点表示法就是小数点固定在某个位置上。在定点计算机中,为了简单通常将小数点定在最高位(即纯小数)或将小数点定在最低位(即整数)。2. 浮点表示法浮点表示法就是小数点的位置并不固。浮点数在计算机中通常的表示形式为"浮点数=2的正/负阶码次方*尾数"其中阶码是个正整数,尾数是个小数,我们规定尾数的区间为0.5,1,如果尾数不在此区间,那我们可通过调节阶码来满足区间,此方法称为规格化。 1.2.4 BCD码和字符编码 在日常生活中人们用的是十进制数,而机器又只能处理二进制数,因此我们引进了BCD码。BCD码是用四位的二进制数来表示一位十进制数(可参照下表)。例子:我现在将8351表示成BCD码为1000 0011 0101 0001。当用一个字节来表示十进制数时,称为非压缩的BCD码。例如6可表示为00000110。当用一个字节表示二个十进制数时,称为压缩的BCD码。例如79可表示为01111001。除了数值数据外,计算机还可处理人们常用的符号,如字母,标点符号等。在计算机中这些符号是用ASCII码来表示的。ASCII码用一个字节的二进制数来表示一个字符,但实际只用了七位,最高位被用来做奇偶校验位。这一位置1或0,使字节含1的个数为奇数(或偶数)称为奇校验或偶校验。如表1.2十进制数与BCD码对换关系表。表1.2 十进制数与BCD码对换关系表十进制数BCD码十进制数BCD码000005010110001601102001070111300118100040100910011.3 Intel 系列CPU简介1.3.1 Intel系列CPU简介由于汇编语言与CPU关系密切,所以先对Intel系列80x86的CPU做一下简单介绍。CPU是Central Processing Unit中央处理器的缩写,它是计算机中最重要的一个部分,由运算器和控制器组成,如果把计算机比作一个人,那么CPU就是他的心脏,其重要作用由此可见一斑。不管什么样的CPU, 其内部结构归纳起来可以分为控制单元、逻辑单元和存储单元三大部分,这三个部分相互协调,便可以进行分析、判断、运算并控制计算机各部分协调工作。CPU从最初发展至今已经有二十多年的历史了,这期间,按照其处理信息的字长,CPU可以分为:四位微处理器、八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器等等。1971年,早期的Intel公司推出了世界上第一台微处理器4004,这便是第一个用于计算机的四位微处理器, 它包含2300个晶体管,由于性能很差,其市场反应十分不理想。随后,Intel公司又研制出了8080处理器、8085处理器,加上当时Motorola公司的MC6800微处理器和Zilog 公司的Z80微处理器,一起组成了八位微处理器的家族。 十六位微处理器的典型产品是Intel公司的8086微处理器,以及同时生产出的数学协处理器,即8087。这两 种芯片使用互相兼容的指令集,但在8087指令集中增加了一些专门用于对数、指数和三角函数等数学计算指令 ,由于这些指令应用与8086和8087,因此被人们统称为X86指令集。此后Intel推出的新一代的CPU产品,均兼容 原来的X86指令。 1979年Intel推出了8088芯片,它仍是十六位微处理器,内含29000个晶体管,时钟频率为4.77MHz,地址总 线为20位,可以使用1MB内存。8088的内部数据总线是16位,外部数据总线是8位。1981年,8088芯片被首次用 于IBM PC机当中,如果说8080处理器还不为各位所熟知的话,那么8088则可以说是家喻户晓了,个人电脑PC机的第一代CPU便是从它开始的。1982年的80286芯片虽然是16位芯片,但是其内部已包含13.4万个晶体管,时钟频率也达到了前所未有的20MHz。其内、外部数据总线均为16位,地址总线为24位,可以使用16MB内存,可使用的工作方式包括实模式和保护模式两种。三十二位微处理器的代表产品首推Intel公司1985年推出的80386,这是一种全三十二位微处理器芯片,也是X86家族中第一款三十二位芯片,其内部包含27.5万个晶体管,时钟频率为12.5MHz,后逐步提高到33MHz。8 0386的内部和外部数据总线都是32位,地址总线也是32位,可以寻址到4GB内存。它除了具有实模式和保护模式 以外,还增加了一种虚拟86的工作方式,可以通过同时模拟多个8086处理器来提供多任务能力。1989年Intel公司又推出准三十二位处理器芯片80386SX。它的内部数据总线为三十二位,与80386相同,外部数据总线为十六 位。也就是说,80386SX的内部处理速度与80386接近,也支持真正的多任务操作,而它又可以接受为80286开发 输入/输出接口芯片。80386SX的性能优于80286,而价格只是80386的三分之一。386处理器没有内置协处理器,因此不能执行浮点运算指令,如果您需要进行浮点运算时,必须额外购买昂贵的80387协处理器芯片。 八十年代末九十年代初,80486处理器面市,它集成了120万个晶体管,时钟频率由25MHz逐步提升到50MHz 。80486是将80386和数学协处理器80387以及一个8KB的高速缓存集成在一个芯片内,并在X86系列中首次使用了 RISC(精简指令集)技术,可以在一个时钟周期内执行一条指令。它还采用了突发总线方式,大大提高了与内 存的数据交换速度,由于这些改进,80486的性能比带有80387协处理器的80386提高了4倍。早期的486分为有协 处理器的486DX和无协处理器的486SX两种,其价格也相差许多。随着芯片技术的不断发展,CPU的频率越来越快 ,而PC机外部设备受工艺限制,能够承受的工作频率有限,这就阻碍了CPU主频的进一步提高,在这种情况下, 出现了CPU倍频技术,该技术使CPU内部工作频率为处理器外频的23倍,486DX2、486DX4的名字便是由此而来 。 九十年代中期,全面超越486的新一代586处理器问世,为了摆脱486时代处理器名称混乱的困扰,最大的C PU制造商Intel公司把自己的新一代产品命名为Pentium(奔腾)以区别AMD和Cyrix的产品。AMD和Cyrix也分别 推出了K5和6x86处理器来对付Intel,但是由于奔腾处理器的性能最佳,Intel逐渐占据了大部分市场。在2000年的6月,Intel公司宣布了其开发的下一代CPU命名为Pentium 4,也就是曾经命名为Willamette的CPU。在2000年的11月,Intel正式发布了Pentium 4处理器,该处理器没有采用P6架构,而是采用了全新的NetBurst架构,Pentium 4的管线长度是P6架构的两倍,达到了20级。现在的PIII Coppermine由于受到管线的限制,最高只能达到1.2GHz,这一点从1.13GHz的PIII被回收就能看出来。管线的加长可以使得Pentium 4能达到更高的时钟频率,但是也使Pentium 4在每个时钟周期中的处理的命令数目比PIII Copper mine少,这就是为什么现在相同的速度下,Pentium 4的性能表现不如PIII Copper mine和T-bird的原因,但是随着Pentium 4速度的提高,会克服这一点的。 最初的Pentium 4采用0.18微米制造工艺,集成4200万个晶体管,芯片面积213平方毫米,核心电压1.7V,目前采用的是Socket423接口,而Pentium 4的最终版本会采用Socket 478接口。 Pentium 4集成了8KB的L1 Cache,使用的是低于1.42ns的高速缓存,拥有极低的寻找时间,能迅速地找到并且命中目标指令,大大的提高了CPU的工作效率。Pentium 4还拥有全速的256KB二级缓存,在处理器核心和L2 Cache之间有着更大的数据传输通道,数据传输率可以达到前所未有的44.8GB/s,几乎是PIII 1G(16GB/s)的3倍之多。 Pentium 4的总线频率高达400MHz,是目前PC133总线的Pentium III的三倍,如果配合双通道的RAMBUS内存,可以在处理器和内存控制器之间提供高达3.2GB/sec的内存通道。 Pentium 4的算术逻辑单元(ALU)一核心的两倍运行,还包含了144条重新设计的SSE2指令集。1.3.2 CPU专业术语Intel公司的X86序列CPU以及其它公司所生产的兼容产品,是目前世界上个人电脑中装机最多的芯片。每当各种媒体介绍或评价这类CPU时,经常会提到诸如“流水线”、“乱序执行”和“分枝预测”等专业术语。 1. IA-32&IA-64 IA是英语“英特尔体系/Intel Architecture”的缩写。这是因为目前使用的CPU以Intel公司的X86序列产品为主,所以人们将Intel生产的CPU统称为英特尔体系(IA)CPU。由于其它公司如AMD等公司生产的CPU基本上能在软、硬件方面与Intel的CPU兼容,所以人们通常也将这部份CPU列入IA系列。 由于目前使用的CPU,包括新推出的Pentium III都还是32位的,所以又被列为IA-32。而IA-64就是Intel下一步将推出的64位CPU,但其物理结构和工作机理与目前的X86序列的IA-32CPU完全不同。 2. CPU的位和字长 位在数字电路和电脑技术中采用二进制,代码只有“0”和“1”,其中无论是“0”或是“1”在CPU中都是一“位”。 字长电脑技术中对CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长。所以能处理字长为8位数据的CPU通常就叫8位的CPU。同理32位的CPU就能在单位时间内处理字长为32位的二进制数据。 字节和字长的区别 由于常用的英文字符用8位二进制数就可以表示,所以通常就将8位称为一个字节。字节的长度是固定的,而字长的长度是不固定的,对于不同的CPU,字长的长度也不一样。8位的CPU一次只能处理一个字节,而32位的CPU一次就能处理4个字节,同理字长为64位的CPU一次可以处理8个字节。 3. CPU外频CPU外频也就是常见特性表中所列的CPU总线频率,是由主板为CPU提供的基准时钟频率,而CPU的工作主频则按倍频系数乘以外频而来。在Pentium时代,CPU的外频一般是60/66MHz,从Pentium350开始,CPU外频提高到100MHz。由于正常情况下CPU总线频率和内存总线频率相同,所以当CPU外频提高后,与内存之间的交换速度也相应得到了提高,对提高电脑整体运行速度影响较大。 4. CPU主频CPU主频也叫工作频率,是CPU内核(整数和浮点运算器)电路的实际运行频率。在486DX2CPU之前,CPU的主频与外频相等。从486DX2开始,基本上所有的CPU主频都等于“外频乘上倍频系数”了。5. 流水线技术 流水线(pipeline)是Intel首次在486芯片中开始使用的。流水线的工作方式就象工业生产上的装配流水线。在CPU中由56个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成56步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度。从图1a中我们可以了解,由于486CPU只有一条流水线,通过流水线中取指令、译码、产生地址、执行指令和数据写回五个电路单元分别同时执行那些已经分成五步的指令,因此实现了486CPU设计人员预期的在每个时钟周期中完成一条指令的目的(按笔者看法,CPU实际上应该是从第五个时钟周期才达到每周期能完成一条指令的处理速度)。到了Pentium时代,设计人员在CPU中设置了两条具有各自独立电路单元的流水线,因此这样CPU在工作时就可以通过这两条流水线来同时执行两条指令,因此在理论上可以实现在每一个时钟周期中完成两条指令的目的。 6. 超流水线超流水线(superpiplined)是指某型CPU内部的流水线超过通常的56步以上,例如Pentium pro的流水线就长达14步。将流水线设计的步(级)数越多,其完成一条指令的速度越快,因此才能适应工作主频更高的CPU。这一点我们可以用日常事例来说明,比如栽树时由5个人同时栽10棵(一人两棵)所完成的速度当然没有10人同时栽(一人一棵)所完成的速度快。7. 超标量技术超标量(super scalar)是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术。 8. 乱序执行技术乱序执行(out-of-order execution)是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理的技术。比方说程序某一段有7条指令,此时CPU将根据各单元电路的空闲状态和各指令能否提前执行的具体情况分析后,将能提前执行的指令立即发送给相应电路执行。当然在各单元不按规定顺序执行完指令后还必须由相应电路再将运算结果重新按原来程序指定的指令顺序排列后才能返回程序。这种将各条指令不按顺序拆散后执行的运行方式就叫乱序执行(也有叫错序执行)技术。 采用乱序执行技术的目的是为了使CPU内部电路满负荷运转并相应提高了CPU的运行程序的速度。这好比请A、B、C三个名人为晚会题写横幅"春节联欢晚会"六个大字,每人各写两个字。如果这时在一张大纸上按顺序由A写好"春节"后再交给B写"联欢",然后再由C写"晚会",那么这样在A写的时候,B和C必须等待,而在B写的时候C仍然要等待而A已经没事了。但如果采用三个人分别用三张纸同时写的做法,那么B和C都不必须等待就可以同时各写各的了,甚至C和B还可以比A先写好也没关系(就象乱序执行),但当他们都写完后就必须重新在横幅上(自然可以由别人做,就象CPU中乱序执行后的重新排列单元)按"春节联欢晚会"的顺序排好才能挂出去。 9. 分枝分枝(branch)是指程序运行时需要改变的节点。分枝有无条件分枝和有条件分枝,其中无条件分枝只需要CPU按指令顺序执行,而条件分枝则必须根据处理结果再决定程序运行方向是否改变。因此需要"分枝预测"技术处理的是条件分枝。 10. 分枝预测和推测执行技术分枝预测(branch prediction)和推测执行(speculation execution)是CPU动态执行技术中的主要内容,动态执行是目前CPU主要采用的先进技术之一。采用分枝预测和动态执行的主要目的是为了提高CPU的运算速度。推测执行是依托于分枝预测基础上的,在分枝预测程序是否分枝后所进行的处理也就是推测执行。由于程序中的条件分枝是根据程序指令在流水线处理后结果再执行的,所以当CPU等待指令结果时,流水线的前级电路也处于空闲状态等待分枝指令,这样必然出现时钟周期的浪费。如果CPU能在前条指令结果出来之前就能预测到分枝是否转移,那么就可以提前执行相应的指令,这样就避免了流水线的空闲等待,相应也就提高了CPU的运算速度。但另一方面一旦前指令结果出来后证明分枝预测错误,那么就必须将已经装入流水线执行的指令和结果全部清除,然后再装入正确指令重新处理,这样就比不进行分枝预测等待结果后再执行新指令还慢了(所以IDT公司的WINC6就没有采用分枝预测技术)。这就好像在外科手术中,一个熟练的护士可以根据手术进展情况来判断医生的需要(象分枝预测)提前将手术器械拿在手上(象推测执行)然后按医生要求递给他,这样可以避免等医生说出要什么,再由护士拿起递给他(医生)的等待时间。当然如果护士判断错误,也必须要放下预先拿的器械再重新拿医生需要的递过去。尽管如此,只要护士经验丰富,判断准确率高,那么当然就可以提高手术进行速度。因此我们可以看出,在以上推测执行时的分枝预测准确性至关重要!所以通过Intel公司技术人员的努力,Pentium和Pentium系列CPU的分枝预测正确率分别达到了80%和90%,这样虽然可能会有20%和10%分枝预测错误但平均以后的结果仍然可以提高CPU的运算速度。 11. 指令特殊扩展技术在介绍CPU性能中还经常提到“扩展指令”或“特殊扩展”一说,这都是指该CPU是否具有对X86指令集进行指令扩展而言。扩展指令中最早出现的是Intel公司自己的“MMX”,其次是AMD公司的“3DNow!”,最后是最近的Pentium 中的“SSE”。MMX MMX是英语“多媒体指令集”的缩写。共有57条指令,是Intel公司第一次对自1985年就定型的X86指令集进行的扩展。MMX主要用于增强CPU对多媒体信息的处理,提高CPU处理3D图形、视频和音频信息能力。但由于只对整数运算进行了优化而没有加强浮点方面的运算能力。所以在3D图形日趋广泛,因特网3D网页应用日趋增多的情况下,MMX业已心有余而力不足了。 3D Now! AMD公司开发的多媒体扩展指令集,共有27条指令,针对MMX指令集没有加强浮点处理能力的弱点,重点提高了AMD公司K6系列CPU对3D图形的处理能力,但由于指令有限,该指令集主要应用于3D游戏,而对其他商业图形应用处理支持不足。SSE SSE是英语“因特网数据流单指令序列扩展/internet Streaming SIMD Extensions”的缩写。它是Intel公司首次应用于最近才推出的Pentium中的。SSE实际就是原来传闻的MMX2后来又叫KNI(Katmai New Instruction),Katmai实际上也就是现在的Pentium。SSE共有70条指令,不但涵括了原MMX和3DNow!指令集中的所有功能,而且特别加强了SIMD浮点处理能力,另外还专门针对目前因特网的日益发展,加强了CPU处理3D网页和其它音、象信息技术处理的能力。 CPU具有特殊扩展指令集后还必须在应用程序的相应支持下才能发挥作用,因此,当目前最先进的Pentium 450和Pentium 450运行同样没有扩展指令支持的应用程序时,它们之间的速度区别并不大。 12. CPU的生产工艺技术我们常可以在CPU性能列表上看到“工艺技术”一项,其中有“0.35m”或“0.25m”等,这些同样是为了说明CPU技术先进程度。一般来说“工艺技术”中的数据越小表明CPU生产技术越先进。 目前生产CPU主要采用CMOS技术。CMOS是英语“互补金属氧化物半导体”的缩写。采用这种技术生产CPU时过程中采用“光刀”加工各种电路和元器件,并采用金属铝沉淀在硅材料上后用“光刀”刻成导线联接各元器件。现在光刻的精度一般用微米(m)表示,精度越高表示生产工艺越先进。因为精度越高则可以在同样体积上的硅材料上生产出更多的元件,所加工出的联接线也越细,这样生产出的CPU工作主频可以做得很高。正因为如此,在只能使用0.65m工艺时生产的第一代Pentium CPU的工作主频只有60/66MHz,在随后生产工艺逐渐发展到0.35m、0.25m时,所以也相应生产出了工作主频高达266MHz的Pentium MMX和主频高达500MHz的Pentium CPU。由于目前科学技术的限制,现在的CPU生产工艺只能达到0.25m,因此Intel、AMD、Cyrix以及其它公司正在向0.18m和铜导线(用金属铜沉淀在硅材料上代替原来的铝)技术努力,估计只要生产工艺达到0.18m后生产出主频为1000MHz的CPU就会是很平常的事。 习 题 11.1 什么是汇编语言?简述汇编语言与高级语言的区别。1.2 在8位微机中,十进制数56的二进制和十六进制的表示是什么?二进制数10110110的十进制和十六进制的表示又是什么?1.3 数值型数据在微机中的表示有哪几种?1.4 衡量CPU的指标有哪些?分别都是从哪些方面来定位的?第二章 8086指令系统 从汇编语言程序设计的角度看,80386及以上的汇编都是以8086汇编为基础,上下兼容。为了后面的WINDOWS汇编的学习,本章详细介绍8086/8088汇编的寻址方式和指令系统,为后面的学习打下基础。2.1 8086/8088寄存器组在8086/8088系统中,程序员可以使用的寄存器有通用寄存器、段寄存器和标志寄存器。这些寄存器中某些有特定的用途,最常用的是通用寄存器。2.1.18086/8088CPU寄存器组8086/8088包括四个16位的数据寄存器,两个16位的指针寄存器,两个16位变址寄存器,一个16位的指令指针,四个16位段寄存器,一个16位标志寄存器。这14个16位寄存器分为四组,他们的名称和分组情况如图所示。AHALAXBHBLBXCHCLCXDHDLDX数据寄存器SP堆栈指针BP基址指针SI源地支DI目的地址指针寄存器变址寄存器IP指令指针FLAG标志寄存器控制寄存器CS代码段DS数据段 SS堆栈段ES附加段段寄存器通用寄存器图2.1 8086 / 088CPU寄存器分组1. 通用寄存器数据寄存器、指针寄存器和变址寄存器统称为通用寄存器。之所以这样称呼,是因为这些寄存器出了各自规定的专门用途外,他们均可以用于传送和暂存数据,还可以保存算术逻辑运算中的操作数和运算结果。1)数据寄存器数据寄存器主要用于保存操作数运算结果等信息,他们的存在节省了为存取操作数所需占用总线和访问存储器的时间。四个16位的数据寄存器AX,BX,CX,DX可分解成八个独立的8位寄存器,这八个8位的寄存器有各自的名称,如图2.1所示,分别称为AH,AL,BH,BL,CH,CL,DH,DL,并且均可以独立存取。名称中的字母H表示高,L表示低。如AH表示高8位,AL表示低8位,AH寄存器和AL寄存器的合并就是AX寄存器。其他寄存器类推。 AX和AL寄存器又成为累加寄存器(Accumulator)。一般通过累加器进行的操作所用的时间可能最少,此外累加器还有许多专门的用途,所以累加器使用的最普遍。BX寄存器成为基(BASE)地址寄存器。他是四个寄存器中唯一可作为存储器指针使用的寄存器。CX寄存器称为计数(COUNT)寄存器。在字符串操作和循环操作时,用它来控制重复循环操作次数。在一位操作时,CL寄存器用于保存移位的位数。DX寄存器称为数据(DATA)寄存器。在进行32位的乘除法操作时,用它存放被除数的高16位或余数。它也用于存放I/O端口地址。2)变址和指针寄存器变址和指针寄存器主要用于存放某个存储单元的偏移地址,或某组存储单元开始地址的偏移,即作为存储器(短)指针使用。作为通用寄存器,它们也可以保存16位算术逻辑运算中的操作数和运算结果,有时运算结果就是需要的存储单元地址的偏移。注意,16位的变址寄存器和指针寄存器不能分解成8位寄存器使用。利用变址寄存器和指针寄存器不仅能够有效的缩短机器指令的长度,而且能够实现多种存储器操作数的寻址,从而方便地实现对多种类型数据的操作。SI和DI寄存器称为变址寄存器。在字符串操作中,规定由SI给出源指针,由DI给出目的指针,所以SI也称为源变址(Source Index)寄存器,DI也称为目的变址(Destination Index)寄存器。当然,SI和DI也可作为一般存储器指针使用。BP和SP寄存器称为指针寄存器。BP主要用于给出堆栈中数据区基址的偏移地址,从而方便的实现直接存取堆栈中的数据,所以BP也称为基指针(Base Pointer)寄存器。正常情况下,SP只作为堆栈指针(Stack Pointer)使用,即保存堆栈栈顶地址的偏移。堆栈是一片存储区域,我们将在后面的章节中详细介绍堆栈操作和堆栈的作用。表2.1 通用寄存器的专门用途寄存器用 途AX字乘法,字除法,字 I/ OAL字节乘法,字节除法,字节I/ O,十进制算术运算AH字节乘法,字节除法BX存储器指针CX串操作或循环控制中的计数器CL移位计数器DX字乘法,字除法,间接I/OSI存储器指针(串操作中的源指针)DI存储器指针(串操作中的目的指针)BP存储器指针(存取堆栈的指针)SP堆栈指针2. 段寄存器 8086/8088CPU依赖其内部的四个段寄存器实现寻址1M字节物理地址空间。8086/8088把1M字节地址空间分成若干逻辑