一直試圖用電路的方式去理解程序的運行,最終還是百撕不得其姐。
數字電路的核心就是各種各樣的門,有點像諸葛亮布的八卦陣,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就會立即輸出數據,這個識別的密碼是唯一的,不能和別的數字電路重復。