1. 程式人生 > >讀書筆記:Charpter 3 程式的機器級表示

讀書筆記:Charpter 3 程式的機器級表示

深入理解計算機系統

Chapter 1 計算機系統漫遊

  • 原始碼與對應的彙編程式碼的關係通常不容易理解。這是一種逆向工程(Reverse engineering)-通過研究系統和逆向工程工作,試圖瞭解系統的建立過程。

3.1 歷史觀點

-摩爾定律P112


3.2 程式編碼

  • gcc編譯器選項
    • -Og生成符合原始C程式碼整體結構的機器程式碼優化等級(使用較高級別優化會使程式碼嚴重變形)
    • -S 檢視產生的彙編程式碼
    • -c 編譯並彙編彙編程式碼
  • gcc命令過程
    1.預處理擴充套件原始碼
    2.產生原始檔的彙編程式碼
    3.產生二進位制目的碼
    檔案,目標檔案沒有填入全域性值的地址
    4.連結器將程式碼與實現庫函式的程式碼合併,產生可執行程式碼檔案

3.2.1 機器級的程式碼 3.2.2 程式碼示例

  • 計算機系統使用了多種不同形式的抽象。對於機器級變成來說,兩種抽象尤為重要。第一種是由指令集體系結構或指令集架構(ISA)來定義機器級程式的格式和行為,定義處理器狀態,指令的格式,以及每條指令對狀態的影響。第二種抽象是,機器級程式使用的記憶體地址是虛擬地址,提供的記憶體模型看上去是一個非常大的位元組陣列。
  • 程式計數器(PC)給出給下一條指令在記憶體中的地址
  • 整數暫存器檔案包含16個命名的位置,分別儲存64位的值。
  • 條件碼暫存器儲存著最近執行的算術或邏輯指令的狀態資訊。
  • 一組向量暫存器可以存放一個或多個整數或浮點數值。

    3.2.2 程式碼示例

  • 要展示程式的二進位制目的碼,用反彙編器確定過程的程式碼長度,執行GDB。
  • objdump -d file.o 反彙編

    3.2.3 -3.6

    跳過

3.7 過程

  • 過程是軟體中一種很重要的抽象。它提供了一種封裝程式碼的方式,用一組指定的引數和一個可選的返回值實現了某種功能。可以在程式中不同的地方呼叫這個函式。
  • 傳遞控制 傳遞資料 分配和釋放內容 機制

3.7.1 執行時棧

  • c語言過程呼叫機制的一個關鍵特性在於使用了棧資料結構提供的後進先出的記憶體管理原則。
  • P呼叫Q中,Q執行時為區域性變數分配新的儲存空間,或者設定另一個過程的呼叫。Q返回時,任何它所分配的區域性儲存空間都以被釋放。
  • 當x86-64過程的儲存空間超出暫存器能夠存放的大小時,就會在棧上分配空間。這個部分叫做過程的棧幀(stack Fran)

3.7.2 轉移控制

  • 將控制從函式P轉移到函式Q只需要簡單地被程式計數器(PC)設定為Q的程式碼的起始位置。當稍後從Q返回的時候,處理器必須記錄好它需要的繼續p的執行的程式碼位置。在x86-64機器中,這個指令call Q呼叫過程Q來記錄的。
  • call指令有一個目標,指明被呼叫過程起始的指令地址。
  • call Q會把地址壓入棧中,並將pc設定為Q的起始地址。 壓入的地址A稱為返回地址。 ret會從棧中彈出地址A,並把pc設定為A。

3.7.3 資料傳送

  • x86-64中,可以通過暫存器最多傳遞6個整形引數引數。

3.7.4 棧上的區域性儲存

  • 有些時候,區域性資料必須存放在記憶體中。
    • 暫存器不足夠存放所有的本地資料
    • 對一個區域性變數使用地址運算子“&”,因為必須為它產生一個地址
    • 某些區域性變數是陣列或結構
    • 某些區域性變數是陣列或結構,必須通過陣列或結構引用被訪問到。

3.7.5 暫存器中的區域性儲存空間

  • 暫存器組是唯一給所有過程共享的資源。
  • 見P173

3.7.6 遞迴過程

  • 每個過程呼叫在棧中都有自己的私有空間,多個未完成呼叫的區域性變數不會相互影響。當過程被呼叫分配區域性儲存,返回時釋放。

3.8陣列分配和訪問 - 3.9 異質的資料結構

跳過


3.10 在機器級程式中將控制與資料結合起來

3.10.1 理解指標

跳過

3.10.2 應用:使用GDB偵錯程式

  • 啟動GDB:gdb prog
  • 命令圖例P194

3.10.3-3.10.5

跳過


3.11 浮點程式碼

跳過