深入理解計算機系統(二十一):Y86指令集體系結構
目錄
1、Y86指令
2、指令編碼
3、Y86異常
4、總結
本章我們將進入處理器體系結構介紹的神秘海洋中,我們熟悉的手機,電腦等設備的核心硬體都離不開處理器。處理器可以稱的上是人類創造的最複雜的系統之一,一塊手指大小的矽片,可以容納一個完整的高性能處理器、大的高速緩存,以及用來連接外部的邏輯電路。而且由於摩爾定律,從性能上講,今天一塊晶元上的處理器,已經使得三十年前比房間那麼大的超級計算機都相形見絀了。
那麼可能有人會問,我們軟體開發者,永遠都不會自己去設計處理器,那我們為什麼要學習處理器的實現?
①、首先處理器的設計是非常有趣而且重要的,處理器設計包括很多好的工程實踐原理,它需要完成複雜的任務,而結構又要儘可能的簡單和規則,我們去了解事物是怎樣工作的有其內在的價值。
②、處理器是整個計算機能正常工作的重要組成部分,理解處理器如何工作能幫助我們理解整個計算機如何工作。
③、雖然我們不用去設計處理器,但是我們工作的產出很多都是在包含處理器的硬體系統上運行的,了解它能讓我們工作更有效率。
我們知道計算機系統底層硬體只識別機器語言,而處理器就是用來執行一系列指令,每條指令執行某個簡單的操作。比如兩個數相加,彙編指令 ADD 會被編碼為一個或多個位元組組成的二進位格式。
這裡一個處理器支持的指令和指令的位元組級編碼稱為它的指令集體系結構(Instruction-Set Architecture,ISA)。
而不同的處理器家族,比如Intel IA32、IBM/Freescale PowerPC和AMD處理器家族,都有不同的ISA。這和我們上一章講的彙編語言是直接面向處理器(Processor)的程序設計語言,不同類型的CPU 有不同的機器指令系統,也就有不同的彙編語言是一樣的。不同的處理器,其指令集體系結構也不一樣,也就是說一個程序編譯成在一種機器上運行,就不能在另外一種機器上運行,如何處理這種兼容性問題呢?ISA 在編譯器編寫者和處理器設計人之間提供了一個抽象概念層,編譯器編寫者只需要知道允許哪些指令,以及它們是如何編碼的;而處理器設計者必須建造出這些指令的處理器。
正文:
1、Y86指令
本篇博客我們主要講解的是Y86指令體系結構。首先我們要知道的是Y86指令是不存在的,這是本書的作者受到 IA32指令,也就是「x86」的啟發,所假想出來的一種處理器體系結構,與 "x86" 相比,Y86指令集的數據類型、指令和定址方式都要少一些,位元組級編碼也比較簡單。但是它仍然足夠完整,能夠寫一些簡單的處理證書的程序,而設計一個Y86處理器要求我們面對許多處理器設計者同樣面臨的問題。所以學習Y86處理器的設計是很有必要的。
定義一個指令集體系結構,會包括定義各種狀態元素,指令集和它們的編碼、一組編程規範和異常處理事件。
Y86程序中的每條指令都會讀取或者修改處理器狀態的某些部分,這便稱為程序員可見狀態,這裡的程序員既可以是用彙編代碼寫程序的人,也可以是產生機器級代碼的編譯器。在處理器實現中,只要我們保證機器級程序能夠訪問程序員可見部分,就不需要完全按照ISA 隱含的方式來表示和組織這個處理器狀態。
和IA32一樣,Y86程序員可見部分包括:寄存器、存儲器、條件碼、PC(程序計數器)、程序狀態。
在Y86當中,寄存器也是有8個,每一個寄存器可以存儲一個字,也就是一個32位二進位。條件碼是一個一位二進位的寄存器,保存著最近的算術或邏輯運算所造成的影響的信息。PC則是程序計數器,記錄當前正在執行的指令的地址。存儲器則是一個很大的位元組數組,保存著程序和數據,Y86的程序可以使用虛擬地址(類似於數組的下標)來訪問存儲器,硬體和操作系統會將虛擬地址翻譯為實際的地址。最後一個程序狀態(stat),它則代表著程序的運行情況。它會指示程序是否正常運行,或者發生了某個特殊事件。
下圖是 Y86 ISA 各個指令的描述,左邊是指令的彙編碼錶示,右邊是位元組編碼。它只包括四位元組整數操作。
※14th:二進位的運算
※MS&PhD期間的筆記目錄
※當我們談論抽象時,我們在談論什麼
※第四節(4.3) 電子入門 DCDC設計與維修
※從內核角度,聊聊進程是什麼