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

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

all 照片 ret 處理 就會 計劃 得到 進行 amp

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

教材學習內容總結

1.X86 尋址方式的變化:
DOS時代的平坦模式,不區分用戶空間和內核空間,很不安全;
8086的分段模式;
IA32的帶保護模式的平坦模式

2.機器編程的兩種抽象:

指令集體系結構(Instruction set architecture,ISA)——定義指令格式以及每條指令執行之後對狀態的影響。大多數ISA將程序行為描述成按順序執行的;
虛擬地址

3.一些處理器狀態

  • 1.PC,即程序計數器,用來指示將要執行的下一條指令在存儲器中的地址;

  • 2.整數寄存器,存儲數據;條件碼寄存器,保存邏輯指令狀態信息;等

4.gcc -S xxx.c 可以得到C語言編譯器產生的匯編代碼,但不會做其他工作;使用“-c”命令,GCC就會編譯並匯編該代碼,得到二進制文件XXX.o。由此可見,機器執行的實際上是對一系列指令進行編碼的字節序列。

5.函數中通用的匯編語句:

pushl %ebp //將該寄存器內容全部壓入程序棧
movl %esp,%ebp
addl %eax,accum
popl %ebp````

6.64位機器上想要得到32代碼: gcc -m32 -S xxx.c
7.反匯編器:

根據目標代碼產生一種類似於匯編代碼的格式。在linux中,可以通過objdump -d xxx.o實現

8.二進制文件可以用od 命令查看,也可以用gdb的x命令查看。有些輸出內容過多,我們可以使用 more或less命令結合管道查看,也可以使用輸出重定向來查看:

od code.o | more
od code.o > code.txt

9.Linux和的匯編格式為ATT格式,而Windows的為Intel格式。二者在語法上有區別——後者省略了指示大小的後綴、寄存器前的%等。

10.intel用術語“字”來表示16位數據類型。
int和long int都是4字節即雙字長度;
char是單字節;
指針存儲為4字節的雙字。另外,在匯編代碼中,b表示字節;w表示字,l表示雙字

11.一個IA32中央處理單元(CPU)包含一組8個存儲32位值的寄存器。其中,esi edi可以用來操縱數組,esp ebp用來操縱棧幀。另外四個寄存器為通用(在32位和16位機器上都可以用)寄存器。然而,當單獨使用其低四位的時候,一旦結果多於8位,仍然會發生溢出。

12.理解操作數的三種類型:

立即數(不超過32位的數值)
寄存器(用Ea表示任意寄存器a,R[Ea]表示它的值)
存儲器(會根據計算出來的地址訪問某個內存,用M[addr]表示)

13.尋址方式的通用公式:
有效地址可以表示為Imm+R[Eb]+R[Ei]*s。
Imm為立即數偏移;Eb為基址寄存器;Ei為變址寄存器;s為比例因子
如:

  • 1.Ea——操作數值:R[Ea]
  • 2.(Ea)——操作數值:M(R[Ea])
  • 3.Imm(Ea)——操作數值:M(Imm+R[Ea])

14.mov語句表示將值從源操作數“移給”目的操作數(前者在前,後者在後),相當於賦值。在IA32中規定不能從內存地址直接MOV到另一個內存地址,要用寄存器進行中轉。其中,MOVS是符號擴展;MOVZ是零擴展。

  • 1.MOV:將源操作數的值復制到目的操作數中;
  • 2.MOVS:將一個較小的源數據復制到一個較大的數據位置,高位用位擴展;
  • 3.MOVZ:將一個較小的源數據復制到一個較大的數據位置,高位用零擴展。

15.push,pop語句:

1.push:把數據壓入棧中;
2.pop:刪除數據。
3.棧遵循“後進先出”的原則,且棧頂向下增長;在棧指針%esp中保存著棧頂元素的指針。

16.leal,加載有效地址;將數據從存儲器讀到寄存器

1.NEG,取負
2.SUB S,D,將D-S的結果送至D
3.移位操作 SAL,SHL,SAR,SHR的移位量可以是立即數或%cl中的數

17.除了leal外,其他邏輯操作都會設置條件碼。另外,有些操作只設置條件碼而不將結果送至操作數——CMP:比較指令,與SUB類似;TEST指令,與AND類似(當兩數相等的時候,會將條件碼都設置成0)

18.SET類指令根據t=a-b的結果所設置的條件碼來將一個字節(目的操作數)設置為0或者1

19.跳轉指令:

  • 1.無條件跳轉——jmp.<標號> 跳轉到標號所指示的語句處;jmp *<操作數指示符>

【註意:如果形如%eax,即以%eax中的值作為跳轉目標;而形如(%eax)則是以其中的值作為地址,讀出跳轉目標】

  • 2.有條件跳轉——類似於SET類指令,是根據條件碼或者其組合來跳轉

20.do-while語句等價的goto語句

loop:   
body-statement     
t = test-sxpr;     
    if(t)     
        goto loop;     

21.while語句等價的goto語句

t = test-sxpr;    
if(!t)    
    goto done;      
loop:    
    body-statement   
    t = test-sxpr;    
        if(t)    
    goto loop;   
done:   

22.for循環的流程:程序首先對初試表達式init-expr求值,然後進入循環;在循環中它先對測試條件test-expr求值,如果為假則退出循環否則執行循環體;最後對更新表達式求值。

23.switch語句根據一個整數索引值進行多重分支;通過使用跳轉表使其更加高效。跳轉表是一個數組,表項i是一個代碼段地址(C語言用&表示一個指向數據值的指針;而&&表示一個指向代碼位置的指針)

24.IA32利用程序棧來支持過程調用(包括將數據和控制)。為單個過程分配的那部分棧做棧幀。最底端(地址最大)%ebp為幀指針;最頂端(地址最小)%esp為棧指針。當程序執行時,棧指針可以移動。

25.轉移控制

  • 1.call指令:後接被調用過程的起始的指令地址。效果是將返回地址入棧,並跳轉到被調用過程的起始處。
  • 2.ret指令:從棧中彈出地址,並跳轉到這個位置。

26.編譯器根據一組很簡單的慣例產生管理棧結構的代碼。參數在棧上傳遞給函數,可以從棧中相對於%ebp的正偏移量來訪問它們。可以用push指令或者是從棧指針中減去偏移量來分配在棧上的空間。

註意:

1.當帶選項-S和-O1運行gcc時,會產生xxx.s文件,其中帶有‘.‘開頭的行是指導匯編器和鏈接器的命令。
2.gcc -S產生的匯編代碼中可以把以‘.‘開頭的語句刪除再使用也沒關系。
3.了解Linux和windows的匯編格式的區別,Intel代碼省略了指示大小的後綴,即‘l‘;Intel代碼省略了寄存器名字前面的‘%‘符號,用的是esp,而不是%esp。

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

  • 問題1:以前對源代碼轉化為可執行代碼之間的過程記得不夠牢靠
  • 問題1解決方案:把其他周的代碼都轉化了一遍......從此記住了

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

  • 問題1:主要問題在實驗五裏。
  • 問題1解決方案:答案也在實驗五博客裏

代碼托管

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

上周考試錯題總結

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 其他

本周結對學習情況

20155211
- 結對照片
- 結對學習內容
-

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

虛擬機真有意思,Linux真有意思(微笑)

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 200/200 1/1 10/10
第二周 200/200 1/1 20/20
第三周 ?/200 1/1 15/20
第四周 200/200 1/1 20/20
第五周 100/200 1/1 20/20
第六周 200/200 1/1 20/30
第七周 500/500 1/1 20/20
第八周 300/300 1/1 15/30
第九周 300/300 1/1 15/20
第十一周 300/300 1/1 20/20
第十二周 300/300 0/0 20/30
第十三周 500/500 1/1 25/25

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

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

  • 計劃學習時間:25小時

  • 實際學習時間:25小時

  • 改進情況:

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

參考資料

  • 《深入理解計算機系統V3》學習指導
  • 源代碼到可執行代碼的過程以及Makefile的編寫
  • 老師給出的教材導讀

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