第1章 微型计算机基础
1.1 数制与编码
数制与编码是微型计算机的基本数字逻辑基础,是学习微型计算机的必备知识。数制与编码的知识一般会在数字逻辑或计算机文化基础中学习,但往往由于数制与编码的知识,与当前课程的关系并非“不可或缺”,又比较枯燥。在微型计算机原理或单片机的教学中,教师普遍感觉到,学生在这方面的知识基础不扎实。在此,提纲挈领再理一理。
1.1.1 数制及转换方法
所谓数制就是计数的方法,通常采用进位计数制。在微型机算机的学习与应用中,主要有十进制、二进制和十六进制三种计数方法。日常生活中采用的是十进制;微型计算机只能识别和处理数字信息,微型计算机硬件电路采用的是二进制,但为了更好地记忆与描述微型计算机的地址和程序代码、运算数字,一般采用十六进制。
1.各种进位计数制及其表示方法
见表1.1所示。
表1.1 二进制、十进制与十六进制的计数规则与表示方法
2.数制之间的转换
任意进制之间相互转换,整数部分和小数部分必须分别进行。各进制的相互转换关系如图1.1所示。
(1)二进制、十六进制转换为十进制。将二进制、十六进制数按权值展开式展开相加所得数,即为十进制数。
图1.1 各进制的相互转换关系图
(2)十进制转换为二进制。十进制转换为二进制要分成整数部分与小数部分,而且其转换方法完全不同。
①整数部分———除2取余法,倒序排列,如下所示:
∴(84)10=(1010100)2
②小数部分———乘2取整法,顺序排列,如下所示:
∴(0.6875)10=(0.1011)2
将上述两部分合起来,则有:
(84.6875)10=(1010100.1011)2
(3)二进制与十六进制互转。
①二进制转换为十六进制。以小数点为界,往左、往右4位二进制数为一组,每4位二进制数用1位十六进制表示,往左高位不够用0补齐,往右低位不够用0补齐,例如:
(111101.011101)2=(0011 1101. 0111 0100)2=(3D.74)16
②十六进制转换为二进制。每位十六进制数用4位二进制数表示,再将整数部分最高位的0去掉,小数部分最低位的0去掉,例如,
(3C20.84)16=(0011 1100 0010 0000.1000 0100)2=(11110000100000.100001)2
数制转换工具:利用PC机附件中的计算器(科学型)可实现各数制间的相互转换。单击任务栏“开始”按钮,选择“所有程序”→“附件”→“计算器”,即可打开计算器工具,在计算器工具界面“查看”菜单栏中选择“科学型”,如图1.2所示。
图1.2 科学型计算器与各进制转换
转换方法:先选择被转换数制的类型,输入转换数字,再选择目标转换数制类型,此时看到的就是转换后的数字。如96转换为十六进制、二进制,先选择数制类型为十进制,如图1.2上部所示,在输入框中输入数字96,然后再选择数制类型为十六进制此时显示框中看到的数字即为转换后的十六进制数字60,如图1.2中部所示;再选择数制类型为二进制,此时显示框中看到的数字即为转换后的二进制数字1100000,如图1.2下部所示。
3.二进制数的运算规则
(1)加法运算规则。
0+0=0,0+1=1,1+1=0(有进位)
(2)减法运算规则。
0-0=0,1-0=1,1-1=0,0-1=1(有借位)
(3)乘法法运算规则。
0×0=0,1×0=1,1×1=1
1.1.2 微型计算机中数的表示方法
1.机器数与真值
数学中的正、负用符号“+”和“-”表示,计算机中是如何表示数的正、负呢?在计算机中数据存放在存储单元内,而每个存储单元则由若干二进制位组成,其中每一数位或是0或是1,刚好可以对应数的“+”号和“-”号,这样就可用一个数位来表示数的符号。在计算机中规定用“0”表示“+”,用“1”表示“-”。用来表示数的符号的数位被称为“符号位”(通常为最高数位),于是数的符号在计算机中已数码化了,但从表示形式上看符号位与数值位毫无区别。
设有两个数x1,x2:
x1=+1011011B,x2=-1011011B
它们在计算机中分别表示为(带下画线部分为符号位,字长为8位):
x1=01011011B,x2=11011011B
为了区分这两种形式的数,我们把机器中以编码形式表示的数称为机器数(上例中x1=01011011B及x2=11011011B),而把原来一般书写形式表示的数称为真值(x1=+1011011B及x2=-1011011B)。
若一个数的所有数位均为数值位,则该数为无符号数;若一个数的最高数位为符号位而其他数位为数值位,则该数为有符号数。由此可见,对于同一存储单元,它存放的无符号数和有符号数所能表示的数值范围是不同的(如存储单元为8位,当它存放无符号数时,因有效的数值位为8位,故该数的范围为0~255;当它存放有符号数时,因有效的数值位为7位,故该数的范围(补码)为-128~+127)。
2.原码
对于一个n位二进制数,如用最高数位表示该数的符号(“0”表示“+”号,“1”表示“-”号),其余各数位表示其数值本身,则称为原码表示法。
若x=±xn-2…x1x0,则[x]原码=xn-1xn-2…x1x0
其中xn-1为原机器数的符号位,它满足:
3.反码
也就是说,正数的反码与其原码相同(反码=原码),而负数的反码为符号位保持不变,数值位按位取反.
4.补码
(1)补码的引进。首先以日常生活中经常遇到的钟表“对时”为例来说明补码的概念。假定现在是北京标准时间八时整,而一只表却指向十时整,为了校正此表,可以采用倒拨和顺拨两种方法:倒拨就是反时针减少2小时(把倒拨视为减法,相当于10-2=8),时针指向8;还可将时针顺拨10小时,时针同样也指向8,把顺拨视为加法,相当于10+10=12(自动丢失)+8=8,这自动丢失的数(12)就叫做摸(mod),上述的加法称为“按摸12的加法”,用数学式可表示为:
10+10=12+8=8(modl2)
因时针转一圈会自动丢失一个数12,故10-2与10+10是等价的.称10和-2对模12互补,10是-2对模12的补码。引进补码概念后,就可将原来的减法10-2=8转化为加法10+10(-2的补码)=12(自动丢失)+8=8(modl2)。
(2)补码的定义。通过上面的例子不难理解计算机中负数的补码表示法。设寄存器(或存储单元)的位数为n位,则它能表示的无符号数最大值为2n-1,逢2n进1(即2n自动丢失)。换句话说,在字长为n的计算机中,数2n和0的表示形式一样。若机器中的数以补码表示,则数的补码以2n为模,即
[x]补=2n+x(mod2n)
若x为正数,则[x]=x;若x为负数,则[x]=2n+x=2n-|x|。即负数x的补码等于模2n加上其真值或减去其真值的绝对值。
在补码表示法中,零只有唯一的表示形式:0000…0。
(3)求补码的方法。根据上述介绍可知,正数的补码等于原码。下面介绍负数求补码的三种方法。
①根据真值求补码。根据真值求补码就是根据定义求补码,即有
[x]补=2n+x=2n-|x|
即负数的补码等于2n(模)加上其真值,或者等于2n(模)减去其真值的绝对值。②根据反码求补码(推荐使用方法)。
[x]补=[x]反+1
③根据原码求补码。负数的补码等于其反码加1,这也可理解为负数的补码等于其原码各位(除符号位外)取反并在最低位加1。如果反码的最低位是1,它加1后就变成0,并产生向次最低位的进位;如次最低位也为1,它同样变成0,并产生向其高位的进位(这相当于在传递进位),这进位一直传递到第1个为0的位为止。于是可得到这样的转换规律:从反码的最低位起直到第一个为0的位以前(包括第一个为0的位),一定是1变0,第一个为0的位以后的位都保持不变,由于反码是由原码求得,因此可得从原码求补码的规律为:从原码的最低位开始到第1个为1的位之间(包括此位)的各位均不变,此后各位取反,但符号位保持不变。
特别要指出,在计算机中凡是带符号的数一律用补码表示且符号位参加运算,其运算结果也是用补码表示,若结果的符号位为“0”,则表示结果为正数,此时可以认为它是以原码形式表示的(正数的补码即为原码);若结果的符号位为“1”,则表示结果为负数,它是以补码形式表示的,若是要用原码来表示该结果,还需要对结果求补(即除符号位外按位取反加1),即
[[x]补]补=[x]原
1.1.3 微型计算机中常用编码
微型机算机不但要处理数值计算问题,而且还要处理大量非数值计算问题,因此除了直接给出二进制数外,不论是十进制数还是英文字母、汉字以及某些专用符号都必须编成二进制代码,这样它们才能被计算机识别、接收、存储、传送及处理。
1.十进制数的编码
在微型计算机中,十进制数除了转换成二进制数外,还可用二进制数对其进行编码:用4位二进制数表示1位十进制数,使它既具有二进制数的形式又具有十进制数的特点。二-十进制码又称为BCD码(Binary-Coded Decimal),它有8421码、5421码、2421码以及余3码等几种编码形式,其中最常用的是8421码。8421码与十进制数的对应关系见表1.2所示,每位二进制数位都有固定的“权”,各数位的权从左到右分别为23、22、21、20,即8、4、2、1,这与自然二进制数的权完全相同,故8421BCD码又称为自然权BCD码。其中1010~1111这6个代码,是不允许出现的,属非法8421BCD码。
表1.2 8421BCD码编码表
BCD码低位与高位之间是“逢十进一”,而4位二进制数(即十六进制数)是“逢十六进一”,用二进制加法器进行BCD码运算时,如果BCD码运算的低、高位的和都在0~9之间,则其加法运算规则与二进制加法完全一样;如果相加后某位(BCD码位,低4位或高4位)的和大于9或产生了进位,则此位应进行“加6调整”。通常在微型计算机中,都设置有BCD码的调整电路,机器执行一条十进制调整指令,机器就会自动根据刚才的二进制加法结果进行修正。BCD码向高位借位是“借一当十”,而4位二进制数(1位十六进制数)是“借一当十六”,因此在进行BCD码减法运算时,如果某位(BCD码位)有借位时,必须在该位进行“减6调整”。
2.字符编码
微型机算机需要进行非数值处理(如指令、数据的输入、文字的输入及处理等),必须对字母、文字以及某些专用符号进行编码。微型机算机系统的字符编码多采用美国信息交换标准代码———ASCII码(American Standand Code for Information Interchange),ASCII码是7位代码,共有128个字符,其中94个是图形字符,可在字符印刷或显示设备上打印出来,包括数字符号10个、英文大小写字母共52个以及其他字符32个,另外34个是控制字符,包括传输字符、格式控制字符、设备控制字符、信息分隔符和其他控制字符,这类字符不打印、不显示,但其编码可进行存储,在信息交换中起控制作用。其中,数字0~9对应的ASCII码为30H~39H,英文大写字母A~Z对应的ASCII码为41H~5AH,小写字母a~z对应的ASCII码为61H~7AH,这些规律性对今后的码制转换的编程非常有用。
我国于1980年制定了国家标准GB1988-80,即“信息处理交换用的7位编码字符集”,其中除了用人民币符号“¥”代替美元符号“$”外,其余与ASCII码相同。