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