1. 程式人生 > >多麼痛的領悟——計算機組成原理第一講

多麼痛的領悟——計算機組成原理第一講

多麼痛的領悟——計算機組成原理第一講

前言

大家好,我是泰斗賢若如,我又開始更新文章了,本次更新的內容是計算機組成原理,是大學計算機相關專業必須學的,我是大三上學期學的,剛開始學的時候感覺很難,get不到重點,直到學了一遍,被期末考試逼了一遍,我才有所領悟,多麼痛的領悟啊。我打算自己把整本書中的重點總結一遍,第一是自己過一遍,第二是給新手贈予玫瑰,希望你們學的時候花最少的時間學更多的知識,別再在考試前病急亂投醫了(偷笑表情)

一、計算機系統

1、計算機的硬體

計算機系統由“硬體”和“軟體”兩大部分組成。

所謂“硬體”,是指組成計算機的各種物理裝置,我們平時說的“買一臺計算機”,購買的其實就是硬體,最主要的硬體有:主機板、中央處理器、硬碟、記憶體等。

 

主機板是整個計算機的“交通樞紐”,各種器件都要連線到主機板上,才能正常工作。

 

中央處理器是計算機的“大腦”,它是計算機的運算核心和控制核心。

 

 

硬碟是計算機的“筆記本”,上面記錄了各種資料,需要的時候,就會從這裡讀取或往這裡寫入。

 

 

 

記憶體是計算機的“稿紙”,一般來說,同一個處理器能利用的記憶體越大,運算速度也就越快。

 

 

 

 

有趣的是,顯示器雖然是人們關注最多的裝置,但它其實並非是一個必須的硬體,對於個人計算機來說,即使沒有顯示器也可以正常執行,但只要少了上面所說硬體中的任何一個,計算機就不能正常運行了,硬體就像我們人體的骨骼,有了骨骼的支撐,計算機才成承載軟體,發揮作用。

 

 

 

 

 

2、計算機的軟體

所謂“軟體”,它看不見摸不著,由人們事先編制的具有各類特殊功能的程式組成。 通常把這些程式寄寓於各類媒體(如RAM、ROM、磁帶、磁碟、光碟、甚至紙帶等),它們通常存放在計算機的主存或輔存內。 由於“軟體”的發展不僅可以充分發揮機器的“硬體”功能,提高機器的工作效率,而且已經發展到能區域性模擬人類的思維活動,因此在整個計算機系統內,“軟體”的地位和作用已經成為評價計算機系統性能好壞的重要標誌。

計算機的軟體通常分為兩大類:系統軟體和應用軟體。

系統軟體保證計算機系統高效、正確執行的基礎軟體。

應用軟體為解決某個應用領域中的問題而編制的程式。

 

 

綜上所述,再通俗點說“什麼是軟體呢”?

軟體其實是我們生活中常用的一些應用,比如聊天類的QQ、微信;購物類的淘寶、京東;遊戲類的吃雞、英雄聯盟等等吧,這些我想大家都再熟悉不過了,這些都可以稱作為軟體。軟體是個抽象的名詞,所以你也不用在這鑽牛角尖,你可以把軟體進行分類,比如說可以分成系統軟體、應用軟體等。先說系統軟體吧,我想就算你是個小白,你至少也應該知道你現在用的電腦上裝的是windows系統吧,那這個windows系統就是一個系統軟體,系統軟體是負責管理計算機系統中各種獨立的硬體,使得它們可以協調工作。系統軟體使得計算機使用者和其他軟體將計算機當作一個整體而不需要顧及到底層每個硬體是如何工作的。

像這樣的系統軟體還有很多,先暫時瞭解windows這一個系統軟體就可以了。知道了系統軟體,再說應用軟體,它是為了某種特定的用途而被開發的軟體,它可以完成各種具體任務,比如遊戲、辦公、儲存資料等等,沒有應用程式的計算機,基本上什麼功能都沒有,值得一提的是,應用程式必須在作業系統的支援下才能執行。

熟悉智慧手機的同學都知道,應用分為“安卓版”、“ios版”等幾種,如果安裝的時候選錯了型別,是不能安裝的,更不要提正常運行了。

 

 

 

 

 

  軟體就像人體的血管、肌肉,如果空有一身骨架,而沒有相對應的軟體,計算機也只能是一堆廢銅爛鐵。

 

 

 

再說簡單點,其實軟體就是我們所說的“程式”或“應用”,軟體由人類編寫而成,具有各種各樣的功能,在上面說了硬體,其實硬體就是服務員,只會“按圖索驥”,軟體怎麼說,硬體就怎麼做。換句話說,沒有安裝軟體的計算機,什麼都不會做,軟體有許多種,作業系統是其中非常重要的一種,顧名思義,人們只有通過作業系統才能讓計算機執行各種指令,電腦的“Windows”系統,手機的“安卓”系統、“iOS”系統等都屬於作業系統,我想看到這你應該明白了不少吧,要是還沒明白,就再多看幾遍,看圖理解也行,至少你現在要明白沒有安裝軟體的計算機就是一堆廢銅爛鐵,應用程式必須再作業系統的支援下才能執行。

 

 

3、計算機的解題過程及程式語言的前世今生

現代計算機的解題過程如下:

通常由使用者用高階語言編寫程式(稱為源程式),然後將它和資料一起送入計算機內,再由計算機將其翻譯成機器能識別的機器語言程式(稱為目標程式),機器自動執行該機器語言程式,並將計算結果輸出。

 

 

在上面我已經詳細描述了“軟體”,那現在出現了一個問題是人類是如何編寫軟體的呢?我就開門見山了,軟體是由“程式語言”編寫而成的。

程式語言的前世今生

 

 

程式語言

程式語言,看到這幾個字後不要急著看官方定義,首先顧名思義,自己先理解,我來說說我對程式語言的理解吧:一眼掃過去,你看到的是“語言”二字,對語言大家都不陌生,語言是人類最重要的交際工具,是人們進行溝通的主要表達方式,像漢語、英語、法語、俄語等都是世界上的主流語言。既然語言是用來溝通交流的,那“程式語言”也不例外,區別在於像漢語、英語等這些語言是人與人進行交流的語言,而“程式語言”是人與計算機進行交流的語言,只是溝通物件不同。那再說計算機,它其實本質上就是電流加一堆硬體,如果沒有電流,計算機就像桌子椅子一樣,它不是“活”的東西,有了電流,它才能“活”起來。那這電流是怎麼讓這一堆硬體“活”起來的呢?比如展現出我們現在所看到的豐富多彩的文字、圖片,那它是如何做到的呢?其實當時這個涉及計算機的這些先賢們也遇到過這個問題,他們考慮我怎麼能讓這些硬體動起來,怎麼讓我的電流給它驅動起來?也是他們進行思考,最後終於思考出來了,電流其實可以表示兩種狀態,高電壓和低電壓兩種狀態,而現在電流有很多條,也就是說有很多的高電壓和低電壓,那我把這個高電壓低電壓的這種實際的物理現象用人類所能理解的數字關聯起來,叫數字關聯,高電壓是1,低電壓是0,這樣有個強制規定的話,就可以跟我們人類的語言有了一定的關聯關係,而這兩種1,0的狀態也能被計算機所識別,計算機本質上其實就是像1010這樣的一堆組合幹各種事情,那到此為止,我們可以說能用1010這樣不同的狀態跟計算機進行溝通了,具體怎麼溝通聽我在這瞎掰也沒有任何意義,所以一定要制定規則,比如所1011010這一堆資料表示開啟音樂,1111000101這一堆資料表示開啟檔案,等等吧,這是我瞎說的,主要體會精神,這就代表你把無序的0101狀態給規則化了,研發一種語言你必須定義規則,就像研發英語要定義主謂賓語法一樣的道理,那現在我們把0101組合成不同的序列定義相應的規則,這樣有了這些規則後我告訴你,最古老的計算機語言就出現了,有了規則它就能稱之為語言了,這個最古老的語言就叫機器語言。

機器語言

其實看了上面的這些,你大概明白其實機器語言說白了就是一堆0101的組合,然後把0101的組合規則直接給你通過在晶片燒製的時候,也就是把這些規則直接刻在晶片上了,那電流這麼走,十個燈一塊亮,就代表要播放聲音了,另外幾個燈要是一起亮,就代表要開啟檔案了,這就是機器語言。機器語言作用是直接跟硬體打交道,所以計算機能夠很好的理解,因為這就是它的天生語言。但是計算機能很好的理解,但人卻不能很好的理解,像0101這樣的組合有很多,人理解起來很費勁,要是來個複雜點的動作,五十、一百個0101組合在一塊,你就頭疼了,而且你還有可能寫錯,一寫錯就導致整個就完蛋了,你要是想排錯,就得數哪個1是不是排錯位置了啥的,這就讓人頭大了。說到這你明白,機器語言的出現雖然能讓計算機幹事情了,但是人與計算機的這種溝通效率是極低的,你可能在草稿上寫一個月終於寫出來計算機能理解的五句話,開啟一個檔案,播放一個音樂,然後關了,你寫這些耗時不說還怕寫錯,所以效率是特別低下的。科技要發展,所以人們就要進步,要想辦法讓人與計算機之間的溝通效率更高,就把語言提升了,像之間那種0101的組合程式設計師不需要死記硬背了,把那難記的一堆0101組合變成一個對應的人能理解的英文,比如說,我們運算時需要加減乘除,如果用機器語言描述加號,要表示成1010001111就如說就這些吧,是不是很難記,那現在把這一串機器語言變成人能理解的英文單詞ADD,就是把這個0101組合變成了英文,你只要在鍵盤上敲出了相對應的英文,它就自動給你翻譯成0101這樣的機器語言,然後讓計算機去執行,這個東西就叫做組合語言。

組合語言

對人來講,像用字母表示或者用數字、符號表示這樣的一些符號語言簡單直接、便於記憶,比0101組合表示的機器語言簡單方便了很多,但其實開發效率還是很低,你看下面的圖片,就是用匯編語言寫的,僅僅是在螢幕上列印輸出一句helloworld居然要寫這麼多程式碼,可見這個效率實在是不怎麼高,你比如所現在開發一個APP三天就能上線了,你要是用匯編語言的話,估計你得寫半年還不一定寫的完(這是我猜的,不要在意真實性,就當是虛構吧),所以人們還要進步,繼續為提高效率而努力。不過人類不愧是高階動物,聰明才智,最後研發出一種語言叫高階語言,這種語言更容易讓人去理解,能使不熟悉具體計算機的人也能很方便的使用計算機,跟計算機更好的溝通交流,比如說之前說的用機器語言表示加號需要1010001111這樣一堆程式碼,然後有了組合語言後只需要記住ADD就可以,但現在有了高階語言後,加號就直接用數學中我們常用的“+”去表示就可以了,這個大家肯定都能明白。

 

 

高階語言

組合語言的一個問題在於需要你自己去呼叫硬體的各種指令,比如你想播放聲音,播放聲音也是由晶片來控制的,晶片裡面已經燒製了各種指令,你要想播放聲音,就要調各種相應的指令,組合語言的問題在於它要親自去調,自己去寫程式碼去調這種指令,這其實非常複雜,你要想調音卡,就是播放聲音,你還要學習音箱的這個硬體的各種操作指令,你要想顯示螢幕,你還要看顯示卡上也就是顯示螢幕上的操作晶片的各種指令,還是蠻複雜的,做這樣的程式設計師我覺得很痛苦,可能那個時候的程式設計師都是禿頭(猜的),現在的程式設計師禿頭的應該沒以前多了,不過掉頭髮另說啊,因為他們學了高階語言,這個高階語言的好處就是讓程式設計師對底層硬體的各種指令做了封裝,封裝的意思就相當於把那些複雜的東西都給你處理掉了,暴露給你的東西都是非常簡單的,真正實現了你想播放音樂,你就直接寫playMusic("夜空中最亮的星");我偶像張傑的一首好聽的音樂就能播放了,這就牛逼了,就算你沒學過程式設計的人,看了這個指令也知道這是在播放音樂,其實你的這行指令在底層可能給你解析出來了好幾十條彙編的指令,然後又把彙編的指令轉化成0101這種機器指令,但是這些複雜的東西都不需要你來管因為計算機已經幫你封裝好了,你只需要呼叫一下就OK。有了這樣的高階語言,人類的開發效率才提高起來,然後才能說我想寫一個軟體,然後一週就上線了,就能賣錢了···這些就是程式語言的一個演化過程,從最早的機器語言到組合語言再到現在的高階語言,那我們現在聽到的C、C++、JAVA、Python等主流的這些語言都是高階語言

4、馮·諾依曼結構計算機

提到馮諾依曼計算機,有必要提一下“計算機之父”——馮·諾依曼,馮·諾依曼是美籍匈牙利人,他的精髓貢獻有兩點:二進位制思想與程式記憶體思想。

再詳細點,馮諾依曼理論的要點是:

  • 數字計算機的數制採用二進位制;
  • 計算機應該按照程式順序執行;

根據馮諾依曼理論構成的計算機,有如下功能:

  • 把需要的程式和資料送至計算機中。
  • 必須具有長期記憶程式、資料、中間結果及最終運算結果的能力。
  • 能夠完成各種算術、邏輯運算和資料傳送等資料加工處理的能力。
  • 能夠根據需要控制程式走向,並能根據指令控制機器的各部件協調操作。
  • 能夠按照要求將處理結果輸出給使用者。

根據上述對應的功能,計算機具有五大基本元件,分別如下:

  1. 輸入資料和程式的輸入裝置;
  2. 記憶程式和資料的儲存器;
  3. 完成資料加工處理的運算器;
  4. 控制程式執行的控制器;
  5. 輸出處理結果的輸出裝置。

 

 

5、計算機如何執行你的程式

  • 把程式和資料裝入到主儲存器中
  • 從程式的起始地址執行程式
  • CPU的工作非常簡單,它從記憶體中獲取一個指令並執行該指令,然後從記憶體中獲取下一個指令並執行。CPU能以驚人的速度從事枯燥的工作。
  • 每條指令都要經過取指、譯碼、執行。

6、計算機的效能指標

機器字長

進行一次運算所能處理的二進位制資料的位數。

主存容量

指主存所能儲存的最大容量。

運算速度

衡量效能的一個重要指標。CPU時鐘週期、主頻、MIPS等。

資料通路頻寬

資料匯流排一次並行傳遞資料的位數。

7、進位制的世界

進位制碼與不同進位制數之間的轉換

十進位制、二進位制、八進位制、十六進位制

1、基本數碼
  • 0 1 2 3 4 5 6 7 8 9
  • 0 1
  • 0 1 2 3 4 5 6 7 8 9 A B C D E F
2、逢P進1,借1當P
3、進位制間的轉換

十進位制轉換為P進位制

  • 整數部分:除P倒取餘
  • 小數部分:乘P正取整

例:6.325轉換成二進位制

 

 

P進位制轉換為十進位制

  • 將各位數碼和其權值相乘後求和,即可轉換成十進位制

例:10110轉換成十進位制

 

 

8、計算機的運算方法

帶符號數的表示及運算

1、無符號數和有符號數

在計算機中參與運算的數有兩大類:無符號數和有符號數。

計算機中的數均存放在暫存器中,通常稱暫存器的位數為機器字長。所謂無符號數,即沒有符號的數,在暫存器中的每一位均可用來存放數值。當存放有符號數時,則需留出位置存放符號。因此,在機器字長相同時,無符號數與有符號數所對應的數值範圍是不同的。

對有符號數而言,符號的“正”、“負”機器是無法識別的,但由於“正”、“負”恰好是兩種截然不同的狀態,如果用“0”表示“正”,用“1”表示“負”,這樣符號也被數字化了,並且規定將它放在有效數字的前面,即組成了有符號數。

把符號“數字化”的數稱為機器數,而把帶“+”或“-”符號的數稱為真值。一旦符號數字化後,符號和數值就形成了一種新的編碼。在運算過程中,符號位能否和數值部分一起參加運算?如果參加運算,符號位又需作哪些處理?這些問題都與符號位和數值位所構成的編碼有關,這些編碼就是原碼、補碼、反碼和移碼。在這些編碼中,補碼的應用居多,原因是補碼可以帶符號運算,而且可以變減為加。

2、原碼、反碼、補碼、移碼錶示法
1、真值為整數

例:

當x=+1110(x為真值)時,

x原碼=0,1110(用逗號將符號位和數值部分隔開)

x反碼=0,1110

x補碼=0,1110

x移碼=1,1110

當x=-1110(x為真值)時,

x原碼=1,1110

x反碼=1,0001

x補碼=1,0010

x移碼=0,0010

2、真值為小數

例:

當x=+0.1101(x為真值)時,

x原碼=0.1101(用逗號將符號位和數值部分隔開)

x反碼=0.1101

x補碼=0.1101

x移碼=1.1101

當x=-0.1101(x為真值)時,

x原碼=1.1101

x反碼=1.0010

x補碼=1.0011

x移碼=0.0011

表示規則:

原碼:原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值。

反碼:反碼有兩種情況:

  • 當原碼為正數時,其反碼就等於正數的原碼
  • 當原碼為負數時,其反碼就等於正數的原碼按位取反,但是最高位的符號位不變。

補碼:補碼有兩種情況:

  • 當原碼為正數時,其補碼就等於正數的原碼
  • 當原碼為負數時,其補碼就等於正數的原碼按位取反,符號位不變,最後再在末尾加1(即在反碼的末尾加1)

移碼:移碼(又叫增碼)是符號位取反的補碼。

3、移位運算

例:設機器數字長為8位(含1位符號位)

當A=+11010時,

移位前: A原碼=A反碼=A補碼=0,0011010

左移一位: A原碼=A反碼=A補碼=0,0110100

右移一位: A原碼=A反碼=A補碼=0,0001101

當A=-11010時,

移位前:

A原碼=1,0011010

A反碼=1,1100101

A補碼=1,1100110

左移一位:

A原碼=1,0110100

A反碼=1,1001011

A補碼=1,1001100

右移一位:

A原碼=1,0001101

A反碼=1,1110010

A補碼=1,1110011

算數移位規則
  • 1.機器數為正時,不論是左移還是右移,添補程式碼均為0
  • 2.由於負數的原碼數值部分與真值相同,故在移位時只要使符號位不變,其空位均添0
  • 3.由於負數的反碼各位除符號位外與負數的原碼正好相反,故移位後所添的程式碼應與原碼相反,即全部添1
  • 4.分析任意負數的補碼可發現,當對其由低位向高位找到第一個“1”時,在此“1”左邊的各位均與對應的反碼相同,而在此“1”右邊的各位(包括此“1”在內)均與對應的原碼相同。故負數的補碼左移時,因空位出現在低位,則添補的程式碼與原碼相同,即添0;右移時因空位出現在高位,則添補的程式碼應與反碼相同,即添1
邏輯移位規則
  • 邏輯左移時,高位移丟,低位添0
  • 邏輯右移時,低位移丟,高位添0
加法和減法運算

加減法運算是計算機中最基本的運算,因減法運算可看做被減數加上一個減數的負值,即A-B=A+(-B),故在此將機器中的減法運算和加法運算合在一起討論。現代計算機中都採用補碼作加減法運算。

 

[-B]補由**[B]補連同符號**在內,每位取反,末位加1而得

 

溢位判斷

在計算機中,超出機器字長的現象叫溢位。

補碼定點加減運算判斷溢位有兩種方法:

1.用一位符號位判斷溢位

  • 對於加法,只有在正數加正數和負數加負數兩種情況下才可能出現溢位,符號不同的兩個數相加是不會溢位的。
  • 對於減法,只有在正數減負數或負數減正數兩種情況下才可能出現溢位,符號相同的兩個數相減是不會溢位的。

 

 

 

 

2.用兩位符號位判斷溢位

在用變形補碼作加法時,2位符號位要連同數值部分一起參加運算,而且高位符號位產生的進位自動丟失,便可得正確結果。

變形補碼判斷溢位的原則是:當2位符號位不同時,表示溢位,否則,無溢位。不論是否發生溢位,高位(第1位)符號位永遠代表真正的符號。