一直试图用电路的方式去理解程序的运行,最终还是百撕不得其姐。
数字电路的核心就是各种各样的门,有点像诸葛亮布的八卦阵,CPU自然是复杂化的数字电路,内部充斥着海量的门。注:这里没有**,莫奈门。 我在想,假如连接这些门的不是电路,而是一根根橡胶管,我在橡胶管的开始位置(震荡电路)吹一口气,有哪些门可以被吹开呢?
在第一个周期内,应该只有0000H里面的门会开,假如数据为01010101,那么相应为1的门就会打开,0的门是关闭的。而根据这些信息,假设01010101指向了001AH这个地址,好了好了,知道了,我再吹第二口气。
这时候别的门依旧是关闭的,0000H或许保持不变,而001AH却有门被打开,这些门的状态是设定好的(编程),由于我的这口气有着强大的力量,我吹的这个地址的八扇门(8位机)会发生连锁反应,吹开其它的门(运算),假设001AH的数据为: MOV A,#20H,气流会根据指令去吹累加器A的地址,然后打开相应的门使之数据等于20H。至于为什么看到这个指令就会去吹累加器地址,是因为MOV A 这个指令就是打开了累加器A的门,它就是打开累加器A的密码。这个指令是唯一的,不重复的。
回到电路的思路上来,负责执行MOV指令的门电路一直没有闲着,它随时扫描着各个地址中有没有MOV字眼,有的话直接执行,同理,其它的门电路也是如此,程序员不管它们是什么门电路,统称为指令,这些指令是INTER公司设计好的,拿来用就行了。对于我这种钻牛角尖的,它们就是一个个门的组合,它们每个周期都在内存里扫描有没有自己的工作,有就工作,没有就继续扫描。
不说那些外行的话了,很多东西是想当然的,可能不正确。
CPU内的各种数字电路,在每个脉冲周期都在工作,没有接到指令也在工作,它们在干什么呢?
我们知道,CPU开发的时候,系统提供了很多指令,如MOV、JMP等等,我们称之为指令集。我猜想这些不同的指令,实质上就是对应着CPU内部不同的数字电路,所有的数字电路都拥有共同的特点,就是都具有输入和输出端,这些输入和输出端是接在总线上的,输入端每时每刻都在监视着总线上电平的变化,输出端每时每刻都在输出给总线相应的电平。
内存同样也是数字电路,它也在总线上接着,内存的工作相对更简单,就是感知总线上的电平高低,你高了我也高,你低了我也低。但是总这样高高低低的也不行,这就像你拿起笔总在一个方格里写字一样,写了擦,擦了写,**还是出不来,怎么办?笔要动才行,这里就需要移位电路,每一个周期执行完毕,移位电路就要工作一次, 这就是前面学过的指针的概念。对程序员来说是指针,对硬件开发者来说是移位电路。
大概的脉络在脑子里基本有点状态了,我们不妨先把庞大的超大规模的CPU系统简化一下,这样更好理解。假设CPU内部只有一个数字电路,内存只有8个字节(8位机同时传输8个字节)。
现在通电开始工作,脉冲电路发出脉冲, 数字电路的8个输入端在总线上的8条支路上分别感知电平,假设内存的数据为00001111,那么数字电路的8个支路会检测到低低低低高高高高8个电平,然后数字电路马上得出运算结果,假设为10101010,并送到总线上去。请注意,这里数字电路输出数据的前提是00001111这个输入值里面包含自己需要的识别码,就像密码一样,如果不包含,对不起我不输出任何数据,保持原电平不变,假设密码为0000,那么每当它看到这个0000就会立即输出数据,这个识别的密码是唯一的,不能和别的数字电路重复。
|