一直對「程序如何在計算機中跑起來的」很感興趣,也看過一些相關的書籍和文章,前段時間在多看閱讀上看到一本相關的書,用了幾天時間看完後,以爲很不錯,用簡單易懂的語言,圍繞計算機是怎樣跑起來的,把相關的知識串起來,雖然每塊講的都很淺,但使人印象深入。程序員
書的做者是日本的矢澤久雄,做者那個年代,計算機仍是8比特微型計算機,面對爲數很少的技術,能夠從容地把時間花在學習計算機基礎上。但這些基礎知識,即便到了今天也沒有太大變化,即使是面對複雜的最新技術,一旦迴歸到計算機的基礎知識,就會很好理解。算法
其實不只是計算機,其餘學問亦是如此。首先要劃出一個「知識範圍」,精通一門學問所必知必會的知識都在這個範圍內。其次是掌握該範圍內每一個知識點中基礎中的基礎知識。最後是能獨當一面的目標,即掌握了這些知識能夠作什麼。數據庫
下面是個人閱讀筆記,把重點進行概括總結。編程
計算機是執行輸入、運算、輸出的機器安全
計算機的硬件是由大量IC組成,每塊IC上帶有不少引腳,這些引腳有的用於輸入,有的用於輸出。IC會在其內部對外部輸入的信息進行運算,把運算結果輸出到外部。bash
其實計算機就是臺簡單的機器,由於它只能作這三件事。微信
程序是指令和數據的集合網絡
不管程序多麼複雜,內容都是指令和數據,學習過彙編的應該很清楚。數據結構
所謂指令,就是控制計算機進行輸入、運算、輸出的命令。把向計算機發出的指令一條條列出來,就獲得了程序。學習
數據是指令的對象,編程時,程序員會爲數據賦予名字,稱其爲變量。
計算機的處理方式有時與人的思惟習慣不一樣
用數字表示全部信息,這就是一個很具備表明性的計算機式的處理方法,和人類思惟習慣不同。例如,人們會用藍色之類的詞語描述有關顏色,計算機會使用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可擴展標記語言等。
你們平時工做時,要有意識的累積和思考這些知識,它們是比較穩定的,是其餘知識的基礎,是程序員的內功。
歡迎掃描下方二維碼,關注個人我的微信公衆號,查看更多文章 ~