汇编语言程序设计教程.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《汇编语言程序设计教程.doc》由会员分享,可在线阅读,更多相关《汇编语言程序设计教程.doc(193页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流汇编语言程序设计教程.精品文档.西华师范大学计算机学院自编教材汇编语言程序设计教程贺春林、赖晓风、王朝斌、高建清编著钟乐海、潘 伟 赵玉萍赵 西华师范大学计算机学院二00六年三月前 言汇编语言是面向机器的低级语言,通过学习汇编语言,才能真正理解计算机的工作原理和工作过程,才能深入地了解高级语言的一些概念。应用汇编语言,程序员可以直接操纵计算机的硬件,用汇编语言,才能编写出运行速度快、占有空间小的高效程序。即便是在高级语言功能非常强大的今天,一些程序设计语言不断被淘汰,新的优秀的编程语言不断出现,汇编语言仍然处于重要地位,发挥着它的重要作用,并
2、且不能由其它语言所替代。“汇编语言程序设计”,是计算机各专业的一门重要基础课,也必修的核心课程之一,它是“操作系统”和“微机原理与接口技术”等其它核心课程的先修课。计算机技术在发展,汇编语言也在发展,汇编语言教学也需要发展和改革,为了适应计算机技术应用的发展和变化,为了适应计算机应用型本科和专科教学改革的要求,根据我们对“汇编语言程序设计”课程教学的体会,组织编写了这本“汇编语言程序设计教程”。其指导思想是着重于基本概念、指令和基本程序设计;对输入输出、DOS功能调用、中断等程序设计,以及32位汇编程序设计,只要求学生能够理解或者有所了解,为后续的课程打下基础,以适应少学时的教学要求。本书以I
3、ntel 80x86指令系统和MASM 6.x为主体,全面而系统地介绍16/32位整数、浮点、多媒体指令的汇编语言程序设计方法。全书可分为基础和提高两部分。前4章作为基础部分,以当前“汇编语言程序设计”课程的教学为目标,为读者讲解16位基本整数指令及其汇编语言程序设计的知识。基础部分的主要内容是:汇编语言程序设计的基础知识、8086指令详解、MASM伪指令和操作符、程序格式、程序结构及其设计方法。提高部分的后5章,从不同的方面介绍了汇编语言程序设计的深入内容和实际应用知识。提高部分各章的内容相对独立,主要有:32位80x86 CPU的整数指令系统及其编程、汇编语言与C/C+的混合编程、80x8
4、7 FPU的浮点指令系统及其编程、多媒体扩展MMX指令系统和SSE指令系统。本书各章配有丰富的习题和详细的上机指导,附录提供了Debug、PWB和CodeView开发工具的使用说明。 本书可选作高等院校汇编语言程序设计课程的教材或参考书,主要读者为计算机及相关学科的本、专科学生。由于本书具有内容广博、语言浅显、结构清晰、实例丰富等特点,所以本书的适应面非常广泛,例如电子、自动控制等专业的高校学生和成教学生,计算机应用开发人员,深入学习微机应用技术的普通读者等。本书可以作为计算机专业本科及专科汇编语言课程的教材或参考书,也可以作为Windows程序设计人员的参考书,还可以作为其它高级语言程序设计
5、人员的参考书。由于作者水平有限,书中难免有错误和不妥之处,恳请读者给予指正和提出修改意见。第1章 绪论1.1 汇编语言概述1.1.1 汇编语言按照确定的算法解决具体问题所必须的指令序列称为程序,它是由数据、指令和字符等构成的,在执行前应预先将它们以二进制代码形式存储在存储单元中。 所谓指令是指控制计算机执行某一特定操作的命令。而一台计算机所能识别的指令的全体称为指令系统,它反映计算机基本功能的强弱。机器指令是以二进制代码形式表示的,能直接为计算机识别而执行的命令,它通常由操作码和操作数两部分组成。8086/8088指令系统有约100多条基本指令。汇编语言是一种面向机器的语言,汇编语言的指令与机
6、器指令是一一对应的。它用符号、文字来表示指令,所以它又称符号语言。用汇编语言编写的程序是不能被计算机直接识别和执行的(如同用高级语言编写的程序),它需要翻译成目标程序后方可执行,这个过程我们称为汇编。汇编语言虽然没有高级语言在使用上简单方便,但因它与机器语言是一一对应的,故可充分利用计算机硬件系统的特性,提高编程技巧和编程质量。另外,利用汇编语言处理I/O设备是汇编语言的独到之处,所以它是无法为其他语言所取代的。汇编程序的类型有:自汇编程序、交叉汇编程序、微汇编程序、浮动汇编程序和宏汇编程序。汇编语言(ASM)虽然较机器语言在阅读、记忆及编写方面都前进了一大步,但对描述任务、编程设计仍感不便,
7、于是产生了具有机器语言优点,而又能较好地面向问题的语言,即宏汇编语言(MASM)。宏汇编语言不仅包含一般汇编语言的功能,而且用了高级语言使用的数据结构,是一种接近高级语言的汇编语言。例如它提供了记录、结构和字符串操作;具有宏处理、条件汇编及磁盘操作系统DOS功能调用等多种功能;程序的开发以及调试手段也比较完善,因而宏汇编语言是一种更高级的汇编语言。1.1.2 汇编语言的特点由于汇编语言使用指令助记符和符号地址,所以他要比机器语言容易掌握得多。与高级语言相比,汇编语言具有以下特点:(1)汇编语言与及其关系密切(2)汇编语言程序效率高(3)编写汇编语言源程序繁琐(4)汇编语言程序调试困难1.1.3
8、 汇编语言的主要应用场合:(1)程序执行占用较短的时间,或者占用较小存储容量的场合。 (2)程序与计算机硬件密切相关,程序直接控制硬件的场合。 (3)需提高大型软件性能的场合。 (4)没有合适的高级语言的场合。 1.2数据表示和类型1.2.1 进位计数制以及不同计数制间的相互的转换在日常生活中我们所用的是十进制数,但在计算机中我们用的是二进制数,作为汇编语言程序设计对二进制数与十进制数的转换是必不可少的。1. 各种进位计数制 表1.1 二、八、十和十六进制数码的对照关系表十进制二进制八进制十六进制0000101112102231133410044510155611066711177810001
9、089100111910101012A11101113B12110014C13110115D14111016E15111117F16100002010(1)十进制数 十进制数就是我们在日常生活中所用的数,它共有0,1,2,3,4,5,6,7,8,9这十个数码,它的计数方法是“逢十进一”。对于十进制数的运算大家应该都知道,这里就不多说了。 (2)二进制数二进制数是最简单的进位计数制,它只有0,1二个数码,计数方法是“逢二进一”。二进制数的运算十分简单,加法是“逢二进一”,减法是“借一当二”。例如“11+10=101;101-10=11”至于乘法和除法和我们日常相似,只不过不是“逢十进一”而是“逢
10、二进一”罢了。 (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.375
11、0,则在右边记下整数位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
12、(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,
13、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补。我们现在虽然有了公式和口诀,但是还有符号位的问
14、题没有解决,而另一个口诀可以解决这个问题。口诀是符号位参加运算,符号位相加,若有进位,则进位舍去。如:63H-72H=63H+8EH=0F1H(用十六进制时最高位为字母时前加0)。注意:运算有时会产生溢出,如57+81127。当我们用N=8的补码运算就会溢出,因为当字长N=8时补码的表示范围是 -128,127。 3. 反码反码的定义为:所能表示数的范围为:例: 根据X(反)所能表示的整数范围公式,我们可以计算出当n=8时反码表示范围是 -127,127。 1.2.3 数的定点和浮点表示法在计算机中,针对小数点的处理有两种方法:定点表示法浮点表示法。1. 定点表示法定点表示法就是小数点固定在某
15、个位置上。在定点计算机中,为了简单通常将小数点定在最高位(即纯小数)或将小数点定在最低位(即整数)。2. 浮点表示法浮点表示法就是小数点的位置并不固。浮点数在计算机中通常的表示形式为浮点数=2的正/负阶码次方*尾数其中阶码是个正整数,尾数是个小数,我们规定尾数的区间为0.5,1,如果尾数不在此区间,那我们可通过调节阶码来满足区间,此方法称为规格化。 1.2.4 BCD码和字符编码 在日常生活中人们用的是十进制数,而机器又只能处理二进制数,因此我们引进了BCD码。BCD码是用四位的二进制数来表示一位十进制数(可参照下表)。例子:我现在将8351表示成BCD码为1000 0011 0101 000
16、1。当用一个字节来表示十进制数时,称为非压缩的BCD码。例如6可表示为00000110。当用一个字节表示二个十进制数时,称为压缩的BCD码。例如79可表示为01111001。除了数值数据外,计算机还可处理人们常用的符号,如字母,标点符号等。在计算机中这些符号是用ASCII码来表示的。ASCII码用一个字节的二进制数来表示一个字符,但实际只用了七位,最高位被用来做奇偶校验位。这一位置1或0,使字节含1的个数为奇数(或偶数)称为奇校验或偶校验。如表1.2十进制数与BCD码对换关系表。表1.2 十进制数与BCD码对换关系表十进制数BCD码十进制数BCD码00000501011000160110200
17、1070111300118100040100910011.3 Intel 系列CPU简介1.3.1 Intel系列CPU简介由于汇编语言与CPU关系密切,所以先对Intel系列80x86的CPU做一下简单介绍。CPU是Central Processing Unit中央处理器的缩写,它是计算机中最重要的一个部分,由运算器和控制器组成,如果把计算机比作一个人,那么CPU就是他的心脏,其重要作用由此可见一斑。不管什么样的CPU, 其内部结构归纳起来可以分为控制单元、逻辑单元和存储单元三大部分,这三个部分相互协调,便可以进行分析、判断、运算并控制计算机各部分协调工作。CPU从最初发展至今已经有二十多年
18、的历史了,这期间,按照其处理信息的字长,CPU可以分为:四位微处理器、八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器等等。1971年,早期的Intel公司推出了世界上第一台微处理器4004,这便是第一个用于计算机的四位微处理器, 它包含2300个晶体管,由于性能很差,其市场反应十分不理想。随后,Intel公司又研制出了8080处理器、8085处理器,加上当时Motorola公司的MC6800微处理器和Zilog 公司的Z80微处理器,一起组成了八位微处理器的家族。 十六位微处理器的典型产品是Intel公司的8086微处理器,以及同时生产出的数学协处理器,即8087。这两 种
19、芯片使用互相兼容的指令集,但在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机的第一代CP
20、U便是从它开始的。1982年的80286芯片虽然是16位芯片,但是其内部已包含13.4万个晶体管,时钟频率也达到了前所未有的20MHz。其内、外部数据总线均为16位,地址总线为24位,可以使用16MB内存,可使用的工作方式包括实模式和保护模式两种。三十二位微处理器的代表产品首推Intel公司1985年推出的80386,这是一种全三十二位微处理器芯片,也是X86家族中第一款三十二位芯片,其内部包含27.5万个晶体管,时钟频率为12.5MHz,后逐步提高到33MHz。8 0386的内部和外部数据总线都是32位,地址总线也是32位,可以寻址到4GB内存。它除了具有实模式和保护模式 以外,还增加了一种
21、虚拟86的工作方式,可以通过同时模拟多个8086处理器来提供多任务能力。1989年Intel公司又推出准三十二位处理器芯片80386SX。它的内部数据总线为三十二位,与80386相同,外部数据总线为十六 位。也就是说,80386SX的内部处理速度与80386接近,也支持真正的多任务操作,而它又可以接受为80286开发 输入/输出接口芯片。80386SX的性能优于80286,而价格只是80386的三分之一。386处理器没有内置协处理器,因此不能执行浮点运算指令,如果您需要进行浮点运算时,必须额外购买昂贵的80387协处理器芯片。 八十年代末九十年代初,80486处理器面市,它集成了120万个晶体
22、管,时钟频率由25MHz逐步提升到50MHz 。80486是将80386和数学协处理器80387以及一个8KB的高速缓存集成在一个芯片内,并在X86系列中首次使用了 RISC(精简指令集)技术,可以在一个时钟周期内执行一条指令。它还采用了突发总线方式,大大提高了与内 存的数据交换速度,由于这些改进,80486的性能比带有80387协处理器的80386提高了4倍。早期的486分为有协 处理器的486DX和无协处理器的486SX两种,其价格也相差许多。随着芯片技术的不断发展,CPU的频率越来越快 ,而PC机外部设备受工艺限制,能够承受的工作频率有限,这就阻碍了CPU主频的进一步提高,在这种情况下,
23、 出现了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。在200
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 教程
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内