計算機是怎樣跑起來的

情情說發表於2018-11-24

一直對「程式如何在計算機中跑起來的」很感興趣,也看過一些相關的書籍和文章,前段時間在多看閱讀上看到一本相關的書,用了幾天時間看完後,覺得很不錯,用簡單易懂的語言,圍繞計算機是怎樣跑起來的,把相關的知識串起來,雖然每塊講的都很淺,但令人印象深刻。

書的作者是日本的矢澤久雄,作者那個年代,計算機還是8位元微型計算機,面對為數不多的技術,可以從容地把時間花在學習計算機基礎上。但這些基礎知識,即使到了今天也沒有太大變化,即便是面對複雜的最新技術,一旦迴歸到計算機的基礎知識,就會很好理解。

其實不僅是計算機,其他學問亦是如此。首先要劃出一個「知識範圍」,精通一門學問所必知必會的知識都在這個範圍內。其次是掌握該範圍內每個知識點中基礎中的基礎知識。最後是能獨當一面的目標,即掌握了這些知識可以做什麼。

目錄

下面是我的閱讀筆記,把重點進行歸納總結。

計算機的三大原則

計算機是執行輸入、運算、輸出的機器

計算機的硬體是由大量IC組成,每塊IC上帶有很多引腳,這些引腳有的用於輸入,有的用於輸出。IC會在其內部對外部輸入的資訊進行運算,把運算結果輸出到外部。

其實計算機就是臺簡單的機器,因為它只能做這三件事。

程式是指令和資料的集合

無論程式多麼複雜,內容都是指令和資料,學習過彙編的應該很清楚。

所謂指令,就是控制計算機進行輸入、運算、輸出的命令。把向計算機發出的指令一條條列出來,就得到了程式。

資料是指令的物件,程式設計時,程式設計師會為資料賦予名字,稱其為變數。

計算機的處理方式有時與人的思維習慣不同

用數字表示所有資訊,這就是一個很具有代表性的計算機式的處理方法,和人類思維習慣不一樣。例如,人們會用藍色之類的詞語描述有關顏色,計算機會使用0,0,255表示藍色。對文字也是一樣,會把文字編碼成相應的數字再做處理。

試著製造一臺計算機

上面提到,計算機內部主要由被稱作積體電路的元件組成,雖然有各種IC,最重要的三種是:CPU、記憶體、I/O,只要用電路把CPU、記憶體以及I/O上的引腳相互連線起來,為每塊IC提供電源,再為CPU提供時鐘訊號,硬體上的計算機就組裝起來了。

時鐘訊號帶有一個時鐘,滴答滴答地每隔一定時間就變換一次電壓的高低,輸出時鐘訊號的元件叫做「時鐘發生器」,裡面帶有晶振,根據其自身的頻率產生時鐘訊號。時鐘訊號的頻率可以衡量CPU的運轉速度。

書中選取Z80 CPU作為CPU,TC5517作為記憶體,Z80 PIO作為I/O為主要器件,一步一步教我們如何製作一個微型計算機。書中提供了一個電路圖,我跟著作者的逐步介紹,用彩色筆一步步描畫相應的電路,印象深刻。

電路圖

具體步驟細節我就不再贅述了,感興趣的可以閱讀原書,主要總結下令我印象深刻的幾個點。

IC與普通電器一樣,只有接通電源才能工作,三大器件都分別帶有Vcc引腳和GND引腳,這一對兒引腳用於為Vcc引腳供電,將+5V電源連線到各個IC的Vcc引腳,將0V電源連線到各個IC的GND引腳,時鐘發生器也要連線上,這樣接通電源後這些IC和時鐘發生器就可以工作了。

微信計算機所使用的IC屬於數字IC,每個引腳上的電壓要麼是0V,要麼是+5V,Vcc和GND引腳上的電壓是恆定不變的,其他引腳上的電壓,會隨著計算機的操作在+5V和OV質檢不斷變化。

可以想成0V表示數字0、+5V表示數字1,那麼數字IC就是在用二進位制數的形式收發資訊。

計算機以CPU為中心運轉,要與記憶體和I/O進行資料的輸入輸出,為了指定輸入輸出資料時的源頭或目的地,CPU上備有「地址匯流排引腳」。Z80 CPU 地址匯流排引腳共有16個,所能指定的地址共有2^16,可以指定65536個資料存取單元。

一旦指定了存取資料的地址,就可以使用資料匯流排引腳進行資料的輸入輸出了。Z80的資料匯流排引腳有8個, 可以一次性地輸入輸出8位元的資料,意味著如果想要輸入輸出位數大於8位元的資料,就要以8位元為單位切分這個資料。

CPU的地址匯流排引腳和資料匯流排引腳要與I/O和記憶體對應的引腳相連。

有一個問題,從上面電路圖可以看到,Z80 CPU 使用同一組地址匯流排引腳和資料匯流排引腳連線到了記憶體和I/O上,CPU如何區分訪問的是記憶體儲存單元,還是I/O中的暫存器呢。Z80 CPU上的MREQ和IORQ引腳解決了這個問題,當和記憶體之間有資料輸入輸出時,MREQ引腳上的值是0,反之是1。

對記憶體和I/O而言,還要分清CPU是要輸入資料還是輸出資料,需要用到CPU的RD引腳和WR引腳,與記憶體和IO對應的引腳連線起來。

介紹這麼多,就是讓大家對計算機硬體之間的互動方式有個直觀的認識,程式在這種結構中就可以跑起來,看到想要的結果。

體驗一次手工彙編

先來描述下實現場景:把由指撥開關輸入的資料輸入CPU,然後CPU再把這些資料原封不動地輸出到LED,也就是說,可以通過撥動指撥開關控制LED的亮或滅。

使用匯編語言來程式設計,組合語言是根據表示指令功能的英語單詞起一個相似的暱稱,並將這個暱稱賦予給0和1的組合,這種英文單詞叫做助記符。

組合語言的語法很簡單,即把標籤、操作碼、運算元並排寫在一起,標籤的作用為為該行程式碼對應的記憶體地址起一個名字,這樣後面可以直接跳轉到這個地方。操作碼就是表示做什麼,提供了多少操作碼,CPU就有多少功能。運算元表示的是指令執行的物件,CPU的暫存器、記憶體地址、I/O地址或者直接給出的數字都可以作為運算元。如果某個指令需要多個運算元,用逗號分割,運算元的個數取決於指令型別。

常用指令

再來說下暫存器。既然資料的運算是在CPU中進行的,那麼CPU內部就應該有儲存資料的地方,就是暫存器。CPU帶有什麼樣的暫存器取決於CPU的種類。Z80 CPU 所帶有的暫存器如下:

暫存器

比如,A暫存器叫做累加器,是運算的核心,F暫存器叫做標誌暫存器,用於儲存運算結果的狀態,比如是否發生了進位,數字大小的比較結果等。PC暫存器儲存著指向CPU接下來要執行的指令的地址。運算元必須是已儲存在CPU暫存器中的數字。

好了,下面使用匯編語言實現上面說的場景,主要思路是:設定Z80 PIO,為每個埠設定輸入輸出模式,然後與其進行輸入輸出。

// 設定埠(2)為輸入模式,這樣用括號括起來的數字,表示的是地址編號,207表示通知將要設定輸入輸出模式
LD A,207 //把207寫入到暫存器A
OUT (2),A  //把暫存器A中的資料寫入到IO地址對應的暫存器中
LD A,255 
OUT (2),A

// 設定埠(3)輸入輸出模式
LD A,207
OUT (3),A 
LD A,0
OUT (3),A

// 進入一段死迴圈,用於把指撥開關輸入的資料輸出到LED燈
LOOP: IN A,(0)
      OUT(1),A
      JP LOOP

複製程式碼

知識的範圍

這塊內容包括流程控制、資料結構、演算法、物件導向,他們是現代程式設計的基礎,熟練掌握這些知識,編寫實際業務時就簡單了。這些知識都包含的很多內容,大家也都瞭解,就不再介紹了。

資料庫和網路

這塊也比較熟悉,資料庫是資料的基地,方便資料的結構化儲存和檢索,網路解決了機器之間的資料傳遞,要約定好傳輸協議和資料格式,傳輸過程中要考慮資料安全問題。

這塊也不過多介紹了,涉及的知識包括MYSQL等資料庫、TCP/IP等網路協議、資料加密和和簽名、XML可擴充套件標記語言等。

大家平時工作時,要有意識的累積和思考這些知識,它們是比較穩定的,是其他知識的基礎,是程式設計師的內功。

歡迎掃描下方二維碼,關注我的個人微信公眾號,檢視更多文章 ~

情情說

相關文章