天天看點

處理器和指令

處理器負責從記憶體讀取資料,并利用資料執行加法等處理。訓示執行這些處理的就是“指令”。指令有以下幾種:進行加法的ADD指令,進行乘法的MULT(multiply)指令,以及讀寫記憶體的LOAD指令、STORE指令等。讓我們看看這些指令是怎樣規定的。

指令架構入門

前面說過,指令架構詳細地規定了處理器應當支援哪些指令、各個指令應執行什麼操作等。

“架構”這個詞源于建築術語,意思是建築的基本設計,現在被挪用到計算機的基本設計中,表示指令的設計、結構等。

拿汽車打比方,可以把指令架構想象成這樣:發出向右打方向盤的指令,汽車就向右轉;發出踩油門的指令就加速;發出踩刹車的指令就減速。對于汽車來說,這些基本指令是通用的,而汽車大燈、轉向燈(轉向提示器)的操作,以及空調、導航的操作指令,則由各家公司自行設計。

至于處理器的情況,Intel和AMD的x86處理器、PowerPC、SPARC、ARM、MIPS等各處理器的指令系統的應用領域和各指令的位排列順序都不一樣,互相并不相容,是以一個指令架構上的機器語言程式(後面詳細介紹)無法在其他指令架構的處理器上運作。

Intel x86 架構的指令格式

圖1.15描述了Intel x86的指令格式。原來Intel/AMD的x86處理器隻能處理8位和16位資料,架構擴充後才支援32位、64位資料。但是,指令中隻有1比特用于區分8位指令還是16位指令,是以該比特被擴充為表示8位/32位切換或8位/64位切換。※ ModR/M為指定寄存器和記憶體的修飾符(ModR/M還有其他功能),SIB可能是Scale、Index、Base的縮寫,不過Intel沒有給出這些詞彙的定義。

處理器和指令

圖1.15的“指令”部分為ADD(加法)、MOV(記憶體與寄存器之間資料複制)等(後面會介紹其他指令)1~3位元組長的指令種類。

如果進行運算的兩個操作數(運算的輸入資料)都是寄存器,那麼可以用圖1.15的“指令”欄表示這種情況;如果操作數位于記憶體中,就要用到下一個“ModR/M”欄(1位元組)(圖1.15)。

操作數位于記憶體中時,圖1.15的“SIB”欄(1位元組)可以用來指定位址計算的修飾方法,還可以利用圖1.15的“偏移”欄指定1~4位元組長的位址偏移。

如果不使用寄存器或記憶體,而是将常量作為操作數,就把它的值寫到1~4位元組的“立即數”欄(圖1.15)。

并不是所有指令都有這些欄,不必要的欄位可以省略,是以叫做“可變長指令格式”。指令格式的長度将在第2章介紹。

關于x86 的稱呼

Intel處理器的指令架構始于1978年發售的8086處理器。後來,Intel還發行了80186、80286、80386、80486等性能更高的處理器,是以連同後來的Pentium、Core處理器在内,這些處理器統稱為x86。x86處理器的指令架構稱為“x86架構”。

但是Intel對它正式稱為IA-32(Intel Architecture-32),AMD的正式名稱為AMD86架構。

機器指令——處理器的指令

計算機使用二進制,處理器的指令也由0和1組成。處理器依次讀取記憶體中儲存的指令,了解指令内容,然後執行指令的處理。這種處理器能夠了解的指令格式稱為“機器指令(Machine Instruction)”。

機器指令有以下幾種:

—進行資料加減乘除的算術運算指令

—進行資料位運算的AND、OR、NOT等邏輯運算指令

—從記憶體讀取資料的加載指令(Load Instruction)等

—向記憶體寫入資料的存儲指令(Store Instruction)等

此外,執行完一條指令後,處理器會讀取下一個位址的指令并執行,但分支指令(Branch Instruction)可以更改下一個要執行的指令。而條件分支指令(Conditional Branch Instruction)可以判斷前面的運算結果是0還是負數,隻有在滿足指定條件時才進行跳轉,不滿足條件時繼續執行下一個位址的指令。

位址空間

加載、存儲指令等通路的記憶體都是有位址的。帶有位址的記憶體排列成區間,就像現實世界中的開闊場地一樣,是以把帶有位址的區間整體稱為位址空間。圖1.16為16/32/64位位址空間的示意圖。 

20世紀70年代的8位微處理器,通路記憶體時隻能指定16位(0~65535)位址。是以能通路的最大記憶體容量也被限制在64KB之内。也就是說,這些處理器的位址空間是64KB。

可見,記憶體位址的位數與運算器、寄存器的位數大多數情況下是一緻的,但這并不是必需的。例如,第一代x86處理器8086的記憶體位址隻有16位,但加上偏移量(程式的起始位址)後變成20位,就可以通路1MB的位址空間。但是,8086上一個程式能使用的記憶體空間隻有16位,運算器與寄存器也是16位,是以被稱做16位架構。

另外,現在的處理器大都擁有64位運算器和寄存器,但還沒有安裝264位元組記憶體的計算機,是以記憶體位址總線的實際寬度為40~48位左右。不過,這些處理器依然叫做64位架構。是以說,XX位架構并不是太嚴格的定義,根據常理判斷就行了。

32 位位址空間

随着計算機安裝的記憶體容量增加,8086的位址指定方式已不能通路所有記憶體。是以,Intel的Pentium處理器和各種RISC處理器都準備了32位運算指令,用32位指定記憶體位址。這些處理器的位址空間是4GB,不過4GB并不是指記憶體空間的大小,而是指這些處理器擁有32位位址空間。

32位位址可以通路4GB的記憶體,但說到底隻是“可以指定4GB位址空間”,并不意味着計算機一定有4GB記憶體空間。事實上,第一個支援32位位址空間的處理器問世當初,計算機的實際記憶體容量不過幾MB而已。而且,當時認為32位位址空間應該很寬裕了,哪知現在的伺服器會安裝16GB以上的記憶體,就連個人計算機也動不動就安裝4GB以上的記憶體,是以32位位址空間明顯不夠用了。

64 位位址空間——AMD86-64 、Intel 64

20世紀90年代,RISC處理器(後述)增加了64位運算指令,開始支援64位位址空間。而x86系列中,AMD在2000年先行發表了名為AMD86-64的64位擴充架構,之後Intel也開始支援同一種架構。為了将64位擴充架構與原來的x86架構差別,通常稱它為“x64架構”。

現在的計算機安裝的記憶體達到幾GB甚至數十GB,預計今後還會繼續按照每三年增長四倍的速度發展,那麼64位位址空間也将在40~45年後開始捉襟見肘。在那之前的10年内必須擴充位址空間,是以可以預見,從現在開始30~35年後,即2040—2045年間,就要采用支援128位位址空間的指令架構了。

本文節選自《支撐處理器的技術——永無止境地追求速度的世界》

處理器和指令

(美)海撒安藤著;

李劍譯

電子工業出版社出版