官术网_书友最值得收藏!

1.3.2 匯編

計算機運行的是二進制的數字邏輯。所有的東西要么是打開的(1),要么是關閉的(0)。這也包括在計算機上運行的程序。所有高級語言最終都會被轉換成一系列稱為機器碼(machine code)的二進制比特(bit)。機器碼定義了計算機為了完成期望功能所要執行的一系列指令。

1.機器碼

每個程序員都從“Hello World”程序開始學習編程語言。在x86中,“Hello World”的機器碼如下:

為了便于閱讀,這段機器碼是以十六進制編寫的,但它真正的值是一個由1和0組成的二進制字符串。這個二進制字符串包含了很多指令:翻轉晶體管以計算信息、從內存中提取數據、通過系統總線發送信號、與顯卡交互,以及輸出“Hello World”文本。如果你覺得這串字符似乎有點短,無法完成所有這些工作,那是因為這些指令會觸發操作系統(在這個例子中是Linux)來協助其完成。

機器碼可以非常精細地控制處理器。機器碼能完成的功能包括:

? 數據的內存讀取與寫入。

? 向寄存器中傳輸數據和從寄存器中讀取數據。

? 控制系統總線。

? 控制算術邏輯單元(ALU)、控制單元和其他組件。

這種低級別的控制意味著用機器碼編寫的應用程序可以非常強大和高效。然而,雖然記住并輸入各種比特序列來執行特定任務很炫酷,但這種方式效率低下且容易出錯。

2.從機器碼到匯編代碼

在機器碼中,一系列的比特代表特定的操作。例如,0x81或10000001是一個指令,它將兩個值相加并將結果存儲在特定的位置。

匯編代碼是對于人類而言可讀的機器碼。程序員可以使用add,而不是必須記住像0x81或10000001這樣的十六進制或二進制字符串。add助記符已被映射到0x81,所以這個簡略寫法使得編程變得更容易,同時也不會失去使用機器碼編程的任何優點。

將機器碼翻譯成匯編代碼會使其更易于理解。例如,前面的“Hello World”示例機器碼可以被轉化為一系列易于理解的指令。

如果你對機器碼有所了解,那么直接用它來編程可能很有趣,而且它有自己特定的適用場合。但在大部分時間里,這種做法既不高效也不實際。相比之下,使用匯編語言編程不僅能帶來與直接使用機器碼同等的好處,更重要的是,它更加實用。

一旦代碼用匯編語言寫好了,就能通過一個稱為“匯編”的過程由匯編器轉化為機器碼。而已經是機器碼的程序則可以通過反匯編器轉換回匯編代碼。

許多程序員并不直接使用機器碼或匯編語言編寫程序。相反,他們更喜歡使用更高級別的語言,這些語言能隱藏更多的細節。例如,以下偽代碼就類似于許多高級過程式語言代碼。

在編譯過程中,這些高級語言會被轉化成類似于下面的匯編代碼:

然后,我們可以使用匯編器將匯編代碼轉換成計算機可以使用的機器碼:

3.指令集架構和微架構

“計算機”這個詞覆蓋了廣泛的系統。智能手表和臺式計算機在工作方式上有許多相似之處。然而,它們的內部組件可能有很大的不同。

指令集架構(Instruction Set Architecture,ISA)描述的是運行程序的生態系統。ISA定義的因素包括:

? 寄存器:ISA規定了處理器是擁有單個寄存器還是擁有上百個寄存器。它還定義了這些寄存器的大小,即它們是包含8位還是128位。

? 地址和數據格式:ISA規定了用于訪問內存中數據的地址格式。它還定義了系統一次可以從內存中獲取多少字節的數據。

? 機器指令:不同的ISA可能支持不同的指令集合。它還定義了是否支持加法、減法、等于、停止等指令。

通過定義物理系統的功能,ISA也間接地定義了匯編語言。ISA規定了哪些低級指令可用,以及這些指令的功能。

微架構(microarchitecture)描述了特定的ISA如何在處理器上實現。圖1.4給出了Intel Core 2架構的一個示例。

ISA和微架構共同定義了計算機架構。成千上萬的ISA和成千上萬的微架構意味著也存在成千上萬的計算機架構。

定義

指令集架構(ISA)定義了寄存器、地址、數據格式和機器指令的工作方式。微架構則負責在處理器上實現ISA。ISA和微架構共同定義了計算機架構。

4.RISC與CISC計算機架構之比較

雖然存在成千上萬的計算機架構,但它們大體上可以分為兩大類。精簡指令集計算(Reduced Instruction Set Computing,RISC)架構定義了一小部分比較簡潔的指令。一般來說,RISC架構更便宜、更容易創建,而且硬件體積更小,功耗更小。

圖1.4 Intel Core 2架構

相對而言,復雜指令集計算(Complex Instruction Set Computing,CISC)架構定義了更多的強大指令。CISC處理器的造價更高,創造難度更大,一般體積更大,功耗也更大。

雖然從客觀角度來看,CISC架構似乎比RISC架構要差,但它的主要優勢在于編程的簡便性和高效性。讓我們來看一個假想的例子:一個程序希望在RISC和CISC系統中將一個值乘以5。

在這個例子中,如果CISC處理器有一個能從內存中加載值并對其執行乘法運算,然后將結果存儲在相同內存位置的乘法操作,那么它可以通過一條指令完成計算。但是,因為乘法運算太復雜,RISC處理器可能沒有直接的乘法操作。相反,RISC可以從內存中加載值,將它和自身相加四次,然后將結果存儲在同一內存位置。

RISC和CISC架構各有優點、缺點和使用場景。例如,一個CISC操作一條指令能夠執行的任務,一個RISC操作可能需要100條指令才能達成。然而,一個CISC操作可能需要100倍的時間,或者需要100倍的功率。

現今,RISC和CISC架構均被廣泛使用。常見的RISC架構實例包括:

? ARM(用于手機和平板計算機)。

? MIPS(用于嵌入式系統和網絡設備)。

? PowerPC(用于原始Mac和Xbox360)。

在本書中,我們專注于研究x86匯編語言,這是一種CISC架構。目前,所有現代個人計算機以及服務器都在使用這種架構,并且它得到了所有主流操作系統(如Windows、Mac以及Linux)甚至游戲系統(比如Xbox One)的支持,這使其成為軟件破解學習中最有力的一種。

主站蜘蛛池模板: 思茅市| 睢宁县| 贡山| 金塔县| 瑞昌市| 镇雄县| 浮梁县| 隆昌县| 扎囊县| 金塔县| 科尔| 泗洪县| 绵竹市| 栾城县| 东平县| 湘潭县| 留坝县| 体育| 邯郸市| 伊宁市| 盈江县| 建水县| 株洲市| 云梦县| 密云县| 昆明市| 潍坊市| 奉贤区| 黄山市| 苍南县| 木里| 丹凤县| 宁远县| 乐安县| 霍城县| 上高县| 南川市| 吉安市| 察隅县| SHOW| 砀山县|