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

2017-2018-1 20155212 《信息安全系統設計基礎》第13周學習總結

date ref archive 64位 階段 gdb expr 匯編代碼 理解

2017-2018-1 20155212 《信息安全系統設計基礎》第13周學習總結

教材學習內容總結

歷史觀點

  • X86 尋址方式經歷三代
    • DOS時代的平坦模式,不區分用戶空間和內核空間,很不安全
    • 8086的分段模式
    • IA32的帶保護模式的平坦模式
  • 摩爾定律:預測在未來十年,芯片上的晶體管數量每年都會翻一番。

程序編碼

  • 編譯選項-Og告訴編譯器使用會生成符合原始C代碼整體結構的機器代碼的優化等級,使用較高級別遊湖產生的代碼會嚴重變形。
  • 重要的兩種抽象
    • 指令集體系結構或指令集架構來定義機器級程序的格式和行為
    • 機器級
  • %rip給出下一條指令在內存中的地址
  • objdump -d *.o反匯編
  • Ubuntu中gcc -S *.c
    更接近教材中代碼(刪除.開頭語句)
  • 註意
    • x86-64指令長度從1-15個字節不等
    • 反匯編器使用的指令命名規則與GCC生成的匯編代碼用的有些細微的差別
  • 用匯編代碼來訪問機器的低級特性
    • 用匯編代碼編寫整個函數,在鏈接階段把它們和 C函數組合起來
    • 利用GCC的支持,直接在C程序中嵌入匯編代碼
  • 二進制文件可以用od命令查看,也可以用gdb的x命令查看。有些輸出內容過多,我們可以使用more或less命令結合管道查看,也可以使用輸出重定向來查看
  • ATT與Intel匯編代碼格式

數據格式

  • C語言數據類型在X86-64中的大小。在64位機器中,指針長8字節。
C聲明 Intel數據類型 匯編代碼後綴 大小(字節)
char 字節 b 1
short w 2
int 雙字 l 4
long 四字 q 8
char* 四字 q 8
float 單精度 s 4
double 雙精度 l 8

訪問信息

  • 整數寄存器
    • esi edi可以用來操縱數組
    • esp ebp用來操縱棧幀
    • 32位的eax,16位的ax,8位的ah,al都是獨立的

    技術分享圖片

  • 操作數格式(s=1, 2, 4, 8

格式 操作數值
Imm(rb, ri, s) M[Imm+R[rb]+R[ri]·s]
  • MOV相當於賦值
  • 不能從內存直接MOV到另一個內存,要用寄存器中轉
  • MOV指令示例(源操作數,目的操作數)
    技術分享圖片
  • MOV指令大小匹配,MOVZ和MOVS將較小的源值復制到較大的目的
    • MOVZ類將目的中剩余的字節填充為0
      技術分享圖片
    • MOVS類通過符號擴展來填充,把源操作數的最高位進行賦值
      技術分享圖片
  • 局部變量通常是保存在寄存器中,而不是內存中。訪問寄存器比訪問內存要快得多。
  • 當執行強制類型轉換既涉及大小又涉及C語言中符號變化時應該先改變大小。
    • 壓棧:減小棧指針的值,再存放數據
    • 彈棧:從內存中讀數據,並增加棧指針的值
    • 棧“頂”在底部

算術和邏輯操作

  • 加載有效地址指令leaq實際上是movq指令的變形。將有效地址寫入到目的操作數,目的操作數必須是一個寄存器。
  • 加1、減1、取負、取補操作:一元操作,操作數是寄存器或內存位置
  • 加、減、乘、除、異或、或、與:二元操作,第一個操作數可以是立即數、寄存器或是內存位置,第二個操作數可以是寄存器或是內存位置
  • 移位操作:移位量可以是一個立即數,或者放在單字節寄存器%cl中
  • 減法:第二操作數-第一操作數

控制

  • 條件碼
    • CF:進位
    • ZF:零
    • SF:符號
    • OF:溢出
  • 跳轉指令
    • 無條件跳轉
      • 直接跳轉給出一個標號作為跳轉目標。jmp .L
      • 簡介跳轉:‘*’後面跟一個操作數指示符
        • 用寄存器中的值作為跳轉目標:jmp *%r
        • 用進村其中的值作為讀地址:jmp *(%r)
    • 有條件跳轉(只能是直接跳轉
      • 指令的名字和跳轉條件與SET指令的名字和設置條件是相匹配的
  • if-else

        t=test-expr;
        if(!t)
            goto false;
        then statement
        goto done;
    false:
        else-statement
    done:
  • do-while循環

    loop:
      body-statement
      t = test-sxpr;
      if(t)
          goto loop;
  • while循環
    • 跳轉到中間
        goto test;
    loop:
        body-statement
    test:
        t=test-expr;
        if(t)
            goto loop;
    • guarded-do
    loop:
      body-statement
      t = test-sxpr;
      if(t)
          goto loop;
  • for循環

    intit-expr;
    while(test-expr) {
        body-statement
        update-expr;
    }

    while循環的翻譯方式根據優化等級決定。

過程

教材學習中的問題和解決過程

  • 【問題一】如何將匯編代碼編寫的函數與C函數組合?
  • 【問題二】如何在C程序中嵌入匯編代碼?
  • 【問題三】leaq作為加載有效地址指令,實際上是movq的變形。那麽leaq與movq的用法有什麽不同?
  • 【問題三】CMP和SUB用在什麽地方?
    • CMP應該是用在對操作數進行測試的時候,比如,可以測試某個數與已知數的大小關系等;而SUB執行的是減法操作,用於普通運算中
  • 【問題四】while循環有兩種翻譯方式,這兩種翻譯方式分別什麽時候使用呢?
    • 較低優化等級編譯時(-Og)會采用跳轉到中間的策略,較高優化等級時采用guarded-do策略

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

  • 問題1:XXXXXX
  • 問題1解決方案:XXXXXX
  • 問題2:XXXXXX
  • 問題2解決方案:XXXXXX
  • ...

代碼托管

(statistics.sh腳本的運行結果截圖)

上周考試錯題總結

  • 錯題1及原因,理解情況
  • 錯題2及原因,理解情況
  • ...

課後重點習題

3.1

3.3

3.5

3.6

3.9

3.14

3.15

3.16

3.22

3.23

3.27

3.29

3.30

3.33

3.34

其他(感悟、思考等,可選)

xxx
xxx

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 96/96 1/1 15/15
第二周 30/126 1/2 21/36
第三周 30/156 1/3 21/57
第四周 10/156 1/4 20/77
第五周 23/189 3/7 20/97
第六周 201/390 3/10 18/115
第七周 0/390 2/12 20/135
第八周 0/390 3/15 22/157
第九周 284/674 3/18 25/182
第十周 53/727 1/19 15/197
第十一周 612/1339 2/21 26/223

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計為什麽這麽難,軟件工程 估計方法

  • 計劃學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進情況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

參考資料

  • 《深入理解計算機系統V3》學習指導
  • ...

2017-2018-1 20155212 《信息安全系統設計基礎》第13周學習總結