你真的深入理解計算機系統了嗎之篇章三 程式的結構

2022-03-21 06:12:49 字數 1632 閱讀 9485

計算機中的資訊=位+上下文。進一步,資訊可以分為兩大類:一類是資料,一類是指令。指令用來表明操作的動作,資料用來表明被操作的物件,這兩者同時也構成了乙個完整的程式。

對於資料而言,我們先來談整數的表示和運算。無符號編碼表示無符號數,補碼表示有符號數,相信大家對這兩種編碼應該是非常熟悉的(無符號編碼沒有符號位,補碼的最高位表示符號位)。

在整數的運算方面一共有兩種,一種是算術運算,一種是邏輯運算。算術運算就指平常的加減乘數,當然要注意溢位、符號位等各種情況(這個講起來的話太多了,而且我也擔心自己講不好,不懂的讀者可以去翻翻書)。邏輯運算主要包括移位操作、或與非等,對於移位操作,一定要注意是算術右移還是邏輯右移,演算法右移在所缺的位置要補齊符號位,邏輯右移要補齊零。

由於浮點型的表示和運算,我也掌握的不是太好,讀者自己翻書吧。

對於指令而言,有傳送指令、算術指令、邏輯指令、跳轉指令以及支援過程呼叫和返回的指令。這些指令與c語言中的結構都是對應的,下面我會為大家講解。

傳送指令主要是mov a, b這種形式,像c語言中的賦值操作以及取某個變數的值等最後都會轉化為這種指令。傳送指令一共有三種定址方式。第一種方式為立即數定址,形式為mov $imm, em,表示將imm傳送到暫存器或者儲存器em中;第二種方式為暫存器定址,形式為mov ea, em,表示將暫存器ea中的值傳送到em中;第三種為儲存器定址,形式為mov (ea), em,表示將暫存器中的值所表示的儲存器位置的值傳送到em中,當然這個有很多變形,但本質是一樣的。要注意到不能從儲存器傳送到儲存器。

在算術和邏輯指令中,像加減乘除、或與非、移位操作自不必說,在c語言中的這些操作與彙編中基本是沒什麼區別。我主要來說一下lea,即載入有效位址指令,它是mov指令的變形。指令形式為lea s, d,效果是將s的位址傳送到d中,其中d必須為暫存器,像c語言中的求位址操作&就對應這種組合語言。例如lea (ea), eb,在mov指令中表示將暫存器中的值所表示的儲存器位置的值傳送到eb中,而在lea指令中表示將暫存器ea中的值傳送到暫存器eb中。同時還可以用這個指令來進行一些算術運算。

跳轉指令主要包括無條件跳轉和有條件跳轉,無條件跳轉的形式為jmp label或者jmp *operand,後者的跳轉目標是從暫存器或者儲存器中讀出的。對於有條件跳轉,只有在符合某些條件的情況下才會跳轉,比如je、jne等,那麼在彙編中是如何知道這些條件成立不成立呢?除了整數暫存器,cpu還包含一組單個位的條件碼暫存器,比如cf(無符號溢位)、zf(零)、sf(負數)、of(有符號溢位),它們描述的是最近操作的屬性,也有一些指令專門用來設定條件碼而不修改其他暫存器,像test、cmp。跳轉指令根據這些條件碼的組合情況來決定是否跳轉。在c語言中像if語言、for語言、while語言、switch語言最終都會翻譯成跳轉指令。

最後一種指令就是支援過程呼叫和返回的指令。其中call指令用來過程呼叫,ret指令用來從過程呼叫中返回。c語言中的過程最後會翻譯為彙編中的過程呼叫**。在x86系統中一共有8個整數暫存器,其中有兩個暫存器支援過程的實現,分別是棧指標%esp,幀指標%ebp。當執行call label時(label表示被呼叫的標記,也可以是*operand的形式),計算機將返回位址(呼叫者的下一條指令位址)入棧,再將幀指標中儲存的值(呼叫者的幀指標)入棧,最後將棧指標中儲存的值傳給幀指標,下面就開始執行被呼叫者中的指令,當執行ret返回時就是call指令的逆序,先將幀指標中儲存的值傳給棧指標,再push %ebp,將返回位址更新到程式計數器中,繼續呼叫函式的執行。

深入理解計算機系統

關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...

《深入理解計算機系統》

知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...

深入理解計算機系統

系統的硬體組成 快取記憶體 作業系統管理硬體 程序虛擬記憶體 檔案amdahl定律 併發和並行 0和1組成的位序列,又稱為位元序列,8個位被組織成一組,成為位元組。每個位元組表示程式中的某些文字字元。系統中的所有資訊 包括磁碟檔案 記憶體中的程式 記憶體中存放的的使用者資料以及網路上傳送的資料,都是...