計算機技術的實現是人類思維的產物,實際上是人類以自己的思維方式為藍本設計出來的一種模擬機,因此遠在工業革命以前,人們就已經在思想上進行了極為類似的的模擬實驗,這些可以從我們熟知的一個經典的故事中找出。 三國演義三國時期孫權和劉備為聯合抗擊曹操,約定劉備可暫時作為荊州地區的行政官全權管理該地區的事物。在赤壁大戰擊敗曹操后,孫權一直向劉備索要荊州,而劉備則尋找各種借口就是不還。吳國大將軍周瑜在得知劉備的妻子甘夫人病故后心生一計,在征得孫權的同意后,便派人前往劉備處,表示孫權想將自己的妹妹孫尚香嫁予劉備,條件是劉備須到吳國完婚。周瑜計劃等劉備到吳國后扣押劉備,然后以此要挾劉備索回荊州的管轄權。 劉備的軍師諸葛亮在獲悉全部情況后,便勸劉備前往結親,并派得力干將趙云帶500軍士隨行。行前諸葛亮交給趙云3個錦囊,并告知3個錦囊里有3條指令,其中第一個在一到吳國的地盤南徐(地名)時打開,第二個是劉備在吳國住到年終時打開,第三個是在情況緊急時打開。 一到吳國屬地,劉備就感到極其不安,于是趙云便取出第一個錦囊,指令告訴趙云,讓他命令大部分軍士全部到集市購買各種禮物,并散布劉備將要與孫權妹妹結親的消息。而劉備自己則和趙云帶上禮物一同去拜訪孫權母親的親家喬國老,通報劉備將要迎娶孫尚香的消息。 這樣由軍士散布市井消息,又由喬國老通知孫權的母親吳國太,于是劉備要娶孫權妹妹的消息全吳國都知道了。在此情況下,再扣押劉備于情于理都說不過去,所以孫權也只好把妹妹嫁給劉備。 只要劉備還呆在吳國,索要荊州的希望仍然是很大的。劉備一生四處顛簸幾乎沒過過什么安逸的生活,而吳國生活富裕風景優美,新婚的劉備居然樂不思蜀不提回荊州的事了。此時已到年終,趙云只好拿出第二個錦囊取出第二條指令。趙云按指令要求,報告劉備說諸葛軍師送來急報曹操軍隊正在攻打荊州讓劉備火速趕回。劉備一聽馬上說服新婚妻子孫尚香隨他一起立即趕回荊州,連給母親哥哥辭行的禮節也都免了。 周瑜得知劉備不辭而別趕往荊州的行動后,立即派將領兵堵截。在無法脫身時趙云取出第三個錦囊,第三條指令要劉備對妻子哭訴周瑜有意害他,全然不顧孫尚香的公主身份等等。弄得公主怒氣沖天,便以吳國公主的身份上前斥責擋路的將領。礙于公主的身份,吳國將領只好讓道。等吳國老大孫權親自下令堵截時,劉備已經跑出了吳國能夠控制局面的范圍。 這個故事是一個非常典型的程序化工作方式,歷史上是否真的發生過并不重要。重要的是早在明朝三國演義作者的羅貫中就已經設想過程序的工作方式了,并在寫作中體驗了一下編程序的味道。 全面而仔細地討論這個經典故事,不但能使我們理解計算機的工作方式,且對我們理解計算機的結構也會有莫大的幫助。 在上面的故事中諸葛亮不是一次就給趙云交待所有事情,而是給3個錦囊并要求一次只能打開一個很可能是有其原因的,但這不在本書的討論范圍。我們可以將此理解為諸葛亮此次把趙云的任務做了程序化處理,“一次只能知道和處理一條命令”。這是計算機程序工作的重要特點,計算機一次只能處理一條指令。 程序工作的第二個重要特點是有“前后順序”,不能出錯,假如趙云在第一次開錦囊的時候不小心錯拿順序排在第二個的錦囊,那么劉備馬上就打道回府了,此次任務馬上以失敗告終。如果趙云在該拿出第二個錦囊時誤拿了第三個并執行,那不但會使任務失敗,很可能劉備的性命都不保,所以嚴格的順序是程序工作的另一個重要特點。 諸葛亮之所以敢于寫下3條命令后讓劉備和趙云前往吳國,其原因在于他對將要發生的情況一清二楚,也就是說他“對將要發生的事情已經預知在先”,這是程序工作的唯一要素。程序員是在他(或她)知道將要處理的所有事情之后,才能編寫出可以完成工作的程序。如果發生了程序員沒有預計到的情況,程序員是不會處理的。 假如周瑜在劉備一到南徐就把他扣下,那故事的結局就完全不同了。但諸葛亮篤定這種事情不會發生,因此不會給出相關的指令。 從上面的討論中我們知道了計算機的工作特點和編程要素,那么使用電子技術的計算機CPU需要什么樣的結構和指令系統才能工作呢?只要對上面的故事細節進行深入的對比思考,我們就會很容易了解到CPU為什么會有現在這樣的結構,以及需要那些指令才能完成“計算”任務。 先比較一下程序化了的趙云與由電子技術構成的CPU系統之間的4個差別: (1) 信號系統:趙云是個活人,主要有三種信號起作用,即視覺、聽覺和觸覺。而計 算機系統只有一種信號系統,即電平的高和低(0和1); (2) 解碼方式:趙云有復雜的語言能力,加上能閱讀文字,因此解碼能力超強,諸葛亮 只須將復雜任務寫在字條上,趙云就能理解并完成。而CPU是機器屬性,只能通過對電平信號組的硬性規定來選擇相應的功能電路(在技術上稱為譯碼電路)來完成極其簡單的指令,和人們使用的文字語言相比,計算機的指令少得可憐,通常在三十多條至一百多條之間,功能也極其簡單,因此程序員常常為完成一個簡單的任務需要寫上許多條指令; (3) 執行指令的間隔:趙云拆開錦囊的時間沒有明確的規定,諸葛亮只告知拆錦囊時的 必要條件,指令間隔內其它事情如劉備的起居飲食安全保衛等一律由趙云自己處理,不需要下達特別的指令。而CPU靠系統提供的時鐘頻率運行,指令的時間間隔非常精確,只要提供系統電力它便不停地運行,即使在看起來沒有處理任何事物時也不會停止執行指令操作。CPU系統不能自己處理任何事,它所做的每一件事情都必須在程序員的指令下完成,甚至包括等待任務的待機方式,都由程序員編寫的指令完成; (4) 工作形式:趙云能夠自行處理和完成一般活動中的所有事情,這些不用諸葛亮操心。 但有一個缺點就是需要休息。而CPU系統雖然缺心眼,所有事情都必須由程序員預先編寫好程序,但只要維持電力供應就可以不停地運作,這是它比人優越的唯一點。 通過以上比較可以看出,計算機技術只能在機器屬性限制的條件下對人的模擬,為方便討論,先委屈一下英勇神武的趙云先生,將他設想成一個不那么聰明能干的人,他的所有事情都需要諸葛亮事先用錦囊安排好。這樣要使趙云完成任務就需要諸葛亮給趙云準備裝有大量錦囊的指令,由于指令的順序不能有錯誤,所以還必須給所有錦囊編上順序號碼,為了防止錦囊丟失,諸葛亮還必須準備一個專門的器具,這個專門用來放置錦囊的器具相對CPU系統來說就是程序存儲器,前面講過的存儲器是由許多存放數據的“房間”組成的,我們可以先將每個房間理解成一個“錦囊”,這樣CPU可以通過給存儲器的地址線輸出地址信號,讀到每個“錦囊”的內容。所以CPU自身有一個程序計數器,程序計數器的輸出端對接程序存儲器。計數器的工作方式是每輸入一個計數脈沖其計數輸出+1,所以CPU每完成一步操作就會讓程序計數器+1,自動尋址到下一個錦囊的地址。 存放和按順序尋找錦囊的問題解決了,下一步就是讀取和解碼指令的問題。趙云并不是隨時都可以讀取錦囊指令的,比如在騎馬奔馳的時候、天黑看不清的時候或者有其他人干擾的時候。趙云讀取指令必須進入一個能夠取出錦囊字條并安心閱讀的條件環境。CPU也一樣,它需要先將指令取到一個叫做“指令暫存器”的地方進行譯碼處理。由于譯碼器的具體操作需要在講解CPU的機器指令集時才能完全搞清楚,所以本節只需將它理解成可以將指令翻譯的并啟動執行的部件就可以了。實際上CPU的每一個功能操作都需要一個相應的“暫存器”,后面的章節將會結合指令集進行詳細的介紹。 最后需要做的就是指令的實現與執行,趙云要執行指令就要運動他的執行機構——身體,所以CPU要執行指令也需要動用它的執行機構——總線(即地址、數據、控制三總線)。這里初學者往往會感到十分困惑,總線不是用于指令的讀取和排序的嗎?怎么又變成執行機構了呢? 先不妨看一下趙云的主要執行機構:雙手,趙云要從錦囊里取字條,這時他的雙手用于取指,如果指令要求他拿起兵器去巡邏,他的雙手就要去拿上兵器并要操作馬匹或馬車等交通工具,趙云雙手是通用和多功能的。CPU的總線也是一樣的,除了完成取指操作外還能完成指令的執行,它也是通用和多功能的。趙云作戰需要配置用于戰斗的專用兵器,CPU的總線為完成專門任務也需要配置專門的工作硬件。趙云在不需要戰斗時把兵器丟在一邊,CPU也只是在需要操作時才通過總線來操作這些硬件,平時也會將它丟在一邊不予理會。 通過上面的對比討論,我們知道了CPU系統主要由3個部分構成的,即:指令讀取、指令譯碼和指令執行。下面將討論CPU到底需要什么樣的指令系統才能工作? |