匯編程序設計與計算機體系結構:軟件工程師教程》 —2.3 處理器">《匯編程序設計與計算機體系結構:軟件工程師教程》 —2.3 處理器
914
2025-04-01
2.2 體系結構概述
宏觀地來看,計算機系統是由幾種主要的組件構成的,這些組件合起來就形成了我們常說的計算機。中央處理器(Central Processing Unit,CPU)當然是計算機的中樞,然而計算機要想正常運作還必須有其他一些組件,例如主板、內存以及各種輸入/輸出(Input/Output,I/O)設備。圖2-1描述了這些常見的組件一般是怎樣安排在主板上的。
圖 2-1 主板上的組件
主板是連接計算機主要組件的板卡,它相當于一套高速公路系統,以供數據在組件之間移動。主板通過各種連接手段與組件相連,例如通過內存插槽與內存條相連,通過 CPU 插座(CPU Socket)與 CPU 相連,通過數據線與硬盤及光驅相連,通過擴展槽與擴展卡相連,通過連接線與鍵盤、鼠標及其他一些外部 I/O 設備相連等。為了與這些組件通信,數據必須沿著主板中的通信渠道來傳送,這些通信渠道稱為總線(bus)。
總線是指主板中的一組線路或導線,用來在組件之間傳輸數據。從背面觀察主板很容易就能看到這些總線,如圖 2-2 所示。由于導線所經過的地方各層纖維玻璃之間含銅,因此這些地方的顏色看上去比周圍淺。
圖 2-2 從背面觀察到的主板
計算機中最主要的總線叫作系統總線(system bus),如圖2-3所示,它實際上是數據總線、地址總線與控制總線這三者的合稱。系統總線使得 CPU 能夠與內存及計算機中的其他 I/O 設備相通信,為了確保通信正常,這些與 CPU 通信的設備必須與對應的總線連接起來。數據總線(data bus)用來在組件之間傳遞指令及數據,其中的指令指的是從內存中加載數據、把數據放入內存,或是從光驅中讀取數據等動作。為了正確傳遞信息,還必須傳輸指令所針對的內存地址和數據。地址總線(address bus)就負責地址方面的通信工作。此外,控制總線(control bus)在系統組件的通信工作中也很重要,它會在組件之間傳輸信號,使得組件能夠在適當的時機通信,以確保同步運作(例如,某組件不應該在某設備處于繁忙狀態時從該設備中讀取數據)。
除了系統總線,還需要一個部件才能使組件之間得以通信。這個部件就好比節拍器。節拍器按照一定的速度打拍子,使得表演者能夠跟上音樂的節奏,而該部件也是按照一定的頻率來產生脈沖,使得計算機的組件之間能夠在適當的時機相互通信,而不會以任意的時間間隔隨意地進行溝通。因為那樣就有可能出現其中一個組件要求通信而另一個組件尚未準備好或暫時無法通信的情況。這個部件就是主板上的系統時鐘(system clock)。
系統時鐘的基本單位叫作時鐘周期(clock cycle),它的前半段稱為高電平期(up-tick),此時電壓由低變高(用二進制來表示就是從 0 變成 1),后半段稱為低電平期(down-tick),此時電壓由高變低(或者說從 1 變成 0)。圖2-4演示了整個時鐘周期。
圖 2-4 時鐘周期
要傳輸數據就必須有地方來存儲這些數據及指令,為此,計算機必須擁有存儲器(memory)。然而在開始討論存儲器之前,首先必須知道計算機中有哪幾種類型的存儲器。圖2-5描述了各類存儲器之間的層次關系。
最頂層的存儲器距離上最接近CPU 的運算電路(arithmetic circuit,該電路通常位于 CPU 自身中),而最底層的存儲器則離 CPU 最遠。存儲器離 CPU 越遠,容量越大,價格越低,而速度也越慢;反之,離 CPU 越近,容量越小,價格越高,而速度也越快。至于速度、容量與成本之間的具體關系,則要看每個位置上的存儲器是什么類型。
編程知識:由于離 CPU 越遠的存儲器速度越慢,因此,開發匯編程序的人應該清醒地使用這些存儲器。也就是說,如果程序中的數據很少且可以放入緩存(cache)中,那就不要把它放到內存(RAM)中,以免降低程序的運行速度。同理,如果程序中的數據可以放入內存中,那就不要將其寫入磁盤,否則就得花時間去讀寫磁盤了。
離 CPU 最近的存儲器是靜態隨機存取存儲器(Static Random Access Memory),簡稱 SRAM。它實際上就在 CPU 芯片中。下一節會講到,這種存儲器通常稱為緩存。SRAM 是速度最快的存儲器類型。比它稍慢一些的是動態隨機存取存儲器(Dynamic RAM),簡稱 DRAM。主板上有一些靠近 CPU 的槽位,其中插著的內存條就屬于這種類型的存儲器。大家通常所說的主存(main memory)一般指的就是 DRAM,也可以簡稱 RAM。還有一種存儲器比 DRAM 還慢,這就是機械硬盤或固態硬盤等磁盤(disk),主要相當于我們常說的硬盤,后面會講到它。這種存儲器用來長期保存數據,而不像緩存或 RAM 只用來暫時保存。向 CPU 發送數據或是從中獲取數據的時候,必須與系統時鐘的節奏相合,而訪問這些類型的存儲器中的數據時也同樣要如此。
訪問主存(也就是 DRAM)通常需要經過 4 個步驟,而每個步驟至少需要花費 1 個時鐘周期來完成(有時還會更多),因此訪問主存所需的總時間至少是 4 個時鐘周期。
1. 把待讀數據的內存地址放入地址總線。
2. 修改處理器的 Read(RD)標志,這是個起斷言(assertion)作用的標志,也就是說,如果處理器在執行讀取操作時發現該標志的值沒有設置正確,就會 halt(暫停)。
3. 等待內存控制器給出響應(至少要 1 個時鐘周期)。
4. 把數據從數據總線復制到目標位置。
操作內存的時候必須注意存儲方式。計算機通常會依照具體的架構來把數據以字節為單位分塊(chunk)保存(例如 x86 的塊是 32 位,x86_64 的塊是 64 位)。如果要把 32 位的十六進制值 12345678h 保存到計算機的內存中,首先需要像表2-1這樣將其寫為 4 個字節。由于每個十六進制位相當于 4 個二進制位,因此兩個十六進制位就相當于 8 個二進制位,也就是 1 個字節。
為了保存該值,首先必須找到可以使用的內存位置。為簡單起見,我們假設該值能夠保存到 0x00000000h 這個位置上。一般來說都會像表 2-2 這樣把數據最左側的字節(本例中的 12)保存到地址編號最小的位置(也就是表格第一行所寫的位置0x00000000)上,而把數據最右側的字節(本例中的78)保存到地址編號最大的位置(也就是表格最后一行所寫的位置,0x00000003)。
表2-2 大端序
由于內存地址也是以字節(或者說 8 個二進制位)為單位增長的,因此,像這樣按照從左到右的順序把數值中的字節保存到內存中的對應地址是符合書寫習慣的。不過要注意這里的單位是字節而不是數位。表2-2這種存儲方式是把權重最大的字節(或者說最高有效字節,most significant byte)保存到地址最低的地方,由于權重最大的字節(也就是“大端”,big end)出現在最前面,因此這種方式叫作大端在前的字節順序(Big-Endian byte order),簡稱大端序或大尾序。還有一些計算機系統采用相反的順序,把權重最小的字節(“小端”,little end)保存在最前面,這種保存方式稱為小端在前的字節順序(Little-Endian byte order),簡稱小端序或小尾序。表 2-3 演示了怎樣按照小端序來保存值 12345678h。
表 2-3 小端序
編程知識:如果用常見的辦法(也就是基本的變量)來訪問內存中的數據,那么不用關心計算機用的是大端在前還是小端在前的字節順序。但如果要通過內存地址來訪問或查看某個位置上的數據,那就必須注意這個問題了,因為只有這樣才能通過正確的地址找到你想要的數據。
Intel 的 x86 與 x86_64采用小端序,Motorola 的 68XX、68XXX 系列處理器以及 IBM 的 Z 系列采用大端序。還有的處理器兩種順序都支持,例如 Sun SPARC、ARM 及 PowerPC,這稱為雙端序(bi-endian)。
軟件開發
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。