《编码-隐匿在计算机软硬件背后的语言》-读书笔记

1.电筒密谈

2.编码与组合

3.布莱叶盲文与二元编码

4.手电筒剖析

5.绕过拐弯的通信

6.发电机与断电器

7.十进制计数法

8.其他进位制计数法

9.二进制数

10.逻辑与开关

11.逻辑门电路

12.二进制加法机

13.如何实现减法

14.反馈与触发器

使用继电器实现加法、减法和计数

15.字节与十六进制

用8位的原因是它表示一个字节(byte)

16.存储器组织

锁存器
读/写存储器,也通常叫做随机访问存储器或者RAM(Random Access Memory)
称它为存储器是因为它能保存信息,称为读/写存储器是因为可以在每个锁存器中保存新的数据(也就是写数据)
同时还可以查看每个锁存器中所保存的数据(也就是读数据)
RAM配置通常称作RAM阵列
当关掉电源后,所有继电器的触点将回到未触发状态,RAM中的内容也将永远丢失
这就是RAM也称为意失性存储器的原因,它需要恒定的电影来保持其中的内容

17.自动操作

人类是非常富于创造性而且是十分勤勉的,但是,人类在本质上也是十分懒惰的。

  • 自动加法器

    1. 要做加法,需先从存储器传送一个字节到累加器中,这个操作叫做装载(Load)
    2. 第二项所要执行的操作是把存储器中的一个字节加(Add)到累加器中
    3. 第三项是从累加器中取出结果,保存(Save)到存储器中
    4. 最后,需要有一些方法是自动加法器停止(Halt)工作

怎样完成这些工作呢?只是简单地键入一组数到RAM中并期望自动加法器来正确操作是不可能的。
对于RSAM中的每个数字,我们还需要一个数字代码来表示自动加法器所要做的工作:装载、加、保存或停止。
也许最容易的方法是把这些代码存储在一个完全独立的RAM阵列中。这第二个RSAM阵列与最初的阵列同时被访问,
但它存放的不是要加的数,而是用来表示自动加法器将要对最初的RSAM阵列的相应地址进行某种操作的代码。
这两个RSAM阵列可以分别表为数据(最初的RAM阵列)和代码(新的RAM阵列)。
代码RAM中的每个代码或者对于于数据RAM中一个要装入或加到累加器的数,或者表示一个要存回到存储器中的数。
这样的数字代码通常被陈祚指令码或操作码,它们”指示“电路执行某种”操作“。

操作码                  代码
Load                    10h
Store                   11h
Add                     20h
Subtract                21h
Add with Carry          22h
Subtract with Borrow    23h
Jump                    30h
Jump If Zero            31h
Jump If Carry           32h
Jump If Not Zero        33h
Jump If not Carry       34h
Halt                    FFh
每个操作码在存储器中栈1个字节。除了”停止“操作码外,现在希望每条指令在存储器中栈3个字节,
其中第一个字节为代码本身,后两个字节存放一个16位的存储器单元地址。
对于装载指令来说,其地址指明数据在数据RAM阵列中的存储单元,该存储单元存放要装载到累加器中的字节;
对于加法、减法、进位加法和借位减法指令来说,地址指明要从累加器中加上或者减去的字节的存储单元;
对于保存指令来说,地址指明累加器中的内容将要保存的存储单元;
(汇编语言?)

从存储器中取出指令的过程叫做取指令。
机器响应指令代码执行一系列操作称为执行指令。
世界上没有免费的午餐。通常,机器在某一方面好一点儿,在另一些方面必然会差一些。

通常,自动加法器顺序寻址RAM阵列。转移指令(Jump)改变其寻址模式,而从RAM阵列的某个特定地址开始寻址。
这样的命令有时也叫分支指令(branch)或者goto指令,即”转到另外一个地方“。
条件转移指令:只在符合条件时才进行转移指令,在乘法累加器中使用,可用来控制重复或循环,用类似的方法,它也能计算两个数的除法。

数字计算机:因为它采用的是离散值。
数字计算机有4个主要部分:处理器、存储器、至少一个输入设备和一个输出设备。
在上述机器中,存储器是一个64KB的RAM阵列。输入和输出设备分别是RAM阵列控制面板的几行开关和灯泡。
处理器是计算机中除存储器、输入/输出设备以外的一切东西。
我们所建造的处理器是一个8位处理器。处理器有一些组件,已经确定的一个是累加器,它是一个简单的锁存器,用来在处理器内部保存数据。我们所设计的计算机中,8位反向器和8位加法器一起称作算术逻辑单元(ALU)。ALU只能进行算术运算,主要是加法和减法。在稍微复杂一点儿的计算机中,ALU也可进行逻辑运算,如”&“,”|“,”^“。16位计算器叫做程序计数器PC,我们的计算机是用继电器、电线、开关和灯泡建造的,所有这些都是硬件。
指令和输入存储器中的其他数据叫做软件,之所以叫”软件“是因为它们比硬件更容易改变。”软件“和”计算机程序“是同义的。在计算机程序中,可以区分代码(即指令)和供代码使用的数据,有时这种区分并不明显。计算机程序设计有时也叫编写代码或编码。处理器可以响应的操作码(比如装载的10h和存储的11h)叫做机器码,或机器语言。
LOD A, [1003h]
位于助记符LOD右边的A和[1003]叫操作数,它们是特定的装载(Load)指令的操作对象。左边的操作数为目的操作数(A代表累加器),右边的为源操作数,方括号表示要装载到累加器中的值不少1003h,而是存储器在存储器地址1003h中的值。
ADD A, [001Eh]
STO [1003h], A
JNZ 0000h // 零标志位不为1时转移到0000h处
JNZ指令没有使用方括号,这是因为该指令是转移到地址 0000h 处而不是转移到地址 0000h 中保存的值所表示的地址处。

为了表示某一指令存储在一地址,可以用一个十六进制地址后加冒号来表示:
000h: LOD A, [1005h]
下面表示了一些存储在某一地址的数据:
1000h: 00h, A7h
1002h: 00h, 1Ch
1003h: 00h, 00h
用逗号隔开的两个字节表示第一个字节保存在左边的地址中,第二个字节保存在紧接着该地址的下一个地址中。
上述三行相当于:
100h: 00h, A7h, 00h, 1Ch, 00h, 00h,因此,整个乘法程序可写成下一系列语句:
000h: LOD A, [1005H]
ADD A, [1001h]
STO [1005h], A
LOD A, [1004h]
ADC A, [1000h]
STO [1004h], A
LOD A, [1003h]
ADD A, [001Eh]
STO [1003h], A
001Eh: HLT
JNZ 000h

BEGIN: LOD A, [RESULT+1]
ADD A, [NUM1+1]
STO [RESULT+1], A
LOD A, [RESULT]
ADC A, [NUM1]
STO [RESULT], A
LOD A, [NUM2+1]
ADD A, [NEG1]
STO [NUM2+1], A
JNZ BEGIN
NEG1: HLT
NUM1: 00h, A7h
NUM2: 00h, 1Ch
RESULT: 00h, 00h

以上表示的是一种计算机程序设计语言,称作汇编语言。汇编语言的每条语句都对应于机器代码的特定字节。
它是全数字的机器代码和指令描述性语言的综合,且存储器地址用符号表示。
上述机器可以进行乘除法运算,也可以利用这些基本功能进行平方根、对数和三角函数的计算。
机器所需要的只是用例进行加法、减法的硬件及利用条件转移指令来执行适当代码的一些方法。
正如一个程序员所说:”我可以用软件完成其余功能“。当然,软件可能相当复杂。

18.从算盘到芯片

美国18901年人口普查 -> 霍勒斯的制表机 -> C-T-R公司 -> 国际商用机器公司(IBM)
继电器机器称为电式计算机,真空管则是第一台电子计算机的基础。(继电器->晶体管->真空管)

指令应该在存储器中顺序存放并用程序计数器来寻址,但也应该允许条件转移。
这种设计思想叫做存储程序概念。这种设计思想是重要的革命化的一步,今天称为冯诺依曼体系结构。
但冯诺依曼体系结构也带来冯诺依曼瓶颈,即需要花费大量的世界从存储器中取出指令来准备执行。

美国电话电报公司在1925年正式把它的科学和技术研究部分与商业部分分离,另外建立附属机构,这样贝尔实验室就诞生了。
贝尔电话实验室许多年里都是这样一个地方:聪明的人可以在此做他感兴趣的任何事。
贝尔实验室为早期的计算机作出了突出的贡献。在20世纪70年代,
贝尔实验室诞生了很有影响的操作系统UNIX和程序设计语言C语言。

真空管原是为放到信号而开发的,但它们也用来作为逻辑门的开关。晶体管也是如此。
由继电器构造逻辑门和其他部件的知识也适用于晶体管。继电器、电子管和晶体管最初主要用来放大信息,
但也可用同样的方法连接成逻辑门来建造计算机。

晶体管使得在一个小空间里能安装更多的逻辑门,但是连接晶体管形成逻辑门像继电器和真空电子管一样困难。
一些晶体管的连接会重复出现。许多对晶体管都是先连接成门,门再连接成触发器、加法器、选择器或译码器,
触发器再组成多位锁存器或RAM阵列。
如果晶体管事先能连接成通用的结构,那么组装一台计算机就很容易了。

集成电路要经过复杂的工序才能生产出来,这些工序包括把很薄的硅晶片分层,精确地上涂料,和在不同的区域蚀刻形成微部件。
实际的硅晶片很薄且很脆弱,为了保护芯片并提供某种方法使芯片中的部件与别的芯片连接,芯片必须安全地封装。

TLL(晶体管-晶体管逻辑)中,00.8V之间的电压视为逻辑”0“,25V之间的电压视为逻辑”1“,应当避免出现0.8~2V之间的输入电压。TTL的典型输出是0.2V代表逻辑”0“,3.4V代表逻辑”1“。

然而,处理器根本的不同是在速度上。同时,速度也是我们为什么使用计算机的一个重要原因。
最大始终频率是影响处理器总体速度的一个显著因素,始终频率决定了每一条质量的执行速度。
处理器的数据宽度也影响其执行速度。
令人迷惑的是,处理器可寻址的最大存储容量也是影响处理器速度的一个因素。

19.两种典型的微处理器

微处理器——集成计算机中央处理器(CPU),其所有组件在一个硅片上。
1971年的Intel 4004是第一个微处理器,其中有2300个晶体管。
处理器只是整个计算机的一部分。此外,计算机至少还需要一些随机访问存储器(RAM)、
供人们输入信息到计算机的方法(输入设备),供人们从计算机获取信息的方法(输出设备),
以及其他可把这些所有东西连接在一起的芯片(驱动程序里的芯片?)。

LDA A, [aaaa] # 直接寻址
MOV B, [HL] # 间接寻址
(MOV指令的表明用HL寻址的存储器地址作为目的操作数,HL分别表示一个16位地址的高位和地位)
另一种类型的传送指令叫做传送立即数,指令的助记符为MVI。传送立即数占2个字节,第一个是操作码,第二个是1个字节的数据。

Intel 8080的标志位

进位标志位CF、零标志位ZF、符号标志位SF、奇偶标志位PF、辅助进位标志位AF
所有标志位都保存在另一个叫做程序状态字(PSW: program status word)的8位寄存器中。
像LDA/STA/MOV这样的质量不影响标志位,而ADD/SUB/ADC/SBB指令却要影响标志位。
算术运算和逻辑运算都可通过处理器的算术逻辑单元(ALU)来执行。
乘2(左移一位)、除2(右移一位)

最上面的文件夹总是最高优先级的工作,已这种方式工作的存储器叫做堆栈(stack)。
从底向上压入堆栈,从顶向下弹出堆栈,因此这也叫后进先出(LIFO)存储器。
计算机中也可以使用堆栈,不是用来保存工作而是用来存储数据。且已经证明使用起来非常方便。
堆栈只是不被别的东西使用的正常的RAM的一部分。
8080微处理器包含一个特殊的16位寄存器对这一部分存储器进行寻址,这个16位寄存器叫做堆栈指针。
PUSH/POP堆栈的时候就是通过堆栈指针来进行上移/下移来进行读写的。
堆栈可能会出现溢出问题。

8080指令的转移指令
处理器中有一个叫程序计数器(Program Counter)的寄存器,它包含处理器取回并指向的指令的存储器地址
通常Prgoram Counter使处理器顺序执行存储器中的指令,但有些指令——通常命名为Jump(转移)、Branch(分支)或 goto

Call(调用)指令
Call指令与Jump指令的不同之处在于:前者把一个新值装入到程序计数器Program Counter中,
处理器保存PC中原来的地址,保存在哪里?当然,在堆栈中。
这种策略意味着Call指令可有效地保存”程序从哪里跳转“的标记,处理器最终可利用此地址返回到原来的位置。
这个返回指令叫Return,Return指令从堆栈中弹出两个字节,并把该值装载到Program Counter中。

计算机的外围设备是指连接到微处理器而不是存储器的东西。
微处理器是怎样与外围设备进行通信的?外围设备具有与存储器相似的接口(抽象与复用!),
微处理器可通过对应于外设的具体地址来对外设进行读写。
在有些微处理器中,外围设备实际上占用了通常用来寻址存储器的地址,这种配置叫做内存映射I/O。
然而在8080中,在65536个正常地址外还有256个附加地址专门为输入输出设备预留,这些就是I/O端口(I/O Port)。
OUT指令用于把累加器中的数据写到紧跟该指令的字节所寻址的I/O端口中。
IN指令把端口的数据读入到累加器中。
外围设备有时需要引起微处理器的注意。这由称作中断(interrupt)的机制来完成。这是由连接至8080INT输入端的、由外围设备产生的信号。
当外设需要中断微处理器当前工作时,它把8080的INT输入端设置为1。
8080通过从存储器中取出指令对它作出响应,比如调整到一些代码的位置执行从键盘读取数据的指令。
还有一个操作数是NOP,代表no operation(无操作),NOP指令使处理器什么都不做。

装载、保存、加法、减法、移位、转移、调用。
按照摩尔定律,微处理器中的晶体管数量每18个月翻一番。
这些多增加的晶体管,有些用于增加处理器的数据宽度,另外一些用于处理新的指令。
还有一些用来进行一些重复计算,以便在计算机屏幕上显示图片和电影。
流水线技术使得处理器在执行一条指令的同事可以读取下一条指令。
现在的处理器还包含一个Cache(告诉缓冲存储器),它是做在处理器内部的快速RAM阵列,
用于保存最近执行的指令。因为计算机程序经常执行一些小的指令循环,所以Cache可以避免这些指令重复装载

20.ASCII码和字符映射

数字计算机存储器按位存储,所以在计算机上处理的信息必须按位的兴衰存储。
如果用位信息来表示文本?必须开发一些系统使得系统里的每一个字母有唯一的编码。
这样的系统叫做字符编码集,每一个编码叫做字符编码。

电传打字机的键实际上是转换器,它产生二进制代码并且通过电传打字机的输出电缆一位紧接一位地传送出去。
电传打字机也有打印机制,从电传打字机的输入电缆输入的代码触发电磁铁在纸上打印出字符。

当电传打字机上打字并且到了一行的末尾,按下一个杠杆或按钮来完成两件事情:
第一:使打印头回到开始处,以便从纸的左边开始打印下一行,这是回车(Return)。
第二:移动打印头紧接至刚完成的那一行的下一行,这是换行(Line Feed)。
响铃代码用来敲响电传打字机上能听见的铃声。

我们更想采用能唯一表示字符或标点符号且对大小写进行区分的代码。
这些字符编码都是什么呢?因为很少有独立制造和使用计算机这种情形,所以通常是大家遵循并使用同一编码。
我们已经有了这样一个标准,即美国信息交换标准代码,简写为ASCII码(American Standard Code for Information Interchange)。
ASCII码是7位编码,用二进制代码00000001111111来表示,即十六进制代码00h7Fh
ASCII码中能显示出来的代码也称作图形字符,另外还包括33个控制字符,他们不能显示出来但表示执行某一特定功能

尽管ASCII码是计算机世界里最重要的标准,但它最大的问题在于它太倾向于美国。
ASCII码扩展字符集使用8位来存储字符而不是7位。
Unicode编码:能适用于世界上所有语言的编码,用来代替ASCII码。
Unicode编码才有16位存储,每一个字符需要1个字节,可以表示65536个不同字符。
Unicode编码不是从零开始的,开始的128个字符编码0000H-007Fh与ASCII码字符一致。
00A0h~00FFh也与前面的对SCII码扩展字符集一致。

对Unicode编码来说,它改变了一个文本字符与1个字节存储器之间的等效关系。

21.总线连接

处理器无疑是计算机中最重要的部件,但并不是唯一的部件。RAM是意失性的,当断电的时它的内容就会丢失。
所以计算机还有另一个有用的部件是永久存储设备,断电后依然可以保存代码和数据。

组成一台完整计算机的所有集成电路必须安装在电路板上。但更常见的是,不同的部件分开安装在两块或更多的板上,这些版之间通过总线互相同学。
总线是提供给计算机每块电路板的数字信号的集合,这些信号可以分为4类:
地址信号:这些信号由微处理器提供,常用来寻址RAM单元,也可用来寻址连接到计算机上的其他部件
数据输出信号:也由微处理器提供,用来写入数据到RAM或其他设备。数据输出信号是从微处理器输出,相对RAM和其他设备来说就是输入信号
数据输入信号:由计算机的其他部分提供,由微处理器读入的信号。数据输入信号通常来自于RAM的输出,也即表示微处理器读入存储器内容,但是其他部件也提供数据输入信号给处理器
控制信号:由各种各样的信号组成,通常与计算机的特定处理器的控制信号一致。控制信号可来自于微处理器或从其他部件传送至微处理器。
另外,总线给计算机中的各个电路板提供电源。

S-100总线,基于8080芯片,有一块较大的板称为母版或主板,上面有若干个忽略连接起来的S-100总线插槽,这些插槽有时也叫扩展槽。
S-100总线上还有8个中断信号,这些信号由哪些需要CPU立即做出响应的部件产生。
如当在键盘上敲一个键时键盘会产生中断信号。8080的电路板上通常还有一个芯片称作Intel 8214优先级芯片上的中断控制单元,它用来会处理这些中断。当中断产生时,中断处理单元产生一个中断信号给8080,8080响应中断。

DMA(Direct memory access,直接存储器访问)请求信号:DMA允许存储设备比采用别的方法更快地进行操作。通常,未处理处理所有的内存读/写操作,但通过DMA,其他设备可绕过微处理器通过总线直接进行内存读/写操作。

2102芯片的三态输出:除了逻辑0和逻辑1外,数据输出信号还可以是第三种状态,这种状态就是什么都不是,
就好像芯片的引脚什么都没有连接。三态输出对总线的操作至关重要。连到总线上的所有芯片都可以使用总线上的数据输入信号向处理器传送石数据。任何时候,连到总线上的众多电路板中只有一个用来确定总线上的数据输入信号是什么,其他电路板不被选中,输出为第三态。

连到计算机上的CRT通常称为视频显示器或监视器,提供信号给显示器的电子部件称为视频适配器。
视频适配器是计算机中的一块电路板,通常称为视屏卡。视频显示器或电视剧的图像虽然看起来似乎很复杂,但它实际上是由一束连续的射线很快的扫过屏幕,然后很快回到左边,开始第2行。每个水平行称为扫面行,每次回到下一行的开始称为水平回归。当射线扫描完最后一行后,就从屏幕右下角回到左上角(垂直回归)。由于扫描速度很快,图像在屏幕不会出现闪烁。

黑白电视部分是数字的,部分是模拟的。图像在垂直方向分成525行,但每一个扫描行的电压是连续变化的——
用来模拟图像的可是强度。但是电压并不是无限制地变化,电视机能响应的信号变化评率有上限,称为电视机带宽。
带宽是通信中很重要的概念,它关系到某个传输媒体上能够传输的。
在电视机中,带宽限制了视频信号变化的速率,即允许电视机每秒扫描出的像素个数。
视频适配器需要一些RAM来存储所显示的信息,微处理器可以向这个RAM写入信息用来改变屏幕显示的信息。
更为方便的是,这个RAM可以是微处理器存储空间的一部分。

长期存储设备
早期使用的方法是在纸上或卡片上打孔,就像IBM的穿孔卡片。但是穿孔卡片不能重复使用,效率低下且存储信息密度低。
现在最流行的长期存储器类型是磁介质存储器:使用电磁铁来记录和读取信息,根据信息输入先磁化,再根据磁化强度欢迎为电流输出信号。
1928年,在澳大利亚发明了一种磁记录设备,该设备是在很长的纸袋上采用最初用于生产香烟上金属带的技术覆盖铁离子,很快一种强度更高的醋酸盐纤维代替了纸。这便成为了后来的磁带。然而,磁带并不是理想的介质,因为不能很快地移动到磁带上的任一点进行访问,前进和倒退要花费很多时间。
从几何观点看,能够进行快速访问的截止是磁盘。磁盘围绕中心旋转,链接到臂上的一个或多个磁头从磁盘外部向中间移动。磁盘上的任何区域都能快速访问。
磁盘通常分为软盘和硬盘。软盘是由覆盖磁性物质的塑料片组成,外面是起保护作用的厚纸板或塑料包装(塑料包装保护磁盘不被弯折)。软盘必须插入软盘驱动器,这是连接到计算机上的一个部件,用来向软盘写或从软盘读取信息。软盘可以从软盘驱动器中取出来,用来在计算机之间传递数据。磁盘现在仍然是商用软件中一个重要的分发媒体。
硬盘通常由多个金属磁盘组成,永久性地做在驱动器里。硬盘通常比软盘速度快,并可存储更多的数据。但是,硬盘中的磁盘自身不能移动。
磁盘的表面分成很多同心圆,称为磁道。每个磁道又分成像圆饼切片一样的扇区,每一个扇区存放一定数量的字节,通常为512字节。通常,每次从磁盘到RAM传输的数量是磁盘扇区字节数(512字节)的倍数。

当微处理器输出一个地址信号后,通常是寻址RAM而不是磁盘。
从磁盘取出数据到RAM供微处理器访问需要额外的步骤,即需要微处理器执行一段小程序去访问磁盘驱动器,
使磁盘磁动器把数据传输到内存。
随机访问存储器就像桌面上的东西,可以直接拿来使用;
磁介质存储器就像一个文件柜,如果要用文件柜里的东西,需要站起来,走到文件柜钱,找到需要的文件,并带回到桌面上。如果桌面上太拥挤,还需要把桌上的一些东西拿回到文件柜中去。

22.操作系统

一直以来,我们似乎在组装这一台完成的计算机。它有一个微处理器、一些随机访问存储器、一个键盘、一个视频显示器和一个磁盘驱动器。我们全身贯注于开关,给它加电,带给他声明。但我们还缺少一些东西,现在当打开计算机电源后,我们在屏幕上看到的只是一些随机的ASCII字符。

这里缺少的正是软件。当微处理器加电或复位时,它执行内存中某个地址里存放的机器代码。
对8080来说,这个地址是0000h。对正确设计的计算机来说,加电时,改地址处就应该有一个机器代码指令(很可能是多个指令中的第一套)。
机器代码指令又是怎样放到内存的那个地方的呢?
在新设计的计算机中,把软件放到合适地方的处理过程可能是最令人费解的。
先从一个控制面板着手,控制面板的复位开关ON,复位微处理器,终止执行机器码,处理器就什么都不做。
当断开这个开关后,微处理器开始执行机器码,即接收总线上的地址信号和数据信号。
尽管控制面板不需要许多硬件,但却不容易使用。它所采用的输入/输出方法是最坏的方法,还将数字0/1来作为按键。首先要做的是去掉控制面板,用键盘来进行输入和使用显示器进行输出。

前面讲过键盘输入时会产生中断信号,中断控制单元会使得微处理器响应,执行一条RST指令。
这条指令使得微处理器在堆栈中保存当前程序计数器的值并调整到地址0008h处。
从这个地址开始,可以输入一些代码,这些代码称为键盘处理程序。
为了使一切都正常工作,还需要一些代码在微处理器复位时执行,这些代码叫做初始化程序。
初始化程序首先设置堆栈指针,使得堆栈分配到内存的有效区域。
然后,把视频显示器的每个字节设为为ASCII码的空格,用于去掉屏幕上的随机字符。
接着设置贯标的位置,然后产生一条中断指令,值得微处理器可以响应键盘中断
在此之后是HLT指令,它停止微处理器的工作。
由于执行了HLT指令,计算机很可能处于停机状态。
能够把计算机从停机状态唤起的事件仅来自于控制面板的复位信号或从键盘来的中断信号。

无论何时在键盘上按下一个键,中断信号都使得微处理器从初始化程序最后的HLT语句跳转到键盘处理程序。
键盘处理程序用IN指令来确定按下的键,然后根据按下的键来执行一些动作(即键盘处理程序处理每一个案件)
接着执行一条RET(Return)指令,最后又回到HLT语句等待下一个键盘中断。

键盘处理程序在处理Return或Enter建的时候,视频显示存储器的这一行字符被解释成对计算机的一个命令。
采用键盘处理程序和命令处理程序进行工作是一个重要的里程碑。有了它,无需再用什么控制面板,从键盘输入容易、迅速且效果良好。
然而当断电时输入的所有代码会丢失,正因为如此,可能要把这些新代码存到只读存储器(ROM)中。
命令处理程序的创建是一个重要的里程碑,不仅因为它对输入到内存中的字节提供了较快的解释,而且使计算成为交互式的了。
一旦有了ROM中的命令处理程序,就可以开始试着从内存中写入数据到磁盘驱动器(可能是对应于磁盘扇区大小的块),并且把数据读回到内存。
S 2080 2 15 3 #这个命令表示要从地址2080h处开始的内存块将要存放到磁盘的第2面,第15磁道,第3扇区
L 2080 2 15 3 #这个命令表示把该扇区的内容从磁盘送回到内存中

在磁盘扇区中管理记录数据很繁琐且容易出错,所以诞生了文件系统。
文件系统是指在磁盘存储器中按文件来组织数据的方法。文件是存放在一个或多个扇区中相关数据的集合。
更重要的是,每个文件有一个文件名作为标识,便于记住文件中包含的内容。
文件系统通常是称作操作系统的较大软件集合的一部分。键盘处理程序和命令处理程序也包含在操作系统中。

回顾历史,最重要的8位微处理器操作系统是CP/M,是为Intel 8080微处理器而写的。
CP/M存放在磁盘中,早期CP/M最常用的存储介质是单面8英寸磁盘,有77个磁道,每道26个扇区,每扇区128个字节,磁盘的头两个磁道包含有CP/M。CP/M盘中余下的75个磁道用来存储文件。
CP/M的文件系统虽然简单,但却满足两个基本的要求:
1.每个文件都有一个名字作为标识,这个名字也存在磁盘中。其实CP/M用来读取文件所需的全部信息都与文件一起存放在磁盘中;
2.文件在磁盘中并不占据连续的扇区,这是因为经常创建和删除不同大小的文件产生的。文件系统具有把大文件存放在不连续扇区的这种能力是非常有用的。

用来存放文件的75个磁道按分配块进行分组,每一个分配块有8个扇区,即1024字节。磁盘中共有243个分配块,编号从0~242。
开始的两个分配块(共2048字节)用作目录区。
目录区是磁盘中的一个特殊区域,用来存放磁盘中每一个文件的名称和一些主要信息。
存在磁盘中的每一个文件需要一个目录项,占32字节,目录项包含有以下信息:
字节 含义
0 通常设为0
1~8 文件名
9~11 文件类型
12 文件扩展
13~14 保留(设置为0)
15 最后一块的扇区数(表明最后一个分配块中实际用到了多少个128字节的扇区)
16~31 磁盘存储表(表明了该文件所存放的分配块)

CP/M自身存放在磁盘的头两个扇区。为了执行它,CP/M必须从磁盘装载到内存。
使用CP/M的计算机中,ROM并不需要很多,它只需要用来存放一小段代码,称为引导程序(因为这段代码通过自举来引导操作系统的其余部分)。
引导程序把磁盘最开始的128个字节的扇区装入内存并执行,这个扇区包含把CP/M的其余部分转入内存的代码。
整个这个过程称为引导操作系统。最终,CP/M把它自己安排在RAM的最高地址区域。

0000h 系统参数
0100h 临时程序区域(TPA, Transiant Program Area)
控制台命令处理程序(CCP, Console Command Programmer)
基本磁盘操作系统(BDOS, Basic Disk Operation System)
最高地址: 基本输入/输出系统(BIOS, Basic Input Output System)

CP/M(像其他操作系统已于)可以提供命令和实用程序以便对文件进行基本的操作
CP/M可以装载程序到内存并执行
为程序提供方便访问计算机硬件的手段是操作系统的第三个主要功能(因为CP/M不会自己去做像诸如直接从键盘读入输入的内存或者是从磁盘读取/写入文件的事情,而是为运行在CP/M下的程序提供一种能力,子程序以此来完成这些公共事务)。
操作系统提供的这种访问手段称之为应用程序接口,即API(application programming interface)。在CP/M下运行的程序通过设置寄存器C为某一特定值(叫做功能值)来使用API并执行指令。

BDOS正如它的名字一样,基本左右是维护磁盘上的文件系统。通常BDOS必须利用CP/M基本输入/输出系统(BIOS)中的子程序,而BIOS可实现对键盘、视频显示器以及磁盘驱动器这样的硬件的访问。
实际上,BIOS是CP/M中唯一需要了解计算机硬件的部分。

API是与设备无关的计算机硬件接口,它不需要知道某一机器上键盘的工作机制、视频显示器的工作机制或者读写磁盘扇区的工作机制,它只是简单地利用CP/M的功能来完成涉及到键盘、显示器和磁盘的工作。这样CP/M程序就可以在不同的计算机上运行。

理论上讲,应用程序只能通过对操作系统提供的接口来访问计算机的硬件。但在处理视频显示器的时候直接写入字节到视频存储器的程序比采用其他方式的程序执行速度更快。

UNIX最初是为只一个人使用时打且昂贵的计算机而编写的。使用UNIX的计算机通过分时技术允许多个用户同时与计算机交互操作。并行运行多道程序的操作系统称为多任务操作系统。显然这会复杂得多,因为多个用户可能会试图访问同一个文件。多任务同样也会影响到计算机如何为不同程序分配内存,所以需要进行内存管理。由于躲到程序并行执行需要更多的内存,因而很可能计算机没有足够的内存来分配。操作系统可能需要采用虚拟内存技术,当程序不需要某些内存块时可以把它们存放在临时文件中,等需要时再读回内存。

23.定点数与浮点数

IEEE浮点数标准定义了两个基本格式:单精度格式,需要4个字节;双精度格式,需要8个字节。
单精度格式有3个部分:1位为符号位(0为正,1为负)、8位的指数位和23位的有效数位
总共有32位,4个字节,因为规格化二进制浮点数的有效数通常在二进制小数点左边为1,
所以IEEE格式中这一位不包含在浮点数的存储空间中,有效数的23位小数部分是真正被存储的部分,
所以,即使只有23位用来存储有效位,精度仍然认为是 24位的
8位指数范围从0到255,称为移码指数,意思是必须从指数中减去一个数(称为偏移量)才能确定有符号指数的实际值。对单精度浮点数,偏移量为127
s(符号位)、e(指数)和f(有效数)
(-1)^s * 1.f * (2^e - 127)
双精度:1位符号位+52位有效数+11位指数位,总共64位,8个字节
不管对于单精度还是双精度,都存在表达精度的问题,当数的二进制表示超出位数后则会产生表达失真

24.高级语言与低级语言

汇编程序所做的工作是:读入一个汇编语言程序(通常称作源代码文件,产生一个包含有机器码的文件——可执行文件)
从大的方面来看,汇编程序是相当简单的程序,因为在汇编语言助记符与机器码之间存在一一对应的关系。汇编程序把每一个文本行分成助记符和参数,然后把这些单词与一张表相对照,该表中存有所以可能的助记符和参数。
通过这种对照就可以找到每个语句所对应的机器码指令。

汇编语言陈祚低级语言,因为它与计算机硬件密切相关。
高级计算机语言是审慎而周密的概念语言,因为语言定义了人们如何想计算机发送指令,发明程序设计语言面临的挑战是如何使语言具有吸引力。
高级语言必须有编译程序用来将高级语言转换成机器码。
高级语言使得处理器更容易使用,但并没有使它的功能更强大。
而是要汇编语言可以最大新阿杜地利用处理器的能力。

程序设计更多的是涉及和组装的过程,就像是在架设一座大桥。
C语言来自于一种早期的语言B,B是BCPL(Basic CPL)的一种简单版本,而BCPL又来自于CPL(Combined programming language)。
早期时候许多操作系统都是用汇编语言针对特定处理器而编写的。
1973年,UNIX采用C来编写(确切地说是重写),从那时其,操作系统和C语言的关系就开始紧密起来
C语言支持指针,指针实质上是数字化的内存地址。
面向对象程序设计语言

25.图形化革命

通常高级程序设计语言的代码和数据之间有区别。这种区别源自冯诺依曼计算机体系结构。在这种架构体系里,要么是机器码,要么是机器码用于操作的数据。而在面向对象的程序设计中,对象是代码和数据的组合。在对象中,数据存储的实际方法只能通过与该对象相关联的代码才能理解。对象通过发送或接收与其他对象同学,它给一个对象发送指令会从那里获得信息。