第1章 汇编语言基础知识_第1页
第1章 汇编语言基础知识_第2页
第1章 汇编语言基础知识_第3页
第1章 汇编语言基础知识_第4页
第1章 汇编语言基础知识_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、23第1章 汇编语言基础知识第1章 汇编语言基础知识本章介绍学习汇编语言程序设计所必须具备的基本知识,主要包括汇编语言的基本概念及计算机中数据的表示方法。通过本章的学习,读者应能了解汇编语言概念及其使用的进位计数制、不同进位计数制之间的转换、计算机编码以及基本数据类型。本章内容要点:& 汇编语言的概念& 汇编语言的特点& 不同进位计数制之间的转换& 计算机编码1.1 汇编语言概述1.1.1 汇编语言基本概念自然语言是具有特定语音和语法等规范的、用于人类表达思想并实现相互交流的工具。人与人之间只有使用同一种语言才能进行直接交流,否则就必须通过翻译。要使计算机为人类

2、服务,人们就必须借助某种工具,告诉计算机“做什么”甚至“怎么做”,这种工具就是程序设计语言。程序设计语言通常分为三类:机器语言、汇编语言和高级语言。而前两种语言与机器密切相关,统称为低级语言。1机器语言机器语言是计算机第一代语言,它全部由0、1代码组成,是能够直接被机器所接受的语言,是最底层的计算机语言。机器语言不容易记忆,程序编写难度大,调试修改繁琐,且不易移植,现在程序员很少用。但机器语言执行速度最快,它是一种面向机器的程序设计语言。2汇编语言为了克服机器语言难以记忆、表达和阅读的缺点,人们采用具有一定含义的符号作为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令(或汇编指令

3、)。例如,用add表示加法指令,sub表示减法指令,mov表示传送指令等。汇编语言是汇编指令集、伪指令集和使用它们规则的统称。伪指令的概念将在第4章介绍。汇编语言比机器语言直观,容易记忆和理解,用汇编语言编写的程序也比机器语言程序易读、易检查、易修改。对于不同的计算机,针对同一问题所编写的汇编语言源程序是互不通用的。用汇编语言编写的程序执行效率比较高,但通用性与可移植性仍然比较差。计算机不能直接识别用汇编语言编写的程序,必须由一种专门翻译程序将汇编语言程序翻译成机器语言程序,计算机才能执行。例如,在8086机器下,分别用汇编语言和机器语言计算10+20的程序代码如下: 汇编语言 机器语言 mo

4、v al,10 b0 0a add al,20 04 14显然,使用汇编语言编写的程序要比机器语言更容易理解。3高级语言机器语言和汇编语言以外的程序设计语言统称高级语言。其特点是更加接近自然语言和惯用的数学表达形式,与计算机硬件结构无关,因而便于使用,便于交流和推广。例如,可以在程序中直接使用表达式10+20。目前,常用的高级语言数十种,如c、c+、pascal、basic、java等。高级语言可分成编译型和解释型高级语言,需要分别使用编译程序和解释程序将源程序翻译成机器语言程序,才能交计算机执行。总之,高级语言编程效率高,但运行效率低。1.1.2 汇编语言的特点汇编语言相对机器语言而言好记好

5、用,但远不如高级语言方便、实用,而且编写同样的程序,使用汇编语言比使用高级语言花费的时间更多,调试和维护更困难,在计算机速度大大提高和存储器容量大大增加的今天,高级语言的使用更为广泛和普遍(特别是编写大型程序)。既然如此,为什么还要使用汇编语言呢?主要有两个原因:性能和对计算机的完全控制。一般而言,汇编语言具有如下特点:(1)执行速度快一个汇编语言程序,要比高级语言程序执行得更快。程序的执行速度对于某些应用来说是至关重要的。对于这些应用,单纯使用高级语言往往达不到要求,单纯使用汇编语言编写程序也并不是最好的方案,许多成功的大型应用程序往往使用的是混合编程。首先使用高级语言编写整个程序,然后测试

6、程序的执行时间,再使用汇编语言重写其中最费时间的部分。这样做的依据是在实际使用中,通常程序的大部分执行时间都花费在一小部分代码上。例如编写图像处理程序,就往往使用汇编语言编写软件中的关键部分。(2)程序短小一个汇编语言程序,要比高级语言程序更小。在某些情况下,设备中的嵌入式处理器往往只有很少的内存,使用汇编语言可能是唯一的方法。如智能卡中有cpu,但是智能卡中很难有1mb以上的内存,也不可能有带分页的硬盘,但智能卡又必须执行复杂的加密解密计算。个人数字助理(pda)和其他使用电池作为能源的无线电子设备,为了节省电池的电力,往往也只有很少的内存,它们也需要使用短小精悍而且具有高效率的机器代码。(

7、3)可以直接控制硬件某些应用程序要求能够完全控制计算机硬件,这也必须使用汇编语言。如操作系统中的低级中断和陷阱处理程序以及许多嵌入式实时系统中的设备控制程序都属于这一类应用。(4)可以方便地编译编译器可以产生供编程者使用的汇编程序或者自己执行汇编过程。因此,为了理解编译器的工作原理,必须首先理解汇编语言。(5)辅助计算机工作者掌握计算机体系结构研究汇编语言可以使人们清楚实际计算机结构。特别是对于学习计算机体系结构的学生,编写汇编语言是在结构层理解计算机的唯一途径。(6)程序编制耗时,可读性差用汇编语言编制程序十分费时,而且程序的质量直接受到程序员技术水平的影响,程序的可读性也很差。就如前面所举

8、的加法计算的例子,用高级语言编程只需写一条加法表达式,简单明了,极其直观。而用汇编语言编程则需写出两条指令,这些指令都是些对硬件的操作,因此程序的可读性很差。(7)程序可移植性差由于汇编语言是面向硬件的,所以用汇编语言编制的程序可移植性很差。显而易见,不同的cpu都有相互独立的指令系统,相互间无任何关系,就算是使用同一系列cpu的机器,因其外围硬件可能有差别,这也会使相同的程序在不同的机器上无法通用。不难看出,汇编语言存在很多的弱点,但由于它具有一些高级语言所不具备的突出优点,所以汇编语言的应用范围还是很广的。特别是当用户需要研究计算机具体的工作原理的时候,还必须要掌握汇编语言。1.2 进位计

9、数制及其转换计算机内部的信息分为两大类:控制信息和数据信息。控制信息是一系列的控制命令,用于指挥计算机如何操作;数据信息是计算机操作的对象,一般又可分为数值数据和非数值数据。数值数据用于表示数量的大小,它有确定的数值;非数值数据没有确定的数值,它主要包括字符、汉字和逻辑数据等等。对计算机而言,不论是控制命令还是数据,它们都要用“0”和“1”两个基本符号即基2码来编码表示,这是由于以下三个原因:(1)基2码在物理上最容易实现。例如,用高、低两个电位表示“1”和“0”,或用脉冲的有、无表示“1”和“0”,用脉冲的正、负极性表示“1”和“0”等等,可靠性都较高。(2)基2码用来表示二进制数,其编码及

10、加减运算规则简单。(3)基2码的两个符号“1”和“0”正好与逻辑数据“真”与“假”相对应,为计算机实现逻辑运算带来了方便。因此,不论是什么信息,在输入计算机内部时,都必须用基2码编码表示,以方便存储、传送和处理。1.2.1 数与数制1数的表示 进位计数制是一种计数的方法。在日常生活中,人们使用各种进位计数制,如六十进制(1小时=60分,1分=60秒),十二进制(1英尺=12英寸,1年=12月)等。但人们最熟悉和最常用的是十进制计数。按进位的原则进行计数叫进位计数制,简称数制。每种数制都有其基数和各数位的位权。基数是指该数制中允许选用的基本数码的个数。每个数码所表示的数值等于该数码乘以一个与数码

11、所在位置有关的常数,这个常数叫位权,位权的大小是以基数为底,数码所在位置的序号为指数的整数次幂。在汇编语言中常用的进位计数制有:二进制、八进制、十进制和十六进制,其基数、数码和进位关系如表1-1所示。表1-1 几种常用的进位计数制的基数、数码和进位关系计数制基数数 码进位关系二进制20、1逢二进一八进制80、1、2、3、4、5、6、7逢八进一十进制100、1、2、3、4、5、6、7、8、9逢十进一十六进制160、1、2、3、4、5、6、7、8、9a、b、c、d、e、f逢十六进一在十进制数中,个位的位权为100,十位的位权为101,百位的位权为102,千位的位权为103,而在小数点后第一位上的位

12、权为101,小数点后第二位的位权为102等等。因此,如果有十进制数123.45,则百位上的1表示1个100,十位上的2表示2个10,个位上的3表示3个1,小数点后第一位上的4表示4个0.1,小数点后第二位上的5表示5个0.01,用位权表示成:(123.45)10 =1×102+2×101+3×100+4×10-1+5×10-2同理,任意一个二进制数、八进制数和十六进制数也可用位权表示。例如:(101.01)2=1×22+0×21+1×20+0×2-1+1×2-2(125.46)8 =1×

13、;82+2×81+5×80+4×81+6×82(ad.5f)16 =a×161+d×160+5×161+f×162据上述概念,可推广出表示任意进制数的通式:n=±ri=±(ri +ri)其中ri为整数部分,ri为小数部分。r为基数,每一项的数字可用0r-1数字中的一个数字来表示。2计数制的书写规则为了区别不同的计数制,可采用下列两种方法:(1)在数字后面加写相应的英文字母作为标识,英文字母不分大小写。本书约定采用大写字母形式。如:1100011b。b后缀表示为二进制数(binary)。2357o

14、。o后缀表示为八进制数(octal)。由于英文字母o容易和零误会,所以也可以用q来表示八进制。1000d。d后缀表示为十进制数(decimal)。3ab5h。h后缀表示为十六进制数(hexadecimal)。如果记数符号a,b,c,d,e,f打头,头部应加0,如0a8f5h;记数符号 a,b,c,d,e,f不区别大小写,与abcdef等效。缺省后缀时,一般约定为十进制数。(2)在括号外面加数字下标。如:(1011)2表示二进制数的1011 (2df2)16表示十六进制数的2df2 1.2.2 不同数制之间的转换1十进制数与二进制数之间的转换(1)十进制整数转换成二进制整数方法:除2取余法注意:

15、第一次得到的余数为二进制数的最低位,最后得到的余数为二进制数的最高位。例1.1 将十进制数97转换成二进制数。其过程如下:297余数为1,余数为0,余数为0,余数为0,余数为0,余数为1,余数为1,余数为0248224212262321商为0即a0=1即a1=0即a2=0即a3=0即a4=0即a5=1即a6=1结束最后结果为:(97)10 =(a6 a5 a4 a3 a2 a1 a0)2=(1100001)2(2)十进制小数转换成二进制小数方法:乘2取整法注意:最后将每次得到的整数部分(必定是0或1)按先后顺序从左到右排列即得到所对应二进制小数。例1.2 将十进制小数0.8125转换成二进制小

16、数。其过程如下:0.8125× 2 1.6250整数部分为1,即a1=1 0.6250余下的小数部分× 2 1.2500整数部分为1,即a2=10.2500余下的小数部分× 2 0.5000整数部分为0,即a3=00.5000余下的小数部分× 2 1.0000整数部分为1,即a4=10.0000余下的小数部分为0,结束最后结果为:(0.8125)10=(0.a1a2a3a4) 2 =(0.1101)2(3)一般的十进制数转换成二进制数为了将一个既有整数又有小数部分的十进制数转换成二进制数,可以将其整数部分和小数部分分别进行转换,然后再组合起来。例1.3

17、将(97.8125)10转换成二进制数。其过程如下:(97)10=(1100001)2 (0.8125)10=(0.1101)2 由此可得:(97.8125)10 =(1100001.1101)2 (4)二进制数转换十进制数方法:按位权展开后相加。注意:用其各位所对应的系数,按“位权展开求和”的方法就可以得到,其基数为2。例1.4 将(101.11)2转换成十进制数。其过程如下:(101.11)2=1×22+0×21+1×20+1×21+1×22 =4+0+1+0.5+0.25 =(5.75)102. 十进制与八进制之间的转换(1)十进制整数转

18、换成八进制整数方法:除8取余法。注意:采用基数8连续去除该十进制整数,直至商等于“0”为止,然后逆序排列所得到的余数。例1.5 将十进制数97转换成八进制数。其过程如下: 8 97 余数为1, 即a0=1 8 12 余数为4, 即a1=4 8 1 余数为1, 即a2=1 0 余数为0, 结束 最后结果为:(97)10(a2 a1 a0) 8=(141)8(2)十进制小数转换成八进制小数方法:乘8取整法。注意:连续用基数8去乘以该十进制小数,直至乘积的小数部分等于“0”,然后顺序排列每次乘积的整数部分。例1.6 将十进制小数0.6875转换成八进制小数。其过程如下: 0.6875× 8

19、 5000 整数部分为5,即a 1=5 0.5000 余下的小数部分× 8 4.0000 整数部分为4,即a 2=4 0.0000 余下的小数部分为0,结束最后结果为: (0.6875)10 =(0.a1a2)8=(0.54)8(3)八进制数转换成十进制数方法:按位权展开后相加。用其各位所对应的系数,按“位权展开求和”的方法就可以得到,其基数为8。例1.7 将(141.54)8转换为十进制数。其过程如下:(141.54)8=1×82+4×81+1×80+5×81+4×82=64+32+1+0.625+0.0625=97.6875最后结

20、果为:(141.54)8 =(97.6875)103. 十进制与十六进制之间的转换(1)十进制整数转换成十六进制整数方法:除16取余法。注意:采用基数16连续去除该十进制整数,直至商等于“0”为止,然后逆序排列所得到的余数。例1.8 将十进制整数(2347)10转换为十六进制整数,采用“除16倒取余”的方法,过程如下:16 2347 余数为11, 即a0=b(十六进制数为b) 16 146 余数为2, 即a1=2 16 9 余数为9, 即a2=9 0 余数为0, 结束最后结果为:(2347)10(a2 a1 a0)16=(92b)16(2) 十进制小数转换成十六进制小数方法:乘16取整法。注意

21、:连续用基数16去乘以该十进制小数,直至乘积的小数部分等于“0”,然后顺序排列每次乘积的整数部分。例1.9 将十进制小数0.6875转换成十六进制小数。其过程如下:0.6875× 16 11.0000 整数部分为11,即a1=b0.0000 余下的小数部分为0,结束最后结果为:(0.6875)10 =(0.a1)16 =(0.b)16(3)十六进制数转换十进制数方法:按位权展开后相加。注意:用其各位所对应的系数,按“位权展开求和”的方法就可以得到,其基数为16。例1.10 将(92b.b)16转换成十进制数。其过程如下:(92b.b)16=9×162+2×161+

22、b×160+b×161=9×162+2×161+11×160+11×161=2347.6875最后结果为:(92b.b)16=(2347.6875)104. 二进制与八进制、十六进制数之间的转换因为:23=8,所以每三位二进制数对应一位八进制数;24=16,所以每四位二进制数对应一位十六进制。表1-2列出了十进制、二进制、八进制、十六进制最基本的数字的对应关系。这些对应关系在后面的二进制、八进制、十六进制相互转换中要经常用到。(1)二进制数转换成八进制数从小数点所在位置分别向左向右每三位一组进行划分。若小数点左侧的位数不是3的整数倍,

23、在数的最左侧补零;若小数点右侧的位数不是3的整数倍,在数的最右侧补零。然后参照表1-2,将每三位二进制数转换成对应的一位八进制数,即为二进制数对应的八进制数。表1-2 十、二、八、十六进制数码的对应关系 十进制二进制八进制十六进制00000001000111200102230011334010044501015560110667011177810001089100111910101012a11101113b12110014c13110115d14111016e15111117f例1.11 将(11010.11)2转换为八进制数。其过程如下:011 010. 1103 2.6所以 (11110.

24、11)2 =(32.6)8(2)八进制数转换成二进制数方法:参照表1-2,将每一位八进制数转换成对应的三位二进制数,即为八进制数对应的二进制数。例1.12 将(34.6)8转换为二进制数。其过程如下:3 4. 6011 100. 110所以(34.6)8=(11100.11)2 (3)二进制数转换成十六进制数从小数点所在位置分别向左向右每四位一组进行划分。若小数点左侧的位数不是4的整数倍,在数的最左侧补零;若小数点右侧的位数不是4的整数倍,在数的最右侧补零。然后参照表1-2,将每四位二进制数转换成对应的一位十六进制数,即为二进制数对应的十六进制数。例1.13 将(1011110.11)2转换为

25、十六进制数。其过程如下:01011110.1100 5 e . c所以(1011110.11)2=(5e.c) 16 (4) 十六进制数转换成二进制数方法:参照表1-2,将每一位十六进制数转换成对应的四位二进制数,即为十六进制数对应的二进制数。例1.14 将(e8.c) 16转换为二进制数。其过程如下:e 8 c1110 1000 1100所以(e8.c) 16=(11101000.11)2八进制数和十六进制数主要用来简化二进制数的书写,因为具有23=8,24=16的关系,故使用八进制数和十六进制数表示的二进制数较短,便于记忆。ibmpc机中主要使用十六进制数表示二进制数和编码,所以必须十分熟

26、悉二进制数与十六进制数的对应关系。1.3 计算机中数与字符的表示方法计算机中数值型数据是用二进制数来表示的,而非数值型数据包括英文字母、标点符号、专用符号、汉字等,也是用二进制数来编码的。1.3.1 数值型数据的编码1. 二进制数的编码及运算我们很容易想到,数据的正负号可用一位二进制的0和1两个状态来表示,这样,二进制数值数据在计算机中就能方便表示了。为了尽可能地简化对二进制数值数据进行算术运算用到的规则,机器将二进制数值数据进行编码表示。 常用的编码有原码、反码和补码。由于补码编码有许多优点,大多数微机采用了补码编码,所以我们着重介绍补码编码表示法。为了讨论方便,有必要引入两个概念:机器数和

27、机器数的真值。l 机器数:带符号的二进制数值数据在计算机内部的编码。l 真值:机器数所代表的实际值。一般机器数的最高有效位用来表示数的正负符号,0表示正数,1表示负数。(1)二进制数原码编码正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。用这样的表示方法得到的就是数的原码。例1.15 当机器字长为8位二进制数时: x1011011 x原码01011011 y1011011 y原码11011011 1原码00000001 1原码10000001 127原码01111111 127原码11111111原码表示的整数范围是: (2n-11)(2n-11),其中n为机器字长。

28、则:8位二进制原码表示的整数范围是127127,16位二进制原码表示的整数范围是3276732767。(2)二进制数反码编码对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。例1.16 当机器字长为8位二进制数时:x1011011 x原码01011011 x反码01011011y1011011 y原码11011011 y反码101001001反码000000011反码11111110127反码01111111 127反码10000000负数的反码与负数的原码有很大的区别,反码通常用作求补码过程中的中间形式。反码表示的整数范围与原码相同。 (3)二进制

29、数补码编码正数的补码与其原码相同,负数的补码为其反码在最低位加1。例1.17 当机器字长为8位二进制数时,求x和y的补码。(a)x1011011b (b) y1011011b(a)根据定义有: x原码0 101 1011 x补码0 101 1011(b)根据定义有: y原码1 101 1011 y反码1 010 0100 y补码1 010 0101例1.18 机器字长n=8位,x=+48d,求x补码。将+48d转换为二进制:+110000b。因为机器字长是8位,其中符号占了1位,所以数值只占7位。则:x原码0 011 0000,x补码= 0 011 0000。如写成十六进制,即x补码=30h。

30、例1.19 机器字长n=8位,x=48d,求x补码。将48d转换为二进制:110000b。因为机器字长是8位,其中符号占了1位,所以数值只占7位。则:x原码1 011 0000,x 反码1 100 1111,x补码1 101 0000。如写成十六进制,即x补码0d0h。例1.20 当机器字长为16位二进制数时,x=+48d,求x补。将+48d转换为二进制:+110000b。因为机器字长是16位,其中符号占了1位,所以数值只占15位。则:x原码0 000000000110000,x补码= 0 000000000110000。如写成十六进制,即x补码=0030h。例1.21 当机器字长为16位二进

31、制数时,x=48d,求x补。将48d转换为二进制:110000b。因为机器字长是16位,其中符号占了1位,所以数值只占15位。则:x原码1 000000000110000,x 反码1 111 1111 1100 1111,x补码= 1 111 1111 1101 0000。如写成十六进制,即x补码=0ffd0h。由此可看出,补码数要扩展时,正数是在符号的前面补0,负数是在符号的前面补1。也就是说,补码数扩展实际上是符号扩展。已知补码求真值的方法是:当机器数的最高位(符号位)为0时,表示真值是正数,其值等于其余n1位的值;当机器数的最高位(符号位)为1时,表示真值是负数,其值等于其余n1位按位取

32、反末位加1的值。例1.22 (a)x补码01011001b,(b)x补码11011001b,分别求其真值x。(a)x 补码代表的数是正数,其真值: x1011001b(1×261×241×231×20)(641681)(89)d(b)x 补码代表的数是负数,则真值:x(1011001求反1)b(01001101)b(0100111)b(1×251×221×211×20)(32421)(39)d下面,我们来讨论一下补码表示数的范围。一般来说,如果机器字长为n位,则补码能表示的整数范围是:2n1n2n11例如,当n=8

33、时,128n+127,其二进制补码数范围如表1-3所示。 当n=16时,32768n+32767。表1-3 8位二进制补码数范围补码编码(机器数)十进制数(真值)0 1111111+1270 1111110+1260 0000010+20 0000001+10 000000001 1111111-11 1111110-21 0000010-1261 0000001-1271 0000000-128(4)二进制数补码的运算补码的运算规则:x+y补 = x补 + y补xy补 = x补 + y补已知y补求y补的方法:将y补各位按位取反(包括符号位),末位加1。例1.23 二进制数补码的运算规则证明举

34、例。设x1 = + 0001100x2 = 0001100 y1 = + 0000101y2 = 0000101则 x1补 = 00001100x2补 = 11110100 y1补 = 00000101 y2补 = 11111011 计算x1 + y1。 + 0001100x1+) + 0000101 y1 + 0010001x1+y1 0 0001100x1补 +) 0 0000101 y1补 0 0010001x1补+y1补 因为:x1+y1补=0 0010001 补= x1补+ y1补所以:x1+y1补 = x1补 + y1补 计算x1y1。 + 0001100x1 )+ 0000101

35、y1 + 0000111x1y10 0001100 x1补+) 1 1111011 y1补 1 0 0000111x1补+y1补 因为:x1y1补 = 0 0000111补 = x1补+ y1补所以:x1y1补 = x1补 + y1补 计算x2 + y2。 0001100 x2+) 0000101 y2 0010001 x2+y2 1 111 0100 x2补+) 1 111 1011 y2补 1 11101111 x2补+y2补 因为:x2+ y2补= 11101111补= x2补+ y2补所以:x2 + y2补= x2补+ y2补 计算x2 y2。 0001100 x2) 0000101

36、y2 0000111 x2y2 1 1110100 x2补+) 0 0000101 y2补 1 1111001 x2补+y2补 因为:x2y2补 = 1 1111001补= x2补+ y2补所以:x2y2补 = x2补 + y2补由此可看出,计算机引入了补码编码后,带来了以下几个优点:减法转化成了加法:这样大大简化了运算器硬件电路的设计,加减法可用同一硬件电路进行处理。运算时,符号位与数值位同等对待,都按二进制数参加运算;符号位产生的进位丢掉不管,其结果是正确的。这大大简化了运算规则。运用以上两个规则时,要注意两点: 公式成立有个前提条件,就是运算结果不能超出机器数所能表示的范围,否则运算结果

37、不正确,按“溢出”处理。例如,如果机器字长为8位,则128n+127,通过计算(+64)+(+65)来说明这个问题。 +64+) +65 +129 0 1000000+) 0 1000001 1 0000001 127 为什么(+64)+(+65)其结果值会是127?这个结果显然是错误的。究其原因是(+64)+(+65)= +129+127,超出了字长为8位所能表示的最大值,产生了“溢出”,所以结果值出错。再看(125)+(10)。 125 +) 10 135 1 0000011+) 1 1110110 10 1111001 +121 显然,计算结果是错误的。其原因是:(125)+(10)=

38、135128,超出了字长为8位所能表示的最小值,产生了“溢出”,所以结果出错。 采用补码运算后,结果也是补码,欲得运算结果的真值,还需进行转换。 1. 无符号整数的编码在某些情况下,计算机要处理的数据全是正数,此时机器数再保留符号位就没有意义了。这时,我们将机器数最高有效位也作为数值位处理,也就是说,假设机器字长为n位,则有符号整数的编码格式如图1-1所示。1位 n-1位图1-1 有符号整数编码格式无符号整数的编码格式如图1-2所示。图1.2 无符号整数编码格式无符号整数的表示范围为:0n2n 1。 例如,当n=8位时,表示范围为:0n255; 当n=16位时,表示范围为:0n65535。在计

39、算机中最常见的无符号整数是地址。另外,双字长数据的低位字也是无符号整数。要注意的是,计算机本身不论是对有符号数还是无符号数,总是按照补码的运算规则做运算。3. 十进制数的编码人们在日常生活中习惯使用十进制数,而在计算机内,采用二进制数表示和处理数据更方便。因此,在往计算机里输入和输出数据时,要进行十二和二十的进制转换。但是,在某些特定的应用领域中,如商业统计,数据的运算很简单,但数据的输入、输出量很大,这样,数制转换所占的时间比例很大。从提高计算机的运行效率考虑,可以在计算机内部直接用十进制数表示和处理数据。以下介绍在计算机内部十进制数的编码方法及运算方法。 (1)bcd码bcd(binary

40、-coded decimal)码又称为“二十进制编码”,专门解决用二进制数表示十进数的问题。最常用的是8421编码,其方法是用4位二进制数表示1位十进制数,自左至右每一位对应的位权是8、4、2、1,选择的是0000,0001,0010,1001这10种组合,用来表示09这10个数位,见表1-4所示。表1-4 bcd码表十进制数码01234567898421码0000000100100011010001010110011110001001(2)压缩bcd码每一位数采用4位二进制数来表示,即一个字节表示2位十进制数。例如:二进制数10001001b,采用压缩bcd码表示为十进制数89d。 (3)非

41、压缩bcd码每一位数采用8位二进制数来表示,即一个字节表示1位十进制数。而且只用每个字节的低4位来表示09,高4位为0。例如:十进制数89d,采用非压缩bcd码表示为二进制数是:00001001b 00001001b1.3.2 非数值型数据的编码现代计算机不仅处理数值数据,而且还要处理大量的非数值数据,像英文字母、标点符号、专用符号、汉字等等。前面已说过,不论什么数据,都必须用基2码编码后才能存储、传送及处理,非数值数据也不例外。下面我们分别介绍常见的非数值数据的二进制编码方法。1字符编码使用最多、最普遍的是ascii字符编码,即美国标准信息交换代码(american standard cod

42、e for information interchance),具体见表1.5。ascii码表有以下几个特点:(1) 每个字符用7位基2码表示,其排列次序为b6 b5 b4 b3 b2 b1 b0。实际上,在计算机内部,每个字符是用8位(即一个字节)表示的。一般情况下,将最高位置为“0”,即b7为“0”。需要奇偶校验时,最高位用做校验位。(2) ascii码共编码了128个字符,它们分别是: 32个控制字符,主要用于通信中的通信控制或对计算机设备的功能控制,编码值为031(十进制)。 间隔字符(也称空格字符)sp,编码值为20h。 删除控制码del,编码值为7fh。 94个可印刷字符(或称有形字

43、符)。这94个可印刷字符编码有如下规律:表1-5 ascii字符编码b3b2b1b0b6b5b40 0 0(0)0 0 1(1)0 1 0(2)0 1 1(3)1 0 0(4)1 0 1(5)1 1 0(6)1 1 1(7)0000(0)nuldlesp0pp0001(1)sohdc1!1aqaq0010(2)stxdc2"2brbr0011(3)etxdc3#3cscs0100(4)eotdc4$4dtdt0101(5)endnak%5eueu0110(6)acksyn&6fvfv0111(7)beletb7gwgw1000(8)bscan(8hxhx1001(9)htem

44、)9iyiy1010(10)lfsub*:jzjz1011(11)vtesc+;kk1100(12)fffs,<ll|1101(13)crgs-=mm1110(14)sors.>nn1111(15)sius/?o_odel字符09这10个数字符的高3位编码都为011,低4位为00001001,屏蔽掉高3位的值,低4位正好是数据09的二进制形式。这样编码的好处是既满足正常的数值排序关系,又有利于ascii码与二进制码之间的转换。英文字母的编码值满足az或az正常的字母排序关系。另外,大小写英文字母编码仅是b5位值不相同,b5为1是小写字母,这样编码有利于大小写字母之间的编码转换。2.

45、 汉字的编码计算机在处理汉字时,汉字字符也必须用基2码编码表示,一般汉字编码采用两个字节即16位二进制数。但由于汉字的特殊性,在汉字的输入、存储、输出过程中所使用的汉字编码是不一样的,输入时有输入编码,存储时有汉字机内码,输出时有汉字字形码。(1)汉字输入编码为了能把汉字这种象形文字通过西文标准键盘输入到计算机内,就必须对汉字用键盘已有的字符设计编码,这种编码称为汉字的输入编码,又称为汉字外部码,简称外码。使用较多的有以下4类:顺序码:如区位码、电报码等。音码: 如拼音码、自然码等。形码: 如五笔字型、大众码等。音形码:如双拼码、五十字元等。 (2)汉字机内码汉字机内码也称汉字内部码,简称内码

46、。它是机器存储和处理汉字时采用的统一编码。每个汉字的机内码是惟一的,用两个字节表示。为了避免与西文字符的ascii码之间产生二义性,汉字机内码中两个字节的最高位均规定为“1”。(3)汉字字形码汉字字形码也叫汉字字模点阵码,是汉字输出时的字形点阵代码,是一串基2码编码。3. 逻辑数据的编码逻辑数据是用来表示“是”与“否”,或称“真”与“假”两个状态的数据。在计算机中,用“1”表示“真”或“是”,用“0”表示“假”或“否”。需要注意的是,这里的1和0没有数值和大小概念,只有逻辑意义。对逻辑数据只能进行逻辑运算,例如逻辑非、逻辑加、逻辑乘等基本逻辑运算和由基本逻辑运算构成的各种组合逻辑运算,运算结果仍是逻辑数据。下面介绍一下基本逻辑运算的运算规则。 (1)“与”运算(and)“与”运算又称逻辑乘,用符号 · 或表示。其运算规则为 0·0 = 0 0·1 = 0 1·0 = 0 1·1 = 1即两个逻辑变量取值均为1时,它们“与”的结果才为1。 (2)“或”运算(or)“或”运算又称逻辑加,用符号 + 或表示。 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论