首页 > 代码库 > 《CODE》读后笔记——第14~20章

《CODE》读后笔记——第14~20章

14.反馈与触发器

  • 振荡器不需要人的干涉即可自主且不断地实现断开和闭合。所有计算机都靠某种振荡器来使其他部件同步工作。
  • 当两个开关都断开时,电路有两个稳定状态,这样的一个电路称为触发器。触发器具有记忆性,可以保持信息。各种触发器如下表:

 

技术分享

 

 

 

 

 

 

 

 

 

 

  

 

 

  • 《code》书中常用的电路

 

振荡器

技术分享

技术分享

分频器

技术分享

技术分享

8位行波(异步)计数器

技术分享

技术分享

8-1选择器

技术分享

技术分享

3-8译码器

技术分享

技术分享

 

15.字节与十六进制

  • 看完这一章,个人认为十六进制的出现应该就是为了要简单清晰的表示字节吧。四进制表示就只比二进制缩短了1倍,八进制实现不了8个位组成的字节,二百五十六进制太复杂。
  • 在十六进制中,两位带符号数若是以 8、9、A、B、C、D、E或F开头则是负数。

16.存储器组织

  • RAM:随机访问存储器。要注意随机存储和顺序存储的概念区别。
  • 一般地,谈到存储器时,人们默认为多少字节。谈到线路传输数据时,人们默认为多少位。
  • 书中提到:因为按照我们的设计方案需要为每位存储器提供9个继电器,那么64K×8的RAM阵列需要将近500万个继电器。此处存疑?选择器和译码器里面使用的继电器没有算在内么?
  • 存储器是这样组织起来的:

 

技术分享

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

17.自动操作

  • 所谓的指令码或操作码是否就是CPU指令集的元素?
  • 最基础的指令码:Load,Store,Add,Substrate,Halt。Add with carry,Substrate with borrow。Jump,Jump If XXX。进位加和借位减要用到进位锁存器(占1位)。
  • 当进行减法操作,或进位锁存器的数据输出为 1并且执行进位加法或者借位减法指令时, 8位加法器的进位输入被置为1。当进行加法操作,进位输入被置为0。当进行借位减法操作且进位锁存器的数据输出为0时,说明低位减法产生了借位,因此累加器需要少加一个1,所以进位输入被置为0。
  • 转移指令相当于强制改变计数器的值等于转移地址。
  • 零锁存器:输入全部为0时,零标志位置为1。存储指令不会影响零标志位。零标志位只能被加法、减法、进位加法、借位减法指令所影响,它同这些指令中最近一个执行时所设置的值相同。

技术分享

  • 控制重复或循环是计算机和计算器的区别。
  • 处理器有一些组件。已经确定的一个是累加器,它是一个简单的锁存器,用来在处理器内部保存数据。我们所设计的计算机中, 8位反向器和8位加法器一起称作算术逻辑单元或 ALU。ALU只能进行算术运算,主要是加法和减法。在复杂的计算机中,ALU也可进行逻辑运算,如"与"、"或"、"异或"。16位计数器叫作程序计数器PC。
  • 写代码时最好不要用真实的数字地址,因为它们是会变的。较好的方法是使用标号来指定存储单元,这些标号是简单的单词即可。
  • 书中有一句:曾经有过模拟计算机,但它们正逐渐消失。不知道以后会不会偶遇?
  • 本书中加法器的开发历程如下:

技术分享

 

技术分享

 

18.从算盘到芯片

  • 图灵首先提出了"计算能力"的概念,用以分析计算机可以做到和不能做的事。后续谈到了关于"人工智能"的内容,称作图灵测试法。

图灵测试:如果电脑能在5分钟内回答由人类测试者提出的一系列问题,且其超过30%的回答让测试者误认为是人类所答,则电脑通过测试。但30%是图灵对2000年时的机器思考能力的一个预测,目前我们已远远落后于这个预测。2014年6月7日是计算机科学之父艾伦·图灵(Alan Turing)逝世60周年纪念日。这一天,在英国皇家学会举行的"2014图灵测试"大会上,聊天程序"尤金·古斯特曼"(Eugene Goostman)首次"通过"了图灵测试。

  • 冯诺依曼体系结构:计算机内部应该使用二进制;计算机应该具有尽可能大的存储器用于存储程序代码和数据;指令应该在存储器中顺序存放并用 程序计数器来寻址,但也应该允许条件转移,这种设计思想叫做存储程序概念。冯诺依曼体系结构的计算机需要花费大量时间取指令,这是冯诺依曼体系结构的一个瓶颈。
  • 两个N型半导体中夹一个P型半导体可制成放大器,称作NPN晶体管,对应的三部分分别是集电极(Collector)、基极( Base )和发射极( Emitter )。如图:

技术分享     技术分享

  • 制作构成集成电路组件的有2大流行家族:TTL(德州仪器)和CMOS(国家半导体公司)。但却是Intel首次实现了在一块电路板上用集成电路构造一个完整的计算机处理器Intel 4004。
  • 构造一个振荡器只需要使用石英晶体即可,因为石英晶体具有压电效应。利用这种特性,就可以用石英谐振器取代LC(线圈和电容)谐振回路、滤波器等。

压电效应:当晶片外加一个变化电场时,晶体会产生机械形变;当极板间施加机械力,晶体内会产生交变电场,这种现象称为压电效应。利用压电效应,当极板外加交变电压时,产生机械形变;机械形变反过来产生交变电场。机械形变振幅较小,晶体振动的频率比较稳定。当外加交变电压的频率和晶体的固有频率相等时,机械振动的振幅急剧增加。

  • 有三个指标经常用来衡量微处理器:数据通路位数;时钟频率;寻址能力。但它们不会影响一台计算机的能力。某种意义上所有数字计算机都是相同的。如果一个处理器的硬件能做别的处理器做不了的,那么别的处理器可以用软件实现。处理器根本上的不同是速度!
  • 计算机的发展历程跟贝尔实验室有很大关系,而贝尔实验室的初衷只是为了做电话通讯,贝尔发明了电话。上网搜了一下,贝尔实验室现在竟然归诺基亚技术分享了。目瞪口呆!当然还有IBM发家是靠卖卡片的。晶体管发明人之一Shockley离开贝尔实验室去了加利福尼亚创办了第一家相关公司,然后就有了硅谷。
  • 计算机发展历史总结(via:http://blog.sina.com.cn/s/blog_7155b61b0100p8vj.html)

时间

事件

详情

1833

查尔斯·巴贝芝(英)设计解析机(并未亲自制造出来)。

解析机是19世纪最接近计算机的发明。设计中包含一个存储系统和运算器,最精华的部分是可以用卡片编程,并且可以进行条件转移指令。巴贝芝被誉为现代计算机的先驱。

1890

赫曼·霍勒瑞斯(美)设计制造制卡机。

制表机的发明主要是为了方便10年一次的全美人口普查,而发明者霍勒瑞斯本人就是1880年人口普查的统计员。该机器在1890年人口普查中大获成功,1896年他成立制表机公司,该公司1924年改名为国际商用机器公司(IBM)。

1935

康拉德·楚泽(德)设计制造第一台继电器计算机Z-1。

楚泽是公认的机电计算机之父,设计Z-1时他还是一名工程系的学生。Z-1采用的是二进制,可用电影胶片编程。楚泽用一生时间不断的对他的发明进行改进。

1943

霍华德·艾肯(美)设计制造第一台打制表格的数字计算机Harvard Mark I。

霍华德·艾肯当时是哈弗大学的研究生,因需要某种方法进行大量重复计算,所以与IBM合作,开发计算机。

1943

艾伦·M·图灵(英)等人设计制造真空管计算机Colossus。

Colossus用于破译德军密码。真空管很容易被烧毁,但维护的复杂程度要比继电器小的多。虽然真空管(微秒级)的速度要比继电器(毫秒级)快1000倍,但早期计算机并不十分关注运算速度问题,因为速度瓶颈主要集中于从纸带中读取程序的时间。

1945

摩尔电器工程学校设计制造真空管计算机ENIAC。

ENIAC用了18000个真空管,重30吨,是迄今为止最大的计算机。

1946

冯·诺依曼(匈出生-美国居住)提出存储程序概念。

存储程序概念:将指令顺序存放在存储中并用程序计数器来寻址,但同时也应允许条件转移。存储程序概念是一个革命性的思想,今天被称作冯·诺依曼体系结构,是现代计算机设计基础。但冯·诺依曼体系结构也有缺点,那就是要花大量时间从存储器中取指令到CPU处来准备执行,称冯·诺依曼瓶颈。

1948

克劳德·香农(美)在贝尔实验室期间提出"位"的概念,并确立了"信息理论"的研究领域。

信息理论涉及在噪声(经常阻碍信息传送)存在的情况下传送数字信息以及如何进行信息补偿等问题。

1947

威廉·邵克雷(美)、约翰·巴顿(美)和沃特·布拉顿(美)在贝尔实验室发明晶体管。

晶体管是20世纪最伟大的发明,三人因此获得1956年诺贝尔物理学奖。半导体是指其导电性可由多种方法来控制,它由锗、硅等纯半导体掺杂杂质制成。其作为逻辑开关的原理与继电器、真空管一样,但它的响应速度是纳秒级的,而且其使用寿命也足够的长。

1958

罗伯特·诺伊斯(美)和杰克·基尔比(美)同时发明集成电路。

集成电路(又称芯片、IC)依靠的是一种能在一个硅片上造成许多晶体管、电阻及其他电子组件的方法。

1965

戈登·E·摩尔(美)发现摩尔定律。

摩尔定律:每过18个月(一年半)可以集成到一块芯片上的晶体管数量都翻一番。

1971

Intel公司研制Intel4004,第一个"芯片上的计算机"(微处理器)。

Inter公司由罗伯特·诺伊斯和戈登·E·摩尔建立。前者发明了集成电路,后者发现了摩尔定律。Intel4004奠定了微处理器的三个主要参数,即数据宽度、时钟频率和寻址范围,这三个参数粗略的说明了处理器的运行速度。

 

19.两种典型的微处理器

  • 1974年4月,Intel推出了8080;1974年8月,Motorola推出了6800。同年,德州仪器推出了TMS 1000(4位处理器),国家半导体公司推出了PACE(16位处理器)。
  • Intel 8080有6000个晶体管,时钟频率为2MHz,可寻址空间64KB。8080的40个管脚中,有4个电源管脚,2个时钟输入管脚,16个地址管脚,8个输入/输出管脚,10个控制信号管脚。8080的每条指令的执行时间需要4~18个时钟周期,即2~9微秒。
  • 8080可以搭配Intel的8224时钟信号发生器提供时钟输入,使用8228系统控制芯片锁存控制信号。

技术分享 技术分享

  • 8080芯片有244条操作码/指令。如下:

存储和装载

32

STA [aaaa], A

3A

LDA A, [aaaa]

       

02

STAX [BC], A

0A

LDAX A, [BC]

       

12

STAX [DE], A

1A

LDAX A, [DE]

       

MOV指令

40

MOV B, B

50

MOV D, B

60

MOV H, B

70

MOV [HL], B

41

MOV B, C

51

MOV D, C

61

MOV H, C

71

MOV [HL], C

42

MOV B, D

52

MOV D, D

62

MOV H, D

72

MOV [HL], D

43

MOV B, E

53

MOV D, E

63

MOV H, E

73

MOV [HL], E

44

MOV B, H

54

MOV D, H

64

MOV H, H

74

MOV [HL], H

45

MOV B, L

55

MOV D, L

65

MOV H, L

75

MOV [HL], L

46

MOV B, [HL]

56

MOV D, [HL]

66

MOV H, [HL]

76

HLT

47

MOV B, A

57

MOV D, A

67

MOV H, A

77

MOV [HL], A

48

MOV C, B

58

MOV E, B

68

MOV L, B

78

MOV A, B

49

MOV C, C

59

MOV E, C

69

MOV L, C

79

MOV A, C

4A

MOV C, D

5A

MOV E, D

6A

MOV L, D

7A

MOV A, D

4B

MOV C, E

5B

MOV E, E

6B

MOV L, E

7B

MOV A, E

4C

MOV C, H

5C

MOV E, H

6C

MOV L, H

7C

MOV A, H

4D

MOV C, L

5D

MOV E, L

6D

MOV L, L

7D

MOV A, L

4E

MOV C, [HL]

5E

MOV E, [HL]

6E

MOV L, [HL]

7E

MOV A, [HL]

4F

MOV C, A

5F

MOV E, A

6F

MOV L, A

7F

MOV A, A

立即数MVI指令

06

MVI B, xx

           

0E

MVI C, xx

           

16

MVI D, xx

           

1E

MVI E, xx

           

26

MVI H, xx

           

2E

MVI L, xx

           

36

MVI [HL], xx

           

3E

MVI A, xx

           

算术运算

80

ADD A, B

88

ADC A, B

90

SUB A, B

98

SBB A, B

81

ADD A, C

89

ADC A, C

91

SUB A, C

99

SBB A, C

82

ADD A, D

8A

ADC A, D

92

SUB A, D

9A

SBB A, D

83

ADD A, E

8B

ADC A, E

93

SUB A, E

9B

SBB A, E

84

ADD A, H

8C

ADC A, H

94

SUB A, H

9C

SBB A, H

85

ADD A, L

8D

ADC A, L

95

SUB A, L

9D

SBB A, L

86

ADD A, [HL]

8E

ADC A, [HL]

96

SUB A, [HL]

9E

SBB A, [HL]

87

ADD A, A

8F

ADC A, A

97

SUB A, A

9F

SBB A, A

置CF=1

37

STC

           

CF取反

3F

CMC

           

逻辑运算(位运算)

A0

AND A, B

A8

XOR A, B

B0

OR A, B

B8

CMP A, B

A1

AND A, C

A9

XOR A, C

B1

OR A, C

B9

CMP A, C

A2

AND A, D

AA

XOR A, D

B2

OR A, D

BA

CMP A, D

A3

AND A, E

AB

XOR A, E

B3

OR A, E

BB

CMP A, E

A4

AND A, H

AC

XOR A, H

B4

OR A, H

BC

CMP A, H

A5

AND A, L

AD

XOR A, L

B5

OR A, L

BD

CMP A, L

A6

AND A, [HL]

AE

XOR A, [HL]

B6

OR A, [HL]

BE

CMP A, [HL]

A7

AND A, A

AF

XOR A, A

B7

OR A, A

BF

CMP A, A

立即数的算术逻辑运算

C6

ADI A, xx

D6

SUI A, xx

E6

ANI A, xx

F6

ORI A, xx

CE

ACI A, xx

DE

SBI A, xx

EE

XRI A, xx

FE

CPI A, xx

十进制算术运算

27

DAA

           

取反

2F

CMA

           

加1和减1指令

04

INR B

05

DCR B

       

0C

INR C

0D

DCR C

       

14

INR D

15

DCR D

       

1C

INR E

1D

DCR E

       

24

INR H

25

DCR H

       

2C

INR L

2D

DCR L

       

34

INR [HL]

35

DCR [HL]

       

3C

INR A

3D

DCR A

       

累加器循环左移

07

RLC

           

累加器循环右移

0F

RRC

           

累加器带进位循环左移

17

RAL

           

累加器带进位循环右移

1F

RAR

           

堆栈

C5

PUSH BC

C1

POP BC

       

D5

PUSH DE

D1

POP DE

       

E5

PUSH HL

E1

POP HL

       

PSW和累加器堆栈

F5

PUSH PSW

F1

POP PSW

       

对堆栈寄存器赋值

01

LXI BC, xxxx

           

对堆栈寄存器赋值

11

LXI DE, xxxx

           

对堆栈寄存器赋值

21

LXI HL, xxxx

           

对堆栈指针赋值

31

LXI SP, xxxx

           

堆栈的加1和减1指令

03

INX BC

0B

DCX BC

       

13

INX DE

1B

DCX DE

       

23

INX HL

2B

DCX HL

       

33

INX SP

3B

DCX SP

       

通常用于计算存储器地址

09

DAD HL, BC

           

19

DAD HL, DE

           

29

DAD HL, HL

           

39

DAD HL, SP

           

直接保存HL

22

SHLD [aaaa], HL

           

直接装载HL

2A

LHLD HL, [aaaa]

           

把HL的内容装载到PC

E9

PCHL PC, HL

           

把HL的内容装载到SP

F9

SPHL SP, HL

           

HL与堆栈顶端内容交换

E3

XTHL HL, [SP]

           

DE和HL交换

EB

XCHG HL, DE

           

条件:None

C9

RET

C3

JMP aaaa

CD

CALL aaaa

   

条件:Z not set

C0

RNZ

C2

JNZ aaaa

C4

CNZ aaaa

   

条件:Z set

C8

RZ

CA

JZ aaaa

CC

CZ aaaa

   

条件:C not set

D0

RNC

D2

JNC aaaa

D4

CNC aaaa

   

条件:C set

D8

RC

DA

JC aaaa

DC

CC aaaa

   

条件:Odd parity

E0

RPO

E2

JPO aaaa

E4

CPO aaaa

   

条件:Even parity

E8

RPE

EA

JPE aaaa

EC

CPE aaaa

   

条件:S not set

F0

RP

F2

JP aaaa

F4

CP aaaa

   

条件:S set

F8

RM

FA

JM aaaa

FC

CM aaaa

   

将累加器数据写入I/O端口

D3

OUT PP

           

将I/O端口数据读入累加器

DB

IN PP

           

禁止中断

F3

DI

           

允许中断

FB

EI

           

Restart指令转移至0000h

C7

RST 0

           

Restart指令转移至0008h

CF

RST 1

08

无效

CB

无效

   

Restart指令转移至0010h

D7

RST 2

10

D9

   

Restart指令转移至0018h

DF

RST 3

18

DD

   

Restart指令转移至0020h

E7

RST 4

20

ED

   

Restart指令转移至0028h

EF

RST 5

28

FD

   

Restart指令转移至0030h

F7

RST 6

30

     

Restart指令转移至0038h

FF

RST 7

38

     

无操作

00

NOP

           

 

  • 8080的累加器和寄存器,8080的3种寻址方式。

8080的累加器和寄存器

A

8位累加器

     

B

8位寄存器

   

C

8位寄存器

3种寻址方式

D

8位寄存器

 

E

8位寄存器

直接寻址方式

LDA A, [aaaa]

H

8位寄存器

间接寻址方式

MOV B, [HL]

L

8位寄存器

立即数寻址方式

MVI E, xx

 

  • MOV操作码由8位组成:01dddsss。其中字母ddd指代目的操作数的3位代码,sss指代源操作数的3位代码。代码000~111依次对应寄存器B、C、D、E、H、L、数据[HL]、累加器A。最初刚看到代码表的时候觉得无用的指令码真浪费,但是看到这里才觉得这个对应关系真的很巧妙啊!当然这个对应的设定跟CPU硬件设计应该有关系。
  • 8080芯片有5个标志位,进位标志位CF、零标志位ZF、符号标志位 SF、奇偶标志位PF和辅助进位标志位AF。所有标志位都保存在程序状态字(PSW:program status word)的8位寄存器中。像LDA、STA和MOV这样的指令不影响标志位,而 ADD、SUB、ADC和SBB指令影响标志位。影响的方式如下:

       ? 当运算结果最高位为1时,符号标志位SF = 1,表示结果为负。

     ? 当结果为0时,零标志位ZF = 1。

     ? 当运算结果中"1"的个数为偶数时,奇偶标志位 PF = 1;为奇数时,PF = 0。PF有时用来粗略地检测错误,此标志位在 8080程序中不常用。

     ? 当ADD或ADC运算产生进位或SUB与SBB运算发生借位(即不发生进位)时,进位标志位CF = 1。

     ? 当操作结果的低 4位向高4位有进位时,辅助进位标志位 AF = 1。此标志位只用在 DAA(十进制调整累加器)指令中。DAA能将16进制码方便的转成BCD十进制码。

 

其中,关于SUB和SBB运算的CF置位问题好长时间想不通,后来对比英文原版才发现,翻译应该是将进位(carry)错译成了借位(borrow),尼玛坑爹!而且在没有看到下面这个wiki的时候,我也没有注意到carry和borrow两者有什么不同,甚至还认为减数大于被减数时,产生的行为也称作进位。翻译坑爹 !翻译坑爹!翻译坑爹!看来以后涨姿势还是要努力提升英语水平的。

技术分享via:https://en.wikipedia.org/wiki/Carry_flag

  • 对累加器A按位取反的指令CMA,在结果上等价于 XRI A,FFh。
  • 单字节指令INR(加1)和DCR(减1)可影响除CF外的所有标志位。循环移位指令只影响CF标志位。
  • 对于乘2(左移1位)和除2(右移一位)操作,移位指令非常方便。
  • 堆栈(stack):。从底向上压入堆栈,从顶向下弹出堆栈,因此这也叫后进先出存储器,或 LIFO。    PUSH    POP
  • 堆栈用到的是正常的RAM的一部分,堆栈用堆栈指针(一个特殊的16位寄存器)寻址RAM。8080的堆栈是16位的。通常在子程序开始处应先堆栈(以后恢复)它需要使用的寄存器。
  • Call指令与Jump指令的不同之处在于:前者把一个新值装入到程序计数器 PC中,处理器保存PC中原来的地址到堆栈中。处理器最终可利用此地址返回到原来的位置,这个返回指令叫 Return。Return指令从堆栈中弹出两个字节,并把该值装载到PC中。
  • 在有些微处理器中,外围设备实际上占用了通常用来寻址存储器的地址,这种配置叫作内存映像I/O。在8080中,有256个附加地址专门为输入输出设备预留,这些是 I/O端口。在8080中,I/O访问由8228系统控制芯片锁存的信号控制。
  • 8080的INTE输出端信号表明允许中断。当外设需要中断微处理器当前工作时,它把8080的INT输入端设置为1。
  • Motorola的6800有一个16位程序计数器PC、一个16位堆栈指针SP、一个8位状态寄存器、两个8位累加器A和B以及一个16位索引寄存器(类似于8080的HL)。6800没有附加的8位寄存器,也没有I/O端口。6800没有奇偶标志位PF,但有一个溢出标志位(overflow flag)。关于16位地址,8080认为低位在前,高位在后。6800正好相反。

从1994年开始,Macintosh计算机开始使用Power PC, 一种由Motorola、IBM和Apple公司联合开发的微处理器。 PowerPC是由一种称作RISC(精简指令集计算机)的微处理器体系结构来设计的,它试图通过简化某些方面以提高处理器的速度。在 RISC计算机中,每条指令通常长度相同,(在PowerPC中为32位),存储器访问只限于装载和保存指令,且指令做简单操作而不是复杂操作。RISC 处理器通常有大量的寄存器以避免频繁访问存储器。

  • 现代(应该是1999的 现代吧)处理器有流水线技术和Cache(高速缓冲存储器)技术。现在酷睿i系列的Cache不是都有3级缓存了么,发展真快啊!

20.ASCII码和字符映射

  • 使打印头回到开始处,以便从纸的左边开始打印下一行,是回车。移动打印头紧接至刚完成的那一行的下一行,是换行。
  • BCD码:又称二-十进制代码。这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。最常用于会计系统的设计里,相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时间。常见BCD编码有8421BCD码,2421BCD码,余3码。
  • 美国信息交换标准代码,简写为ASCII码,在"技术"上是7位编码,但普遍按1个字节存储。因此有扩展的ASCII字符集,最高位是1。

技术分享

  • ANI A, DFh:除了从左边数第3位被置成0。把这个位设置为0也即把ASCII码表示的小写字母转换成大写字母。很巧妙!
  • 根据公开的ASCII码标准,10个ASCII码代码(40h、5Bh、5Ch、5Dh、5Eh、60h、7Bh、7Ch、7Dh和7Eh)可用来重新定义而为某一国家使用。另外,如果需要,数字符号( #)可用英镑符号(£)替换,美元符号( $)可用通用货币符号(¤)替换。
  • ASCII码是单字节字符集,最多表示256个字符。为了表示更多字符,有了双字节字符集,有了Unicode,可以表示65536个字符。同时Unicode兼容ASCII码。
  • 关于Unicode和UTF-8的讨论:https://www.zhihu.com/question/23374078
  • GB2312、GBK、GB18030 这几种字符集的主要区别是什么?https://www.zhihu.com/question/19677619

 

《CODE》读后笔记——第14~20章