寄存器和算數邏輯部件

處理器的底部或者四周,有大量的引腳,可以接受從外面來的電信号,或者向外發出電信号。這些引腳有很多,其中一部分用來将參數與運算的數字送入處理器的内部。有些引腳是用來複用的,假如現在要進行加法運算,那麼我們要重複使用這些引腳,來依次将被加數和加數送入。
一旦被加數通過引腳送入處理器,代表這個二進制數字的一組電信号就會出現在與引腳相連的内部線路上。這是一排高低電平的組合,代表着二進制數中的每一位。這時候,必須用一個稱為寄存器(Register)的電路鎖住。之是以要這樣做,是因為相同的引腳和線路馬上還要用于輸入加數。也正是因為這個原因,這些内部線路稱為處理器内部總線。
寄存器是雙向器件,可以在一端接受輸入并加以鎖存,同時,它也會在另一端産生一模一樣的輸出。與寄存器 RA 和 RB 相連的,是算術邏輯單元,或者算術邏輯部件(Arithmetic LogicUnit,ALU),也就是圖 2-2 中的桶形部分。它是專門負責運算的電路,可以計算加法、減法或者乘法,也可做邏輯運算。在這裡,我們要求它做一次加法。
一旦寄存器 RA 和 RB 鎖存了參與運算的兩個數,算術邏輯部件就會輸出相加的結果,這個結果可以臨時用另外一個寄存器 RC 鎖存,稍後再通過處理器資料總線送到處理器外面,或者再次送入 RA 或 RB。
8 位寄存器可以容納 8 比特(bit),或者說 1 位元組(Byte),這是因為
- 1 byte = 8 bit
另外,我們還要為這個位元組的每一位編上号,編号是從右往左進行的,從 0 開始,分别是0、1、2、3、4、5、6、7。在這裡,位 0(第 1 位)是最低位,在最右邊;位 7(第 8 位)是最高位,在最左邊。
16 位寄存器可以存放 2 個位元組,這稱為 1 個字(word),各個數位的編号分别是 0~15,其中 0~7 是低位元組,8~15 是高位元組。實際上,“字”的概念出現得很早,也并非指 16 個比特。隻是到了後來,才特指 16 個二進制位的長度。
32 位寄存器可以存放 4 個位元組,這稱為 1 個雙字(double word),各個數位的編号分别是 0~31,其中 0~15 是低字,16~31 是高字。
盡管圖中沒有畫出,但是 64 位寄存器可以容納更多的比特,也就是 8 個位元組,或者 4 個字。位數越多,寄存器所能儲存的數越大,這是顯而易見的。
記憶體儲器
記憶體按位元組來組織,單次通路的最小機關是 1 位元組,這是最基本的存儲單元。如圖中所示,每個存儲單元中,各位的編号分别是 0~7。
記憶體中的每位元組都對應着一個位址,如圖 2-5 所示,第 1 個位元組的位址是 0000H,第 2 個位元組的位址是 0001H,第 3 個位元組的位址是 0002H,其他依次類推。注意,這裡采用的是十六進制表示法。作為一個例子,因為這個記憶體的容量是 65536 位元組,是以最後一個位元組的位址是
FFFFH。
為了通路記憶體,處理器需要給出一個位址。通路包括讀和寫,為此,處理器還要指明,本次通路是讀通路還是寫通路。如果是寫通路,則還要給出待寫入的資料。
8 位處理器包含 8 位的寄存器和算術邏輯部件,16 位處理器擁有 16 位的寄存器和算術邏輯部件,64 位處理器則包含 64 位的寄存器和算術邏輯部件。盡管記憶體的最小組成機關是位元組,但是,經過精心的設計和安排,它能夠按位元組、字、雙字和四字進行通路。換句話說,僅通過單次通路就能處理 8 位、16 位、32 位或者 64 位的二進制數。
指令和指令集
指令就是用某些數來表示處理器所進行的操作,這稱為指令(instruction),或者機器指令,因為隻有處理器才認得它們。一般來說,指令由操作碼和操作數構成,但也有小部分指令僅有操作碼,而不含操作數。
對于inter處理器來說,如果通路記憶體中的一個字,那麼,它規定高位元組位于高位址部分,低位元組位于低位址部分,這稱為低端位元組序(Little Endian)。
指令和非指令的普通二進制數是一模一樣的,在組成記憶體的電路中,都是一些高低電平的組合。因為處理器是自動按順序取指令并加以執行的,在指令中混雜了非指令的資料會導緻處理器不能正常工作。是以,指令和資料要分開放,分别位于記憶體中的不同區域,存放指令的區域叫代碼區,存放資料的區域叫資料區。
古老的Intel 8086 處理器
8086 處理器内部有 8 個 16 位的通用寄存器,分别被命名為 AX、BX、CX、DX、SI、DI、BP、SP。這 8 個寄存器中的前 4 個,即 AX、BX、CX 和 DX,又各自可以拆分成兩個 8 位的寄存器來使用,總共可以提供 8 個 8 位的寄存器 AH、AL、BH、BL、CH、CL、DH 和 DL。
- 資料段:大量的資料集中在一起,位于記憶體中的某個地方,形成的一個段。
- 代碼段:完成某個工作的所有指令,必須集中在一起,處于記憶體的某個位置,形成的一個段。
為了在硬體一級提供對“段位址:偏移位址”記憶體通路模式的支援,處理器至少要提供兩個段寄存器,分别是代碼段(Code Segment,CS)寄存器和資料段(Data Segment,DS)寄存器。
在進行資料傳送或者算術邏輯運算的時候,使用算術邏輯部件(ALU)。比如,将 AX 的内容和 CX 的内容相加,結果仍在 AX 中,那麼,在相加的結果傳回到 AX 之前,需要通過一個叫資料暫存器的寄存器中轉。
處理器能夠自動運作,這是控制器的功勞。為了加快指令執行速度,8086 内部有一個 6位元組的指令預取隊列,在處理器忙着執行那些不需要通路記憶體的指令時,指令預取部件可以趁機通路記憶體預取指令。這時,多達 6 個位元組的指令流可以排隊等待解碼和執行。
8086 内部有 4 個段寄存器。其中,CS 是代碼段寄存器,DS 是資料段寄存器,ES 是附加段(ExtraSegment)寄存器。附加段的意思是,它是額外贈送的禮物,當需要在程式中同時使用兩個資料段時,DS 指向一個,ES 指向另一個。可以在指令中指定使用 DS 和 ES 中的哪一個,如果沒有指定,則預設是使用 DS。SS 是棧段寄存器。
IP 是指令指針(Instruction Pointer)寄存器,它隻和 CS 一起使用,而且隻有處理器才能直接改變它的内容。當一段代碼開始執行時,CS 指向代碼段的起始位址,IP 則指向段内偏移。這樣,由 CS 和 IP 共同形成邏輯位址,并由總線接口部件變換成實體位址來取得指令。然後,處理器會自動根據目前指令的長度來改變 IP 的值,使它指向下一條指令。
當然,如果在指令的執行過程中需要通路記憶體單元,那麼,處理器将用 DS 的值和指令中提供的偏移位址相加,來形成通路記憶體所需的實體位址。
8086 的段寄存器和 IP 寄存器都是 16 位的,如果按照原先的方式,把段寄存器的内容和偏移位址直接相加來形成實體位址的話,也隻能得到 16 位的實體位址。麻煩的是,8086 卻提供了 20 根位址線。換句話說,它提供的是 20 位的實體位址。
而這20位實體位址是先将段寄存器的内容左移 4 位(相當于乘以十六進制的 10,或者十進制的 16),形成 20 位的段位址,然後再同 16 位的偏移位址相加,得到 20 位的實體位址。