学过了,跳过。
这些都学过了,跳过。
做法:无论多少位,最高位做符号位。是最早最容易想到的做法。
例:对于长度 8 8 8 位的数( D 7 D_7 D7~ D 0 D_0 D0 ),用 D 7 D_7 D7 位作符号位, D 7 = 1 D_7=1 D7=1 表示负数, D 7 = 0 D_7=0 D7=0 表示正数。如:0101 1101B = +93
,1101 1101B = −93
对于长度 16 16 16 位的数( D 15 D_{15} D15~ D 0 D_0 D0), D 15 = 1 D_{15}=1 D15=1 表示负数, D 15 = 0 D_{15}=0 D15=0 表示正数。
带符号位的数称为机器数,它表示的实际数值称为机器数的真值。
正数的符号位用 0 0 0 表示,负数符号位用 1 1 1 表示,其余位为数值,这种表示方法称为原码。就是上面的符号表示法。例:
X=+105
,[X]原=0110 1001B
;X=−105
,[X]原=1110 1001B
原码简单易懂,与真值换算很方便。若要进行两个异号数相加,或两个同号数相减的运算,就要做减法操作。一般的计算机中没有减法运算部件,减法运算也要用加法部件实现,因此要引进反码和补码。
正数的反码与原码相同。例:
[+4]反=0000 0100B
;[+31]反=0001 1111B
;[+127]反=0111 1111B
(最大值)负数的反码为它的正数原码按位取反。
[−4]反 = 1111 1011B
[−31]反 = 1110 0000B
[−127]反 = 1000 0000B
(最小值)8
位二进制数的反码范围为 −127~+127
。
带符号数用反码表示时,最高位为符号位,当它为正数时,后 7
位为真正的值;它为负数时,后7位要取反后才能得到真正的值。比如说, [X]反=1001 0100B,[X]真值=−[110 1011]= −107
。
正数的补码同原码;负数的补码为其反码加1,即为它的正数原码按位取反再加1。例:
[+4]原=0000 0100B = [+4]反 = [+4]补
[−4]原=1000 0100B
[−4]反=1111 1011B
(正数 4
按位取反;或者 [-4]原
后七位按位取反)[−4]补=1111 1100B
(反码+1)[+127]原=0111 1111B = [+127]反 = [+127]补
[−127]原=1111 1111B
[−127]反=1000 0000B
[−127]补=1000 0001B
[−128]补=1000 0000B
补码可看成“带符号位的数”,符号位也参加运算。要减去一个数,只要加上其补码。我们有 [A+B]补=[A]补+[B]补
和 [A-B]补=[A]补+[-B]补
。如,要做减法 7−19
,可用 7+[−19]补
来完成。
[7]补 = 0000 0111B; [+19]补 = 0001 0011B
[−19]补 = 1110 1101B
0000 0111B -------- [7]补
+ 1110 1101B -------- [−19]补
1111 0100B = F4H -------- 和的补码
F4H = 1111 0100B
F3H = 1111 0011B
1000 1100B
,其真值为 -12
7 +(−19)= −12
,答案正确。见计算机组成原理。
跳过。
跳过。
下面是一些概念:
计算机只认得二进制,因此指令都用二进制表示,称为机器码(Machine Code)。
指令由操作码(Opecode)和操作数(Operand)组成,操作码说明计算机执行什么操作,操作数指出参加操作的数的本身或操作数所在的地址。这样看来,指令很像语法中的动宾结构。
例如,在 8086 CPU
中,把数字 1200H
取到累加器 AX
中去的指令的机器码为:
操作码 B8H
,规定了要从后面两个字节单元中取出一个 2 2 2 字节数( 1200H
),送到累加器 AX
中的操作。
需要记住的是,这里的数据存放——低字节放在前面,高字节放在后面,或者说,大多数计算机系统中,低位字节放在低地址,高位字节放在高地址。
初期,就是用指令的机器码直接来编制程序的,处于机器语言阶段。机器码是一连串的0和1组成的代码,输入计算机时,由纸带穿孔机在纸带上凿孔,有孔表示 1 1 1 ,无孔表示 0 0 0 。这种代码不好理解和记忆,还很容易出错,所以最开始,编程是一件极其繁杂而困难的工作。
汇编语言用助记符(Mnemonic)代替二进制的机器码,用指令功能的英文缩写代替操作码,用符号代替地址,用寄存器存放地址等,用汇编语言程序编程比机器语言方便。
例如,对于8086:
MOV
(Move)ADD
(Addition)JMP
(Jump)RESULT
、SUM
等符号来表示存储单元地址将 1200H
送到累加器 AX
中去的指令为:MOV AX,1200H
。
例:编写求解 2+3=5
的汇编语言程序,要求将和存入 SUM
单元。程序如下:
MOV AX, 2 ;累加器AX←2
ADD AX, 3 ;AX←AX+3
MOV SUM, AX ;结果单元SUM←和数5
计算机只认识由0、1组成的机器码。因此,汇编语言程序必须翻译(用 MASM
)成机器码表示的目标程序(Object Program),才能被计算机识别和执行。能让计算机自动完成翻译工作的程序称为汇编程序(Assembler)。
汇编语言程序比机器语言程序进了一大步,但是其本质仍然是助记符,和机器语言一一对应,因此汇编语言程序语句很多,编程工作很繁琐。这是它的不足之处。而且,汇编语言的针对性很强,在某种机器上编写的汇编语言程序,不能直接在别的机器上运行,无法跨平台,程序员必须十分熟悉CPU的指令系统,于是,各种高级语言应运而生。
微型计算机与冯·诺依曼结构计算机无本质区别。主要不同在于:CPU
采用集成化的微处理器,各部件通过总线相连,所有外设都应通过I/O接口电路才能连到 CPU
。微型计算机基本结构框图:
虽然上图不是放之四海而皆准,架构不完全一样(还有哈佛结构),但是我们可以看出,CPU可以直接访问内存存储器,访问IO接口,而且我们的CPU不可以直接访问IO设备。这是我们需要知道的,而且是我们课程的核心内容。
存储器用来存放数据和指令,其内容以二进制表示。每个单元可存 8 8 8 位( 1 1 1 字节)二进制信息。即一个存储器单元为一个字节。
为了正确存取内存单元,需要为每个单元编1个存储器地址(Memory Address)。地址是不带符号整数,从 0 0 0 开始,顺序加 1 1 1 ,到最大值后又回 0 0 0。
例如,CPU
有 16 16 16 根地址线 A 15 A_{15} A15~ A 0 A_0 A0 ,可表示的地址范围为 2 16 = 65536 2^{16}=65536 216=65536 个单元,地址编号为 0 0 0~ 65535 65535 65535 或 0000~FFFFH
(最后的 H
表示是十六进制的 )
1 1 1 个存储单元中存放的信息称为该存储单元的内容。例如,下图中,地址 0003H
单元中存放内容为 3CH
,记作:(0003H)= 3CH
。同理 (1200H)= 8FH
。
从上图中,还有如下例子:
0000H
单元开始存放的 3 3 3 个字节数据依次为 B8H
、02H
和00H
;1200H
开始存放字数据 A28FH
,(1200H)
字 =A28FH
;1202
开始存放的字数据为 1234H
,(1202H)字=1234H地址与内容的关系:
一些概念:
I/O设备种类繁多,其速度、信号电平与主机不一致,要通过接口电路连到计算机。接口电路是主机和外设间的桥梁,提供数据缓冲驱动、信号电平转换、信息转换、地址译码、定时控制等各种功能。声卡和显卡都是接口电路。
各厂商都有与自己CPU配套的外设接口芯片,例如,后面将分别学习的 Intel
可编程接口芯片:
8255A
通用并行I/O接口8253/8254
计数器/定时器8259A
中断控制器8251A
串行通信接口8237A DMA
控制器目前,它们已被集成到 32 32 32 位、 64 64 64 位 CPU
的配套芯片中,其功能、控制方法和地址等均向前兼容。
从CPU和各I/O接口芯片的内部各功能电路的连接,到计算机系统内部的各部件间的数据传送和通信,乃至计算机主板与适配器卡的连接,以及计算机与外部设备间的连接,都要通过总线(Bus)来实现。
总线标准,是设计计算机部件、I/O设备甚至计算机软件的依据。
按总线中传送的信息分为:地址总线,数据总线,控制总线,还有电源和地。
地址总线(Address Bus):用于传送地址信息,是单向总线,总从CPU指向存储器或I/O。CPU通过地址总线对存储器或I/O端口寻址。
地址总线数目决定了CPU能直接寻址的范围。
8
位CPU,如 8080
,有 16
根地址线 A15~A0
,可直接寻址的范围为 2 16 = 65536 2^{16}=65536 216=65536 字节单元,即 64KB
;16
位CPU如 8086/8088
,有 20
根地址线 A19~A0
,最大可寻址 2 20 = 1048576 2^{20}=1048576 220=1048576 字节单元,即 1MB
;80286
有 24
根地址线,可直接寻址 2 24 = 16 M B 2^{24}=16MB 224=16MB ;80386
有 32
根地址线,可寻址 2 32 = 4 G B 2^{32}=4GB 232=4GB ;Pentium
以上CPU有 36
根地址线,寻址范围高达 2 36 = 64 G B 2^{36}=64GB 236=64GB 。数据总线(Data Bus):用于传送数据信号的总线,是双向总线,CPU既可以通过它从存储单元或I/O端口读取数据,也可将数据传送到存储单元或I/O端口。
数据总线的多少决定了一台计算机的字长。16
位机一次可并行传送16位数据,32
位机则可传送32位数据。
8086
和 8088
都是16位CPU。但8088内部有16根数据线,外部只有8根,故称它为准16位CPU。80386、80486
及 Pentium
等为CPU的微型计算机都是 32
位机。控制总线(Control Bus):是CPU对存储器、外围芯片和I/O接口的控制以及它们对CPU的应答、请求等信号组成的总线。例如: