1. 程式人生 > >2018-2019-1 20165228 《信息安全系統設計基礎》第三周學習總結

2018-2019-1 20165228 《信息安全系統設計基礎》第三周學習總結

系統設計 可能 name c編譯器 header 對齊 and 可選 test

2018-2019-1 20165228 《信息安全系統設計基礎》第三周學習總結

教材學習內容總結

程序的機器級表示:

計算機系統的兩種重要抽象

  • ISA(Instruction set architecture):指令集體系結構,機器級程序的格式和行為。定義了處理器狀態指令的格式,以及每條指令對狀態的影響。
  • 機器級程序使用的存儲器地址是虛擬地址,提供的存儲器模型看上去是一個非常大的字節數組。存儲器系統實際表現是將多個硬件存儲器和操作系統軟件組合起來。

    匯編代碼及其特點

  • 直接面向處理器的程序設計語言。編譯器將C語言代碼轉化為處理器執行的基本指令,匯編語言非常接近於機器代碼。
  • 特點:可讀性相較於機器代碼更好的文本格式表示

    X86-64指令

    技術分享圖片

  • 指令長度:1到15字節不等
  • 指令格式:OPER [DEST [, SRC]] ;註釋

    如何得到C語言代碼的匯編代碼

  • 運行GCC編譯器產生一個匯編文件code.s
gcc -Og -S code.c
//-Og表示優化程度,比如-01表示使用第一級優化,優化的級別與編譯時間和最終產生代碼的形式都有關系。
  • 使用-c命令選項,GCC編譯並匯編該代碼得到code.o
gcc -c code.c
  • 目標代碼:二進制形式,無法直接查看,機器實際執行的程序只是對一系列指令進行編碼的字節序列。

    如何根據目標代碼得到可讀的內容

  • 使用反匯編器(disassembler),可根據目標代碼產生一種類似於匯編代碼的格式。
objdump -d code.o

處理器:

  • 程序處理器:只是下條將要執行的指令在存儲器中的地址
  • 整數寄存器:包含16個命名的位置,分別存儲64位值。可用來記錄某些文件狀態,也可用來保存臨時值。
  • 條紋寄存器:保存最近執行的算數或邏輯指令的狀態信息。
  • 浮點寄存器:一組向量寄存器可以存放一個或多個證書或浮點數值。

    處理器的通用目的寄存器

  • X86-64的中央處理單元(cpu)包含一組16個存儲64位值的通用目的寄存器

    匯編指令

  • mov類指令:源操作數的值復制到目的操作數中。
  • movb 傳送字節
  • movw 傳送字
  • movvl 傳送雙字
  • movz 零擴展
  • 一元操作
  • INC 加一
  • DEC 減一
  • NEG 取負
  • NOT 取補
  • 二元操作
  • ADD 加
  • SUB 減
  • IMUL 乘
  • XOR 異或
  • OR 或
  • AND 與
  • 控制

條件碼

 ```
 CF:進位標誌

 ZF:零標誌

 SF:符號標誌

 OF:溢出標誌
 ```

循環(while, for)

 C語言do-while循環:
  
     do
    body-statement
    while(test-expr);
 匯編實現形式:
 
     loop:
    body-statement
    t = test-expr;
    if(t)
        goto loop;

尋址方式

  • 立即數尋址:操作數在指令中直接給出,只能用於源操作數,數據長度應與目的操作數長度匹配。
  • 寄存器尋址:數放在CPU的內部寄存器中,源操作數與目的操作數長度應一致。
  • 存儲器尋址:操作數存放在存儲器中,指令中給出操作數的偏移地址信息。

    過程

  • 一組指定的參數和一個可選的返回值實現某種功能。
  • 形式:函數、方法、子例程、處理函數等。
  • 實現過程需要的機器級支持機制
  • 傳遞控制
  • 傳遞數據
  • 分配和釋放內存

    分配和釋放內存

  • 棧上的局部存儲
  • 寄存器中的局部存儲空間
    棧幀:過程活動記錄,是編譯器用來實現過程/函數調用的一種數據結構。邏輯上講,棧幀就是一個函數執行的黃精:函數參數、函數的局部變量、函數執行完後返回到哪裏等等。
    延伸方式:棧是從高地址向低地址延伸。每個函數的每次調用都有自己獨立的一個棧幀,即裏面維持著所需要的各種信息。寄存器ebp指向當前的棧幀的地步(高地址),寄存器esp指向當前的棧幀頂部(低地址)。

    異質的數據結構

  • C語言的struct聲明創建一個數據類型,將可能不同類型的對象聚合到一個對象中。
  • 結構的所有組成部分都存放在一段連續區域內,結構的指針就是結構第一個字節的地址。

    數據對齊

  • 對於大多數x86-64指令來說,保持數據對齊能夠提高效率,但是它不會影響程序的行為。

    代碼調試中的問題和解決過程

  • 問題1:GDB調試問題“No source file named file.c. Make breakpoint pending on future shared library load?”和“沒有符號表被讀取。請使用”file” 命令”
  • 問題1解決方案:在編譯的時候,沒有加-g的選項,導致沒有產生調試符號。

    代碼托管

    學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 124/124 1/1 9/9

2018-2019-1 20165228 《信息安全系統設計基礎》第三周學習總結