2017-2018-1 20155212 《信息安全系統設計基礎》第13周學習總結
阿新 • • 發佈:2017-12-17
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類通過符號擴展來填充,把源操作數的最高位進行賦值
- MOVZ類將目的中剩余的字節填充為0
- 局部變量通常是保存在寄存器中,而不是內存中。訪問寄存器比訪問內存要快得多。
- 當執行強制類型轉換既涉及大小又涉及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周學習總結