第一章 微型计算机基础知识 联系客服

发布时间 : 星期二 文章第一章 微型计算机基础知识更新完毕开始阅读

第1章 微型计算机的基础知识

1.1 计算机中的数和编码 1.1.1 计算机中的数制

计算机最早是作为一种计算工具出现的,所以它的最基本的功能是对数进行加工和处理。数在机器中是以器件的物理状态来表示的。一个具有两种不同的稳定状态且能相互转换的器件就可以用来表示1位(bit)二进制数。二进制数有运算简单,便于物理实现,节省设备等优点,所以目前在计算机中数几乎全是采用二进制表示。但是二进制数书写起来太长,且不便于阅读和记忆;又加上目前大部分微型计算机是8位、16位或32位的,都是4的整数倍,而4位二进制数即是1位十六进制数;所以微型计算机中的二进制数都采用十六进制数来缩写。十六进制数用0~9、A~F等16个数码表示十进制数0~15。1个8位的二进制数用2位十六进制数表示,1个16位的二进制数用4位十六进制数表示等。这样书写方便,且便于阅读和记忆。然而人们最熟悉、最常用的是十进制数。为此,要熟练地掌握十进制数、二进制数和十六进制数间的相互转换。它们之间的关系如表1-1所列。

表1-1十进制数、二进制数及十六进制数对照表 十进制 二进制 十六进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 11110 1 2 3 4 5 6 7 8 9 A B C D E F 为了区别十进制数、二进制数及十六进制数3种数制,可在数的右下角注明数制,或者在数的后面加一字母。如B(binary)表示二进制数制;D(decimal)或不带字母表示十进制数制;H(hexadecimal)表示十六进制数制。

1.二进制数和十六进制数间的相互转换

根据表1-1所示的对应关系即可实现它们之间的转换。

二进制整数转换为十六进制数,其方法是从右(最低位)向左将二进制数分组:每4位为1组,最后一组若不足4位则在其左边添加0,以凑成4位1组,每组用1位十六进制数表示。如:

1111111000111B →1 1111 1100 0111B → 0001 1111 1100 0111B=1FC7H

十六进制数转换为二进制数,只需用4位二进制数代替1位十六进制数即可。如: 3AB9H=0011 1010 1011 1001B

2.十六进制数和十进制数间的相互转换

十六进制数转换为十进制数十分简单,只需将十六进制数按权展开相加即可。如:

3210

1F3DH=16×1+16×15+16×3+16×13=4096×1+256×15+16×3+1×13=4096+3840+48+13=7997

十进制整数转换为十六进制数可用除16取余法,即用16不断地去除待转换的十进制数,直至商等于0为止。将所得的各次余数,依倒序排列,即可得到所转换的十六进制数。如将38947转换为十六进制数,其方法及算式如下:

即38947=9823H

1.1.2 符号数的表示法 1.机器数与真值

二进制数与十进制数一样有正负之分。在计算机中,常用数的符号和数值部分一起编码的方法表示符号数。常用的有原码、反码和补码表示法。这几种表示法都将数的符号数码化。通常正号用“0”表示,负号用“1”表示。为了区分一般书写时表示的数和机器中编码表示的数,我们称前者为真值,后者为机器数,即数值连同符号数码“0”或“1”一起作为一个数就称为机器数,而它的数值连同符号“+”或“-”称为机器数的真值。把机器数的符号位也当作数值的数,就是无符号数。

为了表示方便,常把8位二进制数称为字节,把16位二进制数称为字,把32位二进制

数称为双字。对于机器数应将其用字节、字或双字表示,所以只有8位、16位或32位机器数的最高位才是符号位。

2.原码

按上所述,数值用其绝对值,正数的符号位用0表示,负数的符号位用1表示,这样表示的数就称为原码。如:

X1= 105=+1101001B [X1]原=01101001B X2=-105=-1101001B [X2]原=11101001B

其中最高位为符号,后面7位是数值。用原码表示时,+105和-105的数值部分相同而符号位相反。

8位原码数的数值范围为FFH~7FH(-127~127)。原码数00H和80H的数值部分相同、符号位相反,它们分别为+0和-0。16位原码数的数值范围为FFFFH~7FFFH(-32767~32767)。原码数0000H和8000H的数值部分相同、符号位相反,它们分别为+0和-0。

1个二进制符号数的扩展是指一个数从位数较少扩展到位数较多,如从8位(字节)扩展到16位(字),或从16位扩展到32位(双字)。对于用原码表示的数,它的正数和负数仅1位符号位相反,数值位都相同。原码数的扩展是将其符号位向左移至最高位,符号位移过之位即最高位与数值位间的所有位都填入0。例如:68用8位表示为44H,用16位表示为0044H;-68用8位表示为C4H,用16位表示为8044H。

原码表示简单易懂,而且与真值的转换方便。但若是两个异号数相加,或两个同号数相减,就要做减法。为了把减运算转换为加运算,从而简化计算机的结构,就引进了反码和补码。

3.反码

正数的反码与原码相同;负数的反码为它的绝对值(即与其绝对值相等的正数)按位取反(连同符号位)。如:

X1= 105=+1101001B [X1]反=01101001B X2=-105=-1101001B [X2]反=10010110B 4.补码

正数的补码与原码相同;负数的补码为与它的绝对值相等的正数的补数。把一个数连同符号位按位取反再加1,可以得到该数的补数。如:

X1= 105=+1101001B [X1]补=01101001B X2=-105=-1101001B [X2]补=10010111B

求补数还可以直接求,方法是从最低位向最高位扫描,保留直至第一个“1”的所有位,以后各位按位取反。负数的补码可以由其正数求补得到。根据两数互为补数的原理,对补码表示的负数求补就可以得到其正数,即可得该负数的绝对值。如:

[-105]补=10010111B=97H

对其求补,从右向左扫描,第一位就是1,故只保留该位,对其左面的七位均求反得:01101001,即补码表示的机器数97H的真值是-69H(=-105)。

一个用补码表示的机器数,若最高位为0,则其余几位即为此数的绝对值;若最高位为1,其余几位不是此数的绝对值,把该数求补,才得到它的绝对值。

8位补码数的数值范围为80H~7FH(-128~127)。16位补码数的数值范围为8000H~7FFFH(-32768~32767)。字节80H和字8000H的真值分别是-128(-80H)和-32768(-8000H)。补码数80H和8000H的最高位既代表了符号为负又代表了数值为1。

1个二进制补码数的符号位向左扩展若干位后,所得到的补码数的真值不变。对于用补码表示的数,正数的扩展应该在其前面补0,而负数的扩展,则应该在前面补1。例如:68用8位(二进制数)表示为44H,用16位表示为0044H;-68用8位表示为BCH,用16位表示为FFBCH。

当数采用补码表示时,就可以把减法转换为加法。例如: 64-10=64+(-10)

[64]补=40H=0100 0000B [10]补=0AH=0000 1010B [-10]补=1111 0110B 做减法运算过程如下:

用补码相加过程如下:

结果相同,其真值为:54(36H=48+6)。

最高位的进位是自然丢失的,故做减法与用补码相加的结果是相同的。因此,在微型机中,凡是符号数一律是用补码表示的。一定要记住运算的结果也是用补码表示的。如:

34-68=34+(-68) 34=22H=0010 0010B 68=44H=0100 0100B -68=1011 1100B 做减运算过程如下:

用补码相加过程如下:

结果相同。因为符号位为1,所以结果为负数。对其求补,得其真值:-00100010B,即为-34(-22H)。

由上面两个例子还可以看出,当数采用补码表示后,两个正数相减,若无借位,化为补码相加就会有进位;若有借位,化作补码相加就不会有进位。

1.1.3 二进制数的加减运算

计算机把机器数均当作无符号数进行运算,即符号位也参与运算。运算的结果要根据运算结果的符号,运算有无进(借)位和溢出等来判别。计算机中设置有这些标志位,标志位的值由运算结果自动设定。

1.无符号数的运算

无符号数实际上是指参加运算的数均为正数,且整个数位全部用于表示数值。n位无符

n

号二进制数的范围为0~(2-1)。

(1)两个无符号数相加,由于两个加数均为正数,因此其和也是正数。当和超过其位数所允许的范围时,就向更高位进位。如:

127+160 = 7FH+A0H

(2)两个无符号数相减,被减数大于或等于减数,无借位,结果为正;被减数小于减数,有借位,结果为负。如:

192-10=C0H-0AH

反过来相减,即10-192,运算过程如下:

由此可见,对无符号数进行减法运算,其结果的符号用进位来判别:CF=0(无借位),结果为正;CF=1(有借位)结果为负(对8位数值位求补得到它的绝对值)。

2.符号数的运算

n位二进制数,除去一位符号位,还有n-1位表示数值,所能表示的补码的范围为:-2~n-1

(2-1)。如果运算结果超过此范围就会产生溢出。如:

105+50=69H+32H

若把结果视为无符号数,为155,结果是正确的。若将此结果视为符号数,其符号位为1,结果为-101,这显然是错误的。其原因是和数155大于8位符号数所能表示的补码数的最大值127,使数值部分占据了符号位的位置,产生了溢出,从而导致结果错误。又如:

-105-50=-155

n-1

两个负数相加,和应为负数,而结果01100101B却为正数,这显然是错误的。其原因是和数-155小于8位符号数所能表示的补码数的最小值-128,也产生了溢出。若不将第7位(第7位~第0位)0看作符号,也看作数值而将进位看作数的符号,结果为-10011011B=-155,结果就是正确的。

因此,应当注意溢出与进位及补码运算中的进位或借位丢失间的区别:

(1)进位或借位是指无符号数运算结果的最高位向更高位进位或借位。通常多位二进制数将其拆成二部分或三部分或更多部分进行运算时,数的低位部分均无符号位,只有最高部分的最高位才为符号位。运算时,低位部分向高位部分进位或借位。由此可知,进位主要用于无符号数的运算,这与溢出主要用于符号数的运算是有区别的。

(2)溢出与补码运算中的进位丢失也应加以区别,如: -50-5=-55

两个负数相加,结果为负数是正确的。这里虽然出现了补码运算中产生的进位,但由于和数并未超出8位二进制补码数-128~127的范围,因此无溢出。那么如何来判别有无溢出呢?

设符号位向进位位的进位为CY,数值部分向符号位的进位为CS,则溢出 OF=CY+CS

OF=1,有溢出;OF=0,无溢出。

下面用M、N两数相加来证明。设MS和NS为两个加数的符号位,RS为结果的符号位,则有表1-2所列的真值表。由真值表得逻辑表达式:

OF= Cy+ CS =Cs+Cy

表1-2 符号、进位、溢出的真值表 MS NS RS 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 CS CY 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 OF 0 1 0 0 0 0 1 0 再来看105+50、-105-50和-50-5 3个运算有无溢出: