《编码的奥秘》读书笔记

本想花三天的时间,把编码奥秘读一遍,实际上已经过去5天了,还没有读完这本书;写读书笔记的目的,不在于传播,而仅在与记录自己收获到了什么。

文章目录


从引人读下去的电筒的奥秘,以及信息的表达形式的简化,引入了摩尔斯电码,进而讲述了布莱叶盲文与二元编码,再次回到电筒的组成原理,讲述了电的一些简单概念,开关的闭合,电阻的性质;然后再次引入电流,可以代表光的直线传播进而传递信息,讲述了电报机的发展历史,以及电磁继电器的巧妙作用。到这里,可以通过电的开关性质,记录下传递的摩尔斯电码,并通过中继站的继电器自动的进行放大电信号,得以实现远距离传播。接下来,作者重点介绍了数字,从阿拉伯数字的伟大的0,以及10进制中的位的概念,开始了数字的转换与表达。再接下来,介绍了布尔逻辑,然后简化了电路的,节省了开关;然后引入了逻辑门的概念,以及逻辑门的电路实现。从几个继电器,开关,组合成一个逻辑门的整体;

全加器

简单的逻辑门有如下这些
 与门
 或门
 与非门
 或非门
 反向器
 缓冲器 -电磁继电器用于电报中的原因;
然后作者开始去设计一个二进制加法器
 1,二进制的进位
  只有两个都为1才为1,那么一个与门可以表示 进位操作
 2,然后是本身的数的操作,两个不同则为1,两个相同则为0;
  与非门-1则为0
  或门-有个1则为1
  与门–都为1则为1
异或门的电路
一个或门的输出,加上一个与非门的输出,作为与门的输入,可以构成本位的输出,这样的门就是异或门。一个与门+ 异或门 可以作为一个半加器;半加器的一个输出是和,一个输出是进位;同时,这两个1位的二进制相加时,可能也有一个前一位的进位输入;首先,a b 经过半加器,得到和输出,与进位输出;和输出作为另一个半加器的输入,与上一位的进 位输入进行加法,和输出与进位输出;进位输出与 ab 的进位输出不可能同为1,则一个或门就足够表示 是否要进位。故两个半加器,加一个或门,就足够构成一个全加器;
半加器的电路图

全加器
这种进位方式,称为行波进位的电路;这种电路的方式比较慢,实际中采用先行进位的电路,但是需要更多的继电器;
而实际上现在也不再使用继电器,而是使用晶体管;但原理是一致的,只是使用晶体管的方式构建出对应的逻辑门;

不借位减法

对于十进制的减法,例如 8123-3451,可以用如下表达式计算
  9999-3451 + 8123 -10000 + 1 = 6548 + 8123 - 10000 + 1 = 14671 + 1-10000 = 4672
而对于 3451-8123
  9999-8123+3451+1-10000 = 1876+3451+1 -10000 = 5327-9999= -(9999-5327)= -4672
对于二级制而言1100 - 1011
  1111-1011+1100-10000+1 = 100 + 1100 - 10000 + 1 = 10000 - 10000 + 1 = 1
对于二进制而言 1011-1100
  1111-1100+1011-10000+1 = 11+1011-10000+1 = 1110-10000+1 = 1110-1111= -(1)
异或门的特点就是,当一个输入是0时,输出永远是另一个输入;所以,反向器+异或门可以构成一个求反器;

额外再进入,二进制的负数表示形式;
补数的概念:十进制数32的9的补数,就是99-32 =67,其中67称为32的9的补数;而32的10的补数是100-32 = 68,就是9的补数在+1;

对于二级制数 110 的1的补数就是 111-110 = 1;其中1称为 110 的1的补数;所以1的补数有时候也称为相反数或者反码;而110的2补数就是 1补数+1,1000-110 = 111-110 + 1 = 1+1 = 10;
而010的2的补数就是 1000-010 =111-010+1 = 101+1 = 110;不过我们人为规定,正数的补数符号为0,负数的补数符号为1;而010的是正数,其2的补数就是依然是它本身;

以byte 类型为例,最小的正数是 0000 0000,最大的正数是 0111 1111B = 127(10)
而 -1(10)的二进制表示方法 则是 1111 1111 (二进制补码表示)
将 1111 1111 转为1的补数就是 0000 0000 ,而 2的补数就是1的补数+ 1;则就是 0000 0001;是十进制的 1;我们知道负数的补码的表示为1,则可知 1111 1111 是十进制 -1 的补码表示形式

理解上述数字,就是最大的正数+ 1,则是最小的负数,最大的负数+ 1,则成为正数

我们人为规定 ,负数用补码表示;即当遇到一个2进制数时,如果它的符号位是1,则知道他是一个负数的表示形式,他的绝对值就是 该二进制数的2的补数,就是1的补数+ 1;就是 取反+1;
所以当 int 值 128转为byte时,看到的二进制数是 1000 0000 ;我们认为这是一个负数的表示方式,对应的补码是 1000 0000,即是 -128;
当int值的 129的 1000 0001,转为byte时我们认为这是一个负数,对应的补码是 0111 1111 = 127(D);
即 int的129转为byte时,我们认为是 -127
当int值得 255 = 1111 1111 ,转为 byte时,我们认为是一个负数,对应的补码是 0000 0001,我们认为这是 -1 ;

求补器

综上所述,现在的加/减法器的电路图是这样的
加/减法器
只有减法才产生负数,sub = 1 时,表示的是减,而负数的溢出时,表示值是负数,且是2的补数形式;
故再进行减法的溢出时,也可以表达出计算结果了;

反馈与触发器

输入会产生输出,而输出又会影响输入,就是反馈;

振荡器

振荡器
开关闭合后的振荡器,就是始终工作的反向器;简图如下

振荡器电路简图
振荡器大有作用,在于他能提供周而复始的电流;

触发器

当两个开关都断开时,电路有两个稳定状态,这样的一个电路成为触发器;
触发器
触发器的最厉害之处,在于他具有记忆功能。类似于跷跷板,跷跷板不会始终处于平衡状态,要么一端高要么一端低;当等处于亮的状态时,我们知道是左边的或非门处于闭合状态上一次处于闭合状态;而当灯处于灭时,我们知道是右边的或非门处于闭合的状态;

R-S触发器

其中 set 端使 Q输出 1;reset 端使 Q输出0;Q与 q非 取反;
R-S触发器
r-s 触发器有这些特点;
11禁止,00 没有意义
r-s 触发器的简图
R-S触发器简图

电平触发的D型触发器

D型触发器
保持位为1时,使得q保持数据端的值;当 保持为0时,数据端任何输入都不影响电路的运转,仍然是上一次保持位为1的时候的状态;
通常情况下,保持位不会标记为保持位,而是叫时钟;当然这个信号并不是真的时钟,只是可以在0-1之间来回变动;这个电路又成为D型锁存器;也可以成为1位存储器;

边沿触发的D型触发器

边沿触发的D型触发器
只有时钟信号从0-1时,输出端Q才保存数据段的值;当时钟信号为1时,输入端的值也不会影响到q的值;

边沿触发的D型触发器的简图

边沿触发的电容器简图

分频器

分频器

计数器

一个分频器的Q非输出可以是另一个分频器的时钟输入;
串联起来的分频器
clk 反相器的输出是周而复始的01,而Q1则是只有clk在由0-1的正跳中,才输出D端的值,进而Q1非的输出作为下一个分频器的时钟输入;

上图输出
把8个触发器链接在一起,封装到一个盒子里,可以得到一个8位的计数器;这个计数器成为8位行波(异步)计数器

8位行波(异步)计数器

![8位行波计数器![](https://img-blog.csdnimg.cn/82d1378cc6374334a3a160abefb9a25d.png)

具有预置与清零作用的边沿性D型触发器

具有预置与清零功能的边缘型D型触发器
通常情况下,预置与清零的输入都为0,就是普通的边缘型D型触发器;预置与清零都会忽略始终信号与数据输入信号;预置为1时,Q为1;清零为1时,Q为0;预置与清零不能同时为1;

存储器

D型锁存器的 保持位不再标记为时钟,而是被标记为写入时,1位锁存器
可以简化为
1位锁存器简图
8个1位锁存器连接起来
8位锁存器简图

2-1选择器

2-1选择器
2-1选择器应该在做加法的时候首次出现,最初用来表示加法运算的时候,加数来自于锁存器还是开关的输入;2-1选择器,由一个反向器,2个与门,一个或门组成;当选择输入1时,选择器的输出是B门的输入;相反的,当选择器输入0时,选择器输出是A的输入;

8-1选择器

8-1选择器电路图

D0-D8代表的是8个可能的数据输入端,而S0-S2代表的是8中组合,S选择器的任意一种组合,代表的是选择对应数据输入端作为数据输出端展示的数值

3-8译码器

3-8译码器电路图
O1-O8代表的是数据输入信号,将存储到哪一个1位锁存器中去;同理与8-1选择器的逻辑;s0-s3的组合将选择出对应的o端作为以为锁存器

RAM

8位锁存器电路
由于选择信号S0-S3代表的含义是一致的,可以成为地址 Address,在输入端,表示存储到哪个1位锁存器,而在输出端,代表着从哪个1位锁存器中取出数据;
8×1 RAM
读/写存储器,随机访问存储器或者RAM;之所以成为随机的原因是因为可以通过简单的改变地址,从而可以从指定的锁存器中读取数据;而其他的存储器需要进行顺序读出-也就是在读出地址101的数据之前,必须读出地址在100的数据;

RAM阵列

上述的称为8*1阵列,可以存储8个数,每个占1位;当然阵列可以按照各种方式组织;

8*2RAM 阵列

8*2阵列
该阵列可以存8个数,每个数可以占2个字节;

16 * 1 的阵列

16 * 1 RAM阵列
链接1-2译码器与2-1选择器的S,实际上是第4个地址线,用于确定选择两个 81 RAM的阵列的哪个;所以这是一个161 的ram 阵列;

1024*8 RAM 阵列

1KB阵列
书上没有给出ram的阵列示意图;我大致猜想是 8*8RAM 组成一个单元,然后剩下的7个地址线,组成 7-128译码器链接到指定的单元;128-7选择器来选择指定的单元展示;

构建大型RAM阵列

书上最后是一个64K*8的RAM阵列,有16根地址线,8个数据输入,一个写入开关,一个接管开关;接管开关的目的是在于,其他电路可以使用与这个控制器相连的存储器;当接管开关输入0时,控制面板的任何开关都不起作用,完全由外部控制;输入1时,则存储器完全由控制面板控制;

控制面板

64K*8 RAM阵列控制面板)
电路图实现
具有接管功能的64K*8的RAM阵列电路图
带有控制面板的电路图

控制面板的64K*8RAM的阵列
当电源关闭时,所有的电磁体都失去磁性,所有继电器的触点都回到原始状态,RAM中所有的数据都会消失;这就是RAM也被称为易失性存储器原因,需要恒定的电源来维持数据;

自动操作

之前已经设计出累加器;因为边沿触发的D型触发器,更易用;所以假设锁存器为8位边沿触发的触发器;
8位累加器

100个8位数相加

第一个挑战是如何实现100个8位数相加;我们已经设计过计数器,存储器;现在的想法是,在存储器中输入100个8位数,这些数从0地址开始到99地址结束;然后想法依次将存储器中的数据读出并输入到加法器中,这样,最终的灯泡将展示结果;
100个数相加

清零开关,是得计数器归0;8位锁存器归0;断开控制面板,振荡器开始产生作用;计数器从0开始,从64KB*8的存储器中读出0号位置的8位数,送给8位加法器的输入端;加法器将计算结果存储到8位锁存器中,灯泡开始闪烁;然后振荡器再次由0-1,16位计数器到1位置,周而复始;最终100个数加完后,振荡器还会工作,但灯泡将不会再闪烁,而维持展示状态;

任意几个数相加,并将值存储到存储器中

任意几个数相加并存储到存储器中

思路一,指令存储器与数据存储器分隔,且地址上一一对应

指令存储器及声明有限的指令
指令存储器上的指令码与指令的含义

电路图中的2-1选择器,用来表示锁存器的输入是用来回流到加法器的输入端,还是存储到数据存储器中;至于什么时候是存储什么时候是累加,则由指令代码表示;
指令存储器与数据存储器分隔的电路示意图

支持减法

支持减法简单的地方在于,我们之前设计的加法器的再加一个补码器,并使加法器的进位输入为1就可以;

支持16位数字的加法

之前的16位数字的扩展的方法时,让存储器有16个数据输入端,即构造一个8*16的锁存器;但现在有便宜的方案解决;

76ABh + 232Ch 相加

进位加与借位减

任何时候进行多字节加法时,不管是否产生进位,都应该使用进位加指令;
这样的一个缺点是,产生的和会分散在不连续的内存里;而且计算的结果不能重复使用,是因为数据空间的内存地址与指令空间的内存地址已经被占用;
可以使用指令与数据内存地址在一起的方式解决
实际上类似于我们现在的指令的存储方式;也没有必要需要两个一致的存储空间,一个存储空间就够了;

jump 指令

我们规定除了结束指令外,其余的指令后面还有两个字节,表示要操作的内存区域;
jump指令可以替代某些并非真的结束的指令,这样在一个逻辑结束后,可以跳转到新的一个指令地址,进行计算;
转移指令影响16位计数器。当自动加法器遇到转移指令时,计数器被强制输入紧随转移指令代码的新地址,这可以通过组成16位极速器的边沿触发的D型触发器的预置(PRE)和 清零(CLR)来实现;
跳转功能的加法器

条件转移

为了实现一个乘法,要么是输入大量重复的指令;要么是输入大量的数字,从能让加法器计算出结果;能否再算出一个中间结果后,跳转到起始处;但是这样的跳转,并不能结束,而是无限执行下去;我们想让转译指令做的是使循环过程值重复所需的次数,这就是条件转移指令。

进位锁存器

在8位加法器在进行16位数的加法时,需要做的就是保存低字节数相加结果的进位,然后把该进位作为高字节数相加的进位输入。如何存储1位呢?当然是用1位锁存器。这是,该锁存器车鞥为进位锁存器。

零锁存器

只有8位加法器的输出全为0时它才锁存1,所有叫它零锁存器;
这里有一个疑惑,是怎么使用0锁存器的;实际原理如下,每一次在跳转前,将被乘数-1(== + FFh),当和为0时,此时乘法也结束;

零锁存器
例子如下
要做的乘法

单次加法循环

循环次数的判定
这是一个字节的判定,当然也可以多个字节的判定;

机器码或者机器语言

助记符
LOD A,[1003h]
加载 内存地址 1003h的数据到 累加器中;
STO [1003h],A
保存累计器的数据到内存地址 1003处;
JNZ 0000h
若零标志位不为1则转移到0000h处 ;
为了表示,在某些地址存储了某些指令,可使用地址加冒号表示:
0000h:LOD A,[1005h]
下面表示了一些存储在某一地址的数据:
1000h:00h,A7h
1002h:00h,1Ch
1004h;00h,00h
上述三行相当于:
1000h:00h,A7h,00h,1Ch,00h,00h
因此,整个乘法程序可以写成如下一系列语句;
0000h: 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
JNZ 0000h
001Eh: HLT
1000h: 00h,A7h
1002h: 00h,1ch
1004h: 00h,00h
有些时候,不用真是的地址,而是用标号代替;

从算盘到芯片

数学的难以计算
18实际,航海等都依据对数表等,需要拓展且出错,有改善的需求
巴贝芝的差分机与解析机
	解析机的条件转移,可使用卡片编程
霍勒瑞思与IBM卡片
他们都有数字系统的发明,虽然依然不是2进制数,但都有自己的数字表示系统化;当数字与硬件结合时,很容易把整个世界都想象成数字世界;
20世纪30年代,才开始使用继电器构造计算机

1935年柏林的 zuse 使用胶卷制造了2进制计数的机械存储器而不是继电器,他使用的是35mm的电影胶卷上穿孔来编程;

Harvard mark I
哈佛大学的研究生 howard aiken 和 ibm 合作,制造了自动顺序控制计算机 ASCC.实现了巴贝芝的梦想
ENIAC
最大的计算器,大约30吨;
冯 诺依曼
帮助设计了 eniac 后继产品 edvac ;指令应该在存储器中顺序存放并用程序计数器来寻址,但也应该允许条件转移。这种设计思想叫做存储程序概念;
克劳德·香农
	信息理论 位
贝尔实验室
美国电话电报公司正式把它的科学和技术研究部分与商业分离,另外建立附属机构,这样贝尔实验室诞生了’;
半导体,例如锗和硅元素成为半导体,并不是因为他们的导电性是导体的一半,而是因为他们的导电性可以用多种方法来控制,半导体最外层有4个电子,是最外层所能容纳电子最大数目的一半。在纯半导体中,原子彼此非常稳固地结合在一起,如金刚石,这种半导体不是好的导体;半导体可以和其他杂质结合而变得不纯。有一类杂质为原子的结合提供额外的电子,这种半导体叫N型半导体,nagative;另一种类型的杂质掺杂生成P型半导体。
两个N 型半导体中夹杂一个P型半导体可制成放大器,称作NPN晶体管,对应的三部分分别是集电极 collector,基极 base 和发射机 emitter

NPN晶体管示意图
基极上的一个小电压能控制一个很大的电压经过集电极到发射极。若基极上没有电压,它会有效截止晶体管。
晶体管通常被封装在一个直径大约为1/4英寸的小金属容器里,有三个引脚伸出;

晶体管
百度百科 NPN方大电路原理

晶体管制造的逻辑门

虽然晶体管是为了放大信号而产生的,但晶体管也可以用来制造逻辑门
晶体管制造的逻辑门

集成电路 德克萨斯仪器 仙童 intel

集成电路ic;这个块由隔离、传导、整理、放大四个层组成,电子功
能通过各层的隔离区域直接连接起来

TTL与 CMOS

ttl - 晶体管-晶体管 逻辑;
《TTL 数据手册》各种芯片实际上是各种晶体管链接而成逻辑门,触发器,全加器,计数器或者说储存器等;在1973年的《TTL 数据手册》所列的最大容量的RAM 芯片才是 256*1位,需要2的11次方个这样的芯片才能组成64KB的RAM;TTL远不是最好的组织ram的方式

振荡器
可以将TTL的反相器的输出端链接到输入端,但是使用一个事先可以预测频率的振荡器要更好些。构造一个这样的振荡器很容易,就是使用一个石英晶体,在一块小片上引出两条线。这些晶体在特定的频率下产生振荡,通常每秒至少100w周;

石英晶振器原理

coms 是金属涂层填充的晶体管

两种典型的微型处理器

第一个微处理器 4004
intel 8080
单芯片微处理器;
8080处理器中,除了有累加器外还引入了6个寄存器;分别是BCDEHL;使用寄存器 H L 具有某些特殊的含义。H代表高,L代表低;通常把HL结合起来记作HL来表示一个16位寄存器对,H代表高位字节,L代表低位字节。这个16位值通常用来寻找存储器。
8080指令中,有一个至少63个指令码共一条8080指令使用的指令,它就是mov指令;该条指令只有一个字节,用于把一个寄存器中的内容传送到另一个寄存器中(或者同一个寄存器中)。使用大量Mov指令是设计带有7个寄存器(包括累加器)的微处理器的正常结果。
三种寻址方式
都是把一个字节从存储器中装载到微处理器中
直接寻址方式
	LDA A,[aaaa]
间接寻址方式
	MOV B,[HL]
立即数寻址方式
	MVI E,37h
8080 的标志位

在自动操作中已经构建了2个标志位,进位标志位 CF 和 零标志位 ZF。8080还有额外的三个标志位,符号标志位 SF,奇偶标志位 PF 和 辅助进位标志位 AF 。所有的标志位都保存在另一个叫做程序状态字 PSW 8位寄存器重中;
像 LDA,STA,MOV这样的指令不影响标志位,而ADD,SUB,ADC,SBB却影响标志位;

  1. 当运算结果最高位为1时,符号标志位SF为1,表示结果是负数
  2. 当结果为0时,领标志位1
  3. 当运算结果中的1的个数为偶数时,奇偶标志位为1;
  4. 当add或者adc ,sub ,sbb 发生进位或者不发生借位时,进位标志位CF = 1
  5. DAA(十进制调整累加器)指令中,低4位向高4位有进位时,辅助标志位 AF = 1

有两个指令直接影响进位标志位CF:
STC 置CF= 1
SMC CF取反

8080的算数逻辑单元 ALU

我们自己设计的微处理中,只能做加减运算,8080还可以支持逻辑运算;
MVI A,0Fh
mvi B,55h
AND A,B
累计加中的结果将为05h,如果最后一条指令为OR运算,则结果为5Fh;
CMP与指令与SUB指令基本一致,但结果不保存在累加器中,原值也没影响,只是将零标志位进行了赋值

8080的其他两条指令
CMA ,它对累加器中的值进行取反操作。

&mesp;&mesp; 也可以是用下述指令来使累加器按位取反;
&mesp;&mesp;&mesp; XRI A,FFH;

DAA,帮助程序员用BCD码表示的数来进行十进制算术运算。在BCD码中,每一小块数据的范围在0000-1001之间,对应于十进制的0-9。利用BCD码格式,每8位字节可存储两位十进制数字;
MOV A,27h
MOV B,24h
ADD  A,B
累加器中的值当然是BBh;如果执行的指令时 DAA.则累加器中的为21h,且C F = 1,这是因为27和94的十进制和为121.
8080
增量指令与减量指令
INR 
DCR

  单字节指令INR和DCR可影响除CF标志位以外的所有标志位;
位移指令
RLC 累加器循环左移
RRC 累加器循环右移
RAL 累加器带进位循环左移
RAR 累加器带进位循环右移

堆栈

堆栈是怎么实现的呢?首先,堆栈只是不被别的东西使用的正常的RAM的一部分;8080微处理器包含一个特殊的16位寄存器来对这一部分存储器进行寻址,这个16位寄存器叫做堆栈指针。
8080的push指令实际上是存储16位的值到堆栈。pop指令用来恢复它们;
堆栈是怎样工作的呢?
假设堆栈指针为8000h,PUSH BC指令将引起下面的这些情况发生;
堆栈指针减1至7FFFh
寄存器B的内容保存在堆栈指针所指的地址处,即 7FFFh处
堆栈指针减1至7FFEh
寄存器C的内容保存至堆栈指针所指的地址处,即7FFEh处
当执行pop的时候正好是反的

堆栈寄存器

对堆栈寄存器进行赋值的指令是LXI,即load extended immediate ;
LXI SP,xxxx;
表示将 xxxx赋值给堆栈寄存器;
该指令也可以用于其余的寄存器
LXI BC,527Ah
等价于
MVI B,52
MVI C,7A
也可以对寄存器和堆栈指针执行加量操作和减量操作,就像他们是 16位寄存器一样:
INX BC
INX HL
INX SP
DCX BC
DCX HL
DCX SP

其他指令

DAD HL,BC
16位寄存器对的内容加到寄存器对HL中
DAD指令通常用于计算存储器地址,这条指令只影响 CF.

SHLD [aaaa],HL
直接保存HL;寄存器L的内容保存在地址aaaa处,寄存器H的内容保存在地址aaaa+1处
LHLD HL,[aaaa]
直接装载HL
PCHL PC,HL
把HL中的内容装载到PC
SPHL SP,HL
把HL中的内容装载到SP
XTHL HL,[SP]
HL与堆栈顶的内容交换
XCHG HL,DE
DE 和 HL交换

转移指令

处理器中有一个叫做程序计数器PC的寄存器,PC中包含处理器取回并执行的指令的存储器地址。通常PC使处理器顺序执行存储器中的指令,但有些指令-通常命名为Jump,Branch或goto-能使处理器偏离这个固定的过程。这些指令使得PC装载另外的值,处理器所取的下一条指令将在存储器的其他位置。
条件转移指令更有用。
8080支持9种不同的转移指令,包括无条件转移指令和基于ZF.CF.PF.SF是1还是0的条件转移指令;

call 与 retunrn

call 与 jump指令的不同之处在于:前者把一个新值保存到PC终,处理器保存PC中原来的地址,保存在堆栈中;这种策略意味着call指令可以有效的保存程序从哪里跳转的标记,处理器最终可利用此地址返回 原来的位置。
这个返回指令叫return
return 指令从堆栈中弹出两个字节,并把该值装载到PC中。
call 和 return 指令是任何处理器中都重要的功能。他们允许程序员编写子程序,子程序是程序中经常用到的代码段;
寄存器B的值和寄存器C的值相乘,然后把16位的乘积装入寄存器HL中;

Multiply:	PUSH PSW;	保存要该表的寄存器
			PUSH BC;
			SUB H,H;	设置HL结果为0000h
			SUB L,L;
			MOV A,B;	将乘数送到A
			CPI A,00h;	如果A是0
			JZ ALLDONE
			
			MVI B,00h; 	将B置为0,实际上就是BC的高字节置0
			
Multloop:	DAD HL,BC;	将BC加到HL
			DEC A;		乘数-1
			JNZ Multloop;不为0,转移
ALLDONE:	POP BC;		恢复保存的寄存器
			POP	PSW;
			RET; 		返回

上述标号Multiply,这个标号对应于子程序所在的存储器地址;
利用这个子程序完成25h和12h相乘的程序用下面的代码:
MOV B,12h
MOV C,25h
CALL Multiply
     上述程序中只会计算加法12次,而非25次
call指令把PC的值保存在堆栈中,该指令是call指令的下一条指令的地址。然后,call指令使程序转移到标号multiply所表示的指令,即子程序开始。当子程序计算结果完成后,执行RER返回指令,即从堆栈中弹出PC的值,程序继续执行call指令后面的语句。

8080指令包含了如图这些条件转移指令

8080条件转移指令

微处理器与外设的通信
与微处理器相连,但不是存储器,则是外设;

外围设备具有与存储器相似的接口,微处理器可通过对应与外围设备的具体体质来对外设进行读写。在有些微处理器中,外围设备实际上占用了通常用来寻址存储器的地址,这种配置叫做内存映像I/0。然而在8080中,在65536个正常地之外,还有256个附加地址专门IO设备预留,这就是IO端口。IO地址信号为A0~ A7,但IO访问与存储器访问不同,由8228系统控制芯片锁存的信号来区分。
OUT PP
IN PP
外围设备有时需要引起微处理器的注意。例如,当你在键盘上按键时,如果微处理器能马上知道这件事情通常是有帮助的。这由称作中断 interrupt 的机制来完成,这是链接至8080 INT 输入端的,由外设产生的信号。
然而当8080复位时,它不能对中断产生响应,程序必须通过执行EI enable interrputs 指令来允许中断,通过 deable interrupts 指令来禁止中断。
DI
EI
8080的INTE输出端信号表明允许中断。当外设需要中断微处理器当前工作时,它把 8080的INT输入端设置为1.8080通过从存储器中取出指令对它做出响应,但控制信号表明有中断发生。外设通常通过提供下述指令之一来响应8080:
RST 0
-----
RST 7
以上称作restart 指令,他们与call 指令相似,也需要把当前程序计数器的值压入堆栈。但restart 指令随后转移到一个特定的位置:rst 0 转移到地址0000h处, rst 1转移到 0008h处,rst 2 转移到 0010处 rst 3 转移到 0018 ,rst 4到 0020h处,直到 rst 7到 0038h处。位于这些地址中的代码段来处理中断。
到此为止,已经讲述了243个操作码。下述12个字节与任何操作码无关:08h,10h,18h,20h,30h,38h,cbh,d9h,ddh,edh,fdh。这样总共有 255个操作码。
操作码 00 指令 NOP
no op ,即 no operation.Nop 指令使微处理器什么都不做。用于填空。

摩托罗拉 6800

摩托罗拉6800
intel 8080
6800有一个16位的程序计数器PC,16位的堆栈指针sp,一个8位的状态寄存器,以及两个8位累加器A和B。它们都被看成是累加器,B不是只作为一个寄存器,因为没有A能做而B不能做的事情。6800没有其他的寄存器;
8080最高速度是2MHz,8080指令则需要4-18个始终周期,8位的微处理器,64KB的存储器,244条操作码

8086 及后续的
16位处理器 1MB 
8088 IBMPC 
IBM PC 兼容机 也暗指 intel inseide ;
Apple 的 6800 mos管 ,68K系列 

ASCII

数字
30h 0
39h 9

大写转小写

41h A 42h B 61h a 62h b
相差 20h ,即 10进制的32
所以就是将2进制的值置为0就ok

图形字符与控制字符

前32个和最后一个 7Fh称为控制字符
0D 回车,是将打印头移动到行首
OA 换行,是将打印头移动到下一行
单独使用换行符,是移动到下一行,而不是从头开始,单独使用回车符,只是移动到行首,会进行重复打印;
制表符
  tab 水平制表符,在下一个水平位置即8的倍数处开始打印下一个字符,这是保持字符按列对齐的简单方法
  退格 用来在一些旧的打印机上打印复合字,比如重音符 `;

总线连接

组成一台完整计算机的所有集成电路必须安装在电路板上,存在不同的部件安装在不同的电路板上,这些板之间,通过总线互相通信;简单的说,总线是提供给计算机中每块电路板的数字信号的集合。

  • 地址信号。微处理器提供,常用来寻址RAM单元,也可以用来连接到计算机上的其他部件
  • 数据输出信号。微处理器提供,用来写入数据到RAM或者其他设备。
  • 数据输入信号。是由计算机的其余部分提供。通常输入信号通常来自于RAM的输出,也即表示微处理器读入存储器内容。但是其他部件也提供数据输入信号给处理器。
  • 控制信号。由各种各样的信号组成,通常与计算机的特定处理器的控制信号一致。控制信号可来自于微处理器或者从其他部件传送到微处理器。例如,微处理器可用一个控制信号来指示他要写一些数据到某一存储器地址;

S-100总线

早期的计算机中,比如第一台家用计算机 mits altair 上首先采用;s-100电路板,5.3*10 英寸,在一边有100个接头可以插在插槽里;s-100计算机上有一块较大的板称为主板,也叫母板;上面有若干个(12)相互连接起来的s-100总线插槽看,这些插槽也叫拓展槽,s-100电路板(也叫电路板)就插在这些插槽里。8080微处理器及其支持芯片在此s-100板上。RAM 在另外一个或者更多的其他 S-100电路板上。

公开或者保密的总线规范

当开放总线规范时,其他厂商可以设计并销售与这种总线相配套的拓展板。最著名的开放式体系结构个人计算机起源于IBM-PC ;1981 年秋季,IBM公开了整个计算机完整电路图的PC技术参考手册。其中还包括IBM为它制造的所有拓展板。它使得许多制造商可以生产自己的PC机拓展板并且事实上产生了PC机的克隆体-兼容PC机,兼容PC机与 ibm pc 几乎完全相同且运行相同的软件。
apple 公司则是保密的总线协议。
1987年,IBM退出了微通道体系结构MCA总线,且申请了专利,这样IBM就可以从其他使用这种总线的公司收授权费。Intel 公司设计的外围部件互联总线 peripheral component interconnect ,PCI 总线在pc 兼容机上已普遍采用。

设计电路板

2102存储器芯片

2102存储器芯片
2102是MOS家族的成员,一个数据输出,一个数据输出,10根地址线,1个读写信号。cs 信号表示片选,当cs的信号为1时,片子不被选中,则不对rw做出任何响应。为1个8位的处理器组织存存储器,则肯定希望存储器按8位而不是1位。按最少计算,需要组成一个1024*8的ram阵列;
1024*8 存储体

组织存储器

从实际观点上来看,需要把这些存储芯片安装在一个电路板上。在一块电路板上可以装多少?如果真的把他们紧紧安装在一起,可以在一个S-100上安装64个这样的芯片,提供8KB存储器。(暂未想明白怎么计算的)但是,最好还是宽松的安装,用32个芯片组成4KB存储器。链接在一起用来存储完整字节的一组芯片称为存储体。
像8080这样的8位微处理器有16位地址可用来寻址64KB存储器。如果链接的是有4个存储体的4KB存储板,则存储板中16位地址信号完成的功能如下:
16为地址信号功能
链接4kb的存储板是很经常的,为获得灵活性,可以使用DIP开关,一种双排直插封装的系列 2-12个 微小开关。他可以直接插入到普通的IC插座(集成电路插座)中:

DIP开关
可以将这个开关和总线中的高4位地址信号链接到比较器的电路中;

比较器

比较器
如果来自总线的地址信号与开关设置相同,则当我们闭合对应于A13与A15的开关,则意味着选择的是 A000h到AFFFh的地址;这里不再是按照bi计算地址,而是按照字节计算;
则4个异或门的输出都是0,那么或非门输出是1;
可以把equal信号通过一个2-4译码器生成CS杠信号来选择4个 存储体的1个;

2-4译码器

三态输出

2102芯片的数据输出信号是三态输出。除了逻辑0和逻辑1外,数据输出信号还可以是第三种状态,这种状态就是什么都不是,好像芯片引脚设么都没有链接。当CS杠信号输入为1时,表示片没有被选中,2102芯片就进入第三种状态,这意味着可以把4个存储体对应的数据输出信号链接到一起,并用这八个组合输出作为总线的8个数据输入信号。【无法理解4个存储体对应的数据输出信号是如何链接的,以及怎么产生的8中组合,4个存储体只是在一个存储板上,每一个存储体】
需要强调一下三态输出,对总线的操作至关重要;连接到总线上的所有芯片都可以使用总线上的数据输入信号向处理器传送数据;任何时候,链接到总线的电路只有一个用来确定总线上的数据是什么,其他电路板不被选中,输出第三态;

2102是SRAM

sram每存储1位需要4位晶体管;而我们做的边沿性触发器则需要多个。
DRAM 与 SRAM 是 DRAM 需要每秒充几百次电,而避免数据的错误;但只需要1个晶体管;
DRAM 性价比较高

阴极射线管CRT

后面关于显示器,像素,视频适配器等,以及如何展示一个ASCII码等。
大致上显示器上显示数字,是阴极射线管接收到视频适配器的信号在屏幕上的显示出来;比如每行显示多少字符,一个屏幕多少行;一个字符是哪个二进制码,是怎么显形的这些细节;

虽然视频显示器的二维图像看起来似乎很复杂,但实际上是由一束连续的射线很快扫过屏幕而形成的、从左上角开始,从左到右扫过屏幕,然后回车换行。每个水平行为扫描行,每次回到下一行的开始称为水平回归。当射线扫描完最后一行后,从右下角回到左上角(垂直回扫)。以美国的电视信号为例,这种扫描每秒进行60次,称之为场频。人的肉眼大概是24,最厉害达不到30;
电视是隔行扫描;电视需要两个场用来形成一个单独的帧,帧是一个完整的静态视频图像。每个场完成整个帧的一半扫描线-第一个场完成偶数扫描线,第二个完成奇数扫描线。【理解不了,这样电视的质量是否下降了一半的像素】场频,帧频的区别水平扫描频率,即扫描每个水平行的频率为 15750赫兹,除以60,为262.5行,这就是一个场的扫描线。整个帧是它的两倍,即525条扫描线。
对黑白电视来说,视频信号很简单理解。每秒60次场扫描,同时扫描信号中含有用来表明一个场开始的垂直同步脉冲,脉冲的电压为0付,宽度为400ms。水平同步脉冲用来表明每个扫描行的开始,它的信号为0付,宽度为5毫米,每秒出现15750次;在两次水平同步脉冲之间,信号从0.5v(黑)-2v(白)变化,0.5v-2v之间的电压用来表示灰度。
因而电视图像部分是数字的,部分是模拟的。图像在垂直方向上分为525行,但一个扫描线的电压是连续变化的-用来模拟图像的可视强度。但是电压并不是无限制的变化,电视机能响应的信号变化频率有上限,称为电视机带宽。
带宽在通信中是很重要的概念,美国广播电视带宽为4.2MHZ。如果把视频显示器链接到计算机,则很难把显示器想象成模拟和数字混合的设备。从计算机的观点来看,视频图像很容易看成是离散点组成的矩形网格,这些离散点称为像素;
视频带宽限制了水平扫描行上像素的个数。我们定义带宽为视频信号变化(从黑到白再从白到黑)的 速率。具有4.2MHz的带宽的电视机允许每秒420W次2个像素,或者用 15750/2*4200000 = 533 个像素。但是大约1/3的像素是不可用的,约只剩下320个像素是有用的。同理,垂直方向是 200;为了确定网格上的像素总数,可以简单第

键盘

键盘的二进制码是怎么表示的

永久存储设备

磁保存技术,软盘,硬盘
双面 同心圆磁道 扇区 每个扇区512个字节

操作系统

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值