80x86汇编语言(清华大学经典黑皮书)

所需积分/C币:46 2015-05-27 13:35:27 3.01MB PDF
2
收藏 收藏
举报

80x86汇编语言(清华大学经典黑皮书),没有图片,但是是包含文本信息的pdf文件。可以做检索
算杋要执行的任务;用机器语言编写程序十分繁难,极易山错;旦冇错,也很难发现,也 即凋试困难 2.汇编语言 为了克服机器讦言的上述缺点,人们采用便于记忆、并能描述指令功能的符号来表示 指令的操作码。这些符号被称为指令助记符。助记符一般是说明指令功能的英语词汇或 者词汇的缩写。同吋也用符号表示操作数,如CPU的寄存器、存储单元地址等 用指令助记符、地址符号等符号表示的指令称为汇编格式指令 汇编语言是汇编格式指令、伪指令的集合及其表示、使用这些指令的一组规则。伪指 令的概念留待以后介绍。用汇编语言书写的程序称为汇编语言程序,或称为汇编语言源程 序,或简称为源程序。 利用汇编语言,上述两数相加的程序片断可表示如下: MOV AL VARI ADD AL,VAR2 MOV VAR3, AL 显然,汇编格式指令比二进制编码的机器指令要容易掌握得多,用汇编语言编写的程 序要比用机器语言编写的程序容易理解、调试和维护 3.汇编程序 由于CPU能直接识別的唯一语言是机器语言,所以用汇编语言编写的源程序必须 被翻译成用机器语言表示的目标程序后才能由CPU执行。把汇编语言源程序翻译成目 标程序的过程称为汇编。完成汇编任务的程序叫做汇编程序。汇编过程如图1.1所示 1.2汇编语言的特点 由于汇编语言使用指令助记符和符号地址, 所以它要比机器讦言谷易掌握得多。与高级语言 相比较,汇编语言有如下特点 1.汇编语言与机器关系密切 图1.1汇编过程示意图 因为汇编格式指令是机器指令的符号表小, 所以汇编格式指令与机器有着密切的关系,因此汇编语言也与机器有着密切的关系,确切 地说汇编语言与机器所带的CPU有着十分密切的关系。对于各种不同类型的CPU,要使 用各种不同的汇编语言。于是.对于各种不同类型的CPU,也就有各种不同的汇编程序。 由亍汇编语言与机器关系分密切,所以汇编语言源程序与高级语言源程序相比,它 的通用性和可移植性要差得多。但通过汇编语言可最直接和最有效地控制机器,这常常是 大多数高级语言难以做到的。 2.汇编语言程序效率高 用汇编语言编写的源程序在汇编后所得的目标程序效率髙。这种丨标程序的髙效率 反映在时问和空间两个方面:其一是运行速度快;其二是目标程序短。在采用相同算法的 前提下,任何高级语言程序在这两方面的效率都不如汇编语言程序,许多情况下更是远远 不及。 汇编语言程序能获得“时空”髙效率的主要原因是:构成汇编语言主体的汇编格式指 令是机器指令的符号表小,每一条汇编格式指令都是所对应的某条机器指令的“化身”;另 一个重要原因是汇编语言程序能直接并充分利用机器硬件系统的许多特性。高级语言程 序在上述两点上要逊色得多。 3.编写汇编语言源程序繁琐 编写汇编语言源程序要比编写高级语言源程序繁琐得多。汇编语言是面冋机器的语 言,高级语言是面向过程或面向目标、对象的语言。如下两点突出表现了汇编语言的这 特性 作为机器指令符号化的每一条汇编格式指令所能完成的操作极为有限。例如,Z80指 令集中没有乘法指令,8088指令集中没有能够同时完成两次算术运算的指令。 程序员在利用汇编语言编写程序时,必须考虑包括寄存器、存储单元和寻址方式在内 的几乎所有细节问题。例如:指令执行对标志的影响,堆栈设置的位置等。在使用高级语 言编写程序时,程序员不会遇到这些琐碎却重要的问题。 4.汇编语言程序调试困难 调试汇编语言程序往往要比调试髙级语言程序困难。汇编格式指令的功能有限和程 序员要注意太多的细节问题是造成这种困难的两个客观原因;汇编语言提供给了程序员 最大的“舞台”,而程序员往往为了追求“时空”上的高效率而不顾稈序的结构,这是造成调 试困难的主观原因。 1.1.3恰当地使用汇编语言 1.汇编语言的优缺点 为了恰当地使用汇编语言,我们先明确一下它的优缺点 汇编语言的主要优点是利用它可能编写出在“时空”两个方面最有效率的程序。另外, 通过它可最直接和最有效地操纵机器硬件系统。 汇编语言的主要缺点是它面向机器,与札器关系密切,它要求程序员比较熟悉机器硬 件系统,要考虑许多细节问题,最终导致程序员编写程序繁琐;调试程序困难;维护、交流 和移植程序更困难。 正是由于汇编语言与机器关系密切,才使汇编语言具有其他高级语言所不具备的上 述优点和鈹点。为了利用汇编讦言的优点,必须付出相应的代价。但汇编讦言的每一个优 点常常闪耀出诱人的光芒,使人们勇敢地面对它的缺点。 2.使用汇编语言的场合 根据汇编语言的优缺点,我们要恰当地使用汇编语言,即尽可能地“扬长避短”。是否 利用汇编语言编写程序,要看貝体的应用场合,要允分考虑到软件的开发时间和软件的质 量等诸多方面的因素。我们认为下刎应用场合,可考虑使用汇编语言编写程序 (1)对软件的执行时间或存储容量有较高要求的场合。例如:系统程序的关键核心 智能化仪器仪表的控制系统,实时控制系统等 (2)需要提高大型软件性能的场合。通常把大型软件屮执行频率髙的子程序(过程) 用汇编语言编写,然后把它们与其他程序一起连接。 3)软件与硬件关系密切,软件要有直接和有效控制硬件的场合。如设备驱动程序 (4)没有合适的高级语言的场合。 3.适度地追求“时空”效率 在用汇编语言编写程序时,追求“时空效率要适度。在编写汇编语言程序时,我们要 尽量利用最恰当的指令,以便节约一个字节或节省几个机器周期。但时至今日,计算机硬 件系统的整体性能匚极大地提高,所以,除非不得口,不要为节约少量字节或机器周期而 影响程序的结构性、健壮性和可读性等。要在确保汇编语言程序上述性能良好的前提下追 求“时空”性能。 1.2数据的表示和类型 熟悉数据在计算机內的表示形式是掌握汇编语言程序设计的关键之一。不节简单介 绍数据的表示形式和类型。 计算机中存储信息的最小单位称为位,在绝大数多系统中它只能表示两种状态。这两 种状态可分别代表0和1。计算机系统内部采用二进制表小数值数据,也采用二进制编码 表示‖数值数据和指令,其主要原因就在于此。 1.2.1数值数据的表示 所谓数值数据就是数。这里仅介绍定点整数的有关内容。 1.数的二进制表示 尽管∏常生活中大多采用进制计数,但在计算机内,数却大多采用二进制表示。某 个二进制数bbs…bbb所表示的数值用十进制数来衡量时,可利用如下按权相加的 方法计算得到 bn2+bn2"+…+b2+b12+b2 在书写吋,为了与「进制数相区别,通常在二进制数后加一个字母B 2.有符号数的补码表示 为了方便地表示负数和容易地实现减法操作,有符号数采用补码形式表示。所以,有 符号数二进制表示的最高位是符号位,0表示正数,1表示负数。正数数值的补码形式用 进制表示。为得到一个负数数值的补码形式,方法可以是先得出该负数所对应正数的二进 制形式,然后使正数的每一个二进制位变反,最后再将变反的结果加1。 3.符号扩展 常常需要把一个n位二进制数扩展成m位二进制数(m>n)。当要扩展的数是无符 号数吋,只要在最高位前扩展(m-n)个0。如果要扩展的数是有符号数,并且采用补码形 式表示,那么,就要进行符号位的扩展。 例如,21的8位二进制和16位的二进制补码如下: 0001010 5 0000000000010101 位 例如,-3的8位二进制补码和16位二进制补码如下 111111o1 11ll111ll11l10l 16位 4.数值数据的表示范围 n位二进制数能够表示的无符号整数的范围是: 0≤I≤2-1 采用补码形式表示有符号数。那么n位二进制数能够表示的有符号整数的范围是: 2 (n-1) 所以,如果n是8,那么能够表示的无符号整数的范围是0~255,能够表示的有符号 整数的范围是-128~+127;如果n是16.那么能够表示的无符号整数的范围是0 65535,能够表示的有符号整数的范围是-32768~+32767。 5.BCD码 虽然二进制数实现容易,并且二进制运算规律简单,但不符合人们的使用习惯,书写 阅读都不方便。所以在计算机输入输出吋通常还是采用「进制来表示数,这就需要实现「 进制与二进制间的转换。为了转换方便,常采用二进制编码的十进制,简称为BCD码 Binary Coded Decimal) 表1.1十进制数字的8421BCD码 进制数字 8421BCD码 进制数字 8421BCD码 0000 0101 0001 0010 00l1 56789 0110 0111 1000 4 0100 1001 BCD码就是用4位二进制数编码表示1位十进制数。表示的方法可有多种,常用的 是8421BCD码,它的表示规则如表1.1所示。从表1.1可见,8421BCD码最自然和最简 单。例如,十进制数1996用8421BCD码表示成0001100110010110,每组4位二进制数 之间是二进制的,但组与组之间是十进制的。和十进制数196等值的二进制数是 1111001100。 6.十六进制表示 由于二进制数的基数太小,所以书写和阅读都不够方便。而十六进制数的基数16等 于2的4次幂,于是二进制数与十六进制数之间能方便地转换,也即4位二进制数对应1 位十六进制数,或者1位十六进制数对应4位二进制数。因此,人们常常把二进制数改写 成十六进制数,在汇编语言程序设计过程中尤其如此。 在书写吋,为了区别于|进制数和二进制数,通常在|六进制数后加一个字母H。 1.2.2非数值数据的表示 计算机除了处理数值数据外,还要处理大量的作数值数据,如文字信息和图表信息 等,为此必须对非数值数据进行编码,这样不仅计算机能够方便地处理和存储它们,而且 还可以赋于它们数值数据的某些属性。 1. ASCIL码 美国信息交换标准码( american standard code for information int erchange),简称 为ASCⅡI码,是前国际上比较通用的字符二进制编码,微型计算机中也普遍采用它作 为字符的编码。它是7位二进制编码,表1.2列出了ASCT码。 从表1.2可看到,它对94个常用的一般符号进行了编码,其中包括26个英文字母的 大小写符号、10个数字符号和32个其他符号。空格(SP)也作为一个符号,其编码是2OH, 它界于一般符号和32个控制符之间。码值小于20H的是控制符号,例如,回车符号的码 值是DH,用符号CR表示。所有这些一般符号和控制符统称为字符。从表1.2还可看到, 数字符号的编码、大写字母符号的编码和小写字丹符号的编码分别是连续的,所以只要记 住数字符号的编码从30H开始、大写字母符号的编码从4IH开始和小写字母的编码从 61H开始,那么就可推出其他数字符号和字母符号的编码。 由亍ASCI码只使用了7位二进制进行编码,故最多表示128个字符。这往往不能 满足使用要求。为此在 IBM PC系列及其兼谷机上,使用扩展的 ASCIi码。扩展的ASCI 码使用8位二进制进行编码,可表示256个字符。另外,在该扩展的ASCI码中,控制 符所对应的编码同时也表示其他图形符号。 2.变形国标码 有了 ASCIL码,计算机就能处理数宇、字母等字符,但还不能处理汉字符。为了使计 算机能够处理汉字信息,就必须对汉字进行编码。我国在1981年5月对六干多个常用汉 字制定了交换码的国家标准,即GB2312—80κ信息交换用汉字编码字符集—基本集》。 该标准规定了汉字信息交换用的基本汉字符和一般图形字符,它们共计7445个,其中汉 字分成两级共计6763个。该标准同时也给定了它们的二进制编码,即国标码。 国标码是16位编码,高8位表示汉字符的区号,低8位表示汉字符的位号。实际上, 为了给汉字符编码,该标准把代码表分成94个区,每个区有94个位。区号和位号都从 2H开始。一级汉字安排在30H区至5H区,二级汉字安排在58H区至7H区。例如, “啊”字的国标码是302IH。国标码为汉字的输入提供了一种标准输入方式 表1.2 ASCII码表 000 001 010 011 100 101 110 111 0 4 6 7b 0000 0 0001 a 0010 B QR 000 001 010 011 101 110 111 0 5 0011 C c 0100 4 D T d 0101 5 E U e Ll 0110 6 & 6 F 0001 7 1000 1001 1010 A Z 1011 B K 1100 L 1101 M 1110 E N n 1111 F 目前在计算机中文平台中普遍采用的汉字编码是变形国标码。变形国标码是16位二 进制编码,顾名思义它是国标码的变形。用得最多的变形方法是把国标码的第15位和第 7位均置成Ⅰ,由于国标码中第15位和第7位都是0,所以这种变形方法实际上就是在国 标码上加8080H。 尽管16位的变形国标码与两个扩展的 ASCII码的组合有冲突,但它在相关系统模 块的支持下,有效地实现了汉字在计算机内的表示。 1.2.3基本数据类型 计算机存取的以二进制位表小的信息位数一般是8的倍数,它们有专门的名称 字节 个字节由8个二进制位组成。字节的最低位一般称为第0位,最高位称为第7位, 如图1.2所小。 图1.2一个字节8个位 通常,硬件存储器的每一存储单元就由8个连续的位组成,也即可用于存储一个字节 的信息。 如用一个字节来表示一个无符号数,那么表示范围是0~255;如表示有符号数,则表 示范围是-128~+127。一个字节足以表示一个ASCI字符,也可以表示一个扩展的 A SCII字符 另外,一个字节可分成2个4位的位组,称为半字节 2.字 2个字节(即16个二进制位)组成一个字,如图1.3所小。字的最低位称为第0位,最 高位称为第15位。字的低8位称为低字节,高8位称为高字节。由丁一个字由16个二进 制位组成,所以用一个字来表示无符号数,则表示范围是0~65535;如表示有符号数,则 表示范围是-32768+32767间的有符号数。一个字还可表示一个变形国标码 图1.3一个字含16个位 注意,有吋候字是涉及处理器一次能够处理的信息量的一个术语,字长是衡量处理器 品质的一个重要指标。 3.双字 就和听起来一样,双字由2个字组成,也即包含32个二进制位。低16位称为低字,高 16位称为高字。双字能表示的数的范围更大 4.四字 四字就是由四个字组成,包含64个二进制位。如果双字还不能表达所需要的数值精 度,那么四字也许就能解决问题了。 5.十字节 十字节就和它的名称一样,由10个字节组成,含80个二进制位。可用于存储‖常大 的数或表示较多的信息。 6.字符串 字符串是指由字符构成的一个线性数组。通常每个字用一个字节表示,但有时每个 字符也可用一个字或一个双字来表小。 1.3 Intel系列CPU简介 汇编语言与CPU关系密切。本节从汇编语言程序设计的角度对 Intel系列CPU作一 简单介绍。 1.3.18位微处理器 1971年ntel开发出了第一代微处埋器4004,它是一个4位的微处埋器,白身含有计 算和逻辑功能。它由2250个MOS晶体管构成,每秒内能够执行约6万次操作。含有一个 累加器,16个用作暂存数据的寄存器。可寻址640字节的内存。指令集含有45条指令。 4004作为一般处理器來讲,功能还不够强,只能作为计算器的核心来使用。但它是一种新 思想的第一代产物。 1972年 Intel公司推出了第一块8位微处理器8008。它由约3300个MOS晶体管构 成。由于尢论是指令执行的数据还是译码数据,以及操作数都能按8位处理,所以它比 4004要快,每秒内执行的操作可超过8万次。它含有7个8位寄存器,可寻址16K的内 存。具有48条指令组成的指令集,但与4004的指令集不兼谷 1974年 Int cl公司乂推出了为多种应用而设计的8位微处理器8080,它是 Intel的第 二代微处理器,也是第一个通用的微处理器。它的功能相当强,足以作为微计算机的核心。 它由6000多个晶体管构成,每秒能执行约60万次操作。寻址能力达到64K。8080的指令 集包含了8008的指令集,从而获得与8008指令集的兼容性,此外还增加了20多条指令。 8080为 Intel公司成为当今CPU的霸主打下了坚实的基础。 1976年 Intel公司公布了8080的变种8080A,此后还公布了作为8080A增强型的 8085。 1.3.216位微处理器 1978年Inηtel公司率先推出了第三代微处埋器即16位微处埋器8086。有两个关键的 结构概念使微处理器设计定型且从8086开始施行,这两个穊念是存储器分段和指令译码 表。 Intel的x86家族也由此开始。 1. Intel 8086 8086内部分成如图1.4所示的两部分:总线接口部件BIU( Bus interface unit)和 执行部件EU( Execution Unit)。 图1.48086的两个组成部分 总线接口部件BIU包括一组段寄存器、一个指令指示器、指令队列(长6个字节)、地 址产生器和总线控制器等。BIU根据执行部件EU的请求,完成CPU与存储器或ⅣO设 备之问的数据传送。在EU执行指令的过程中,BIU根据需要从存储器中预先取出一些指 令,保存到指令队列中。如果EU执行一条转移指令,使程序发生转移,那么存放在指令队

...展开详情
试读 127P 80x86汇编语言(清华大学经典黑皮书)
立即下载 低至0.43元/次 身份认证VIP会员低至7折
抢沙发
一个资源只可评论一次,评论内容不能少于5个字
上传资源赚积分or赚钱
    最新推荐
    80x86汇编语言(清华大学经典黑皮书) 46积分/C币 立即下载
    1/127
    80x86汇编语言(清华大学经典黑皮书)第1页
    80x86汇编语言(清华大学经典黑皮书)第2页
    80x86汇编语言(清华大学经典黑皮书)第3页
    80x86汇编语言(清华大学经典黑皮书)第4页
    80x86汇编语言(清华大学经典黑皮书)第5页
    80x86汇编语言(清华大学经典黑皮书)第6页
    80x86汇编语言(清华大学经典黑皮书)第7页
    80x86汇编语言(清华大学经典黑皮书)第8页
    80x86汇编语言(清华大学经典黑皮书)第9页
    80x86汇编语言(清华大学经典黑皮书)第10页
    80x86汇编语言(清华大学经典黑皮书)第11页
    80x86汇编语言(清华大学经典黑皮书)第12页
    80x86汇编语言(清华大学经典黑皮书)第13页
    80x86汇编语言(清华大学经典黑皮书)第14页
    80x86汇编语言(清华大学经典黑皮书)第15页
    80x86汇编语言(清华大学经典黑皮书)第16页
    80x86汇编语言(清华大学经典黑皮书)第17页
    80x86汇编语言(清华大学经典黑皮书)第18页
    80x86汇编语言(清华大学经典黑皮书)第19页
    80x86汇编语言(清华大学经典黑皮书)第20页

    试读结束, 可继续阅读

    46积分/C币 立即下载 >