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