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

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

教材學習內容總結

  • gcc -Og -o p p1.c p2.c:-Og告訴編譯器使用會生成符合原始C代碼總體結構的機器代碼的優化等級。
  • gcc -Og -S xxx.c:可看到編譯器產生的彙編代碼。
  • objdump -d xxx.o:可查看機器代碼文件的內容。
  • C語言調用機制使用了棧數據結構提供的後進先出的內存管理原則。
  • call指令有一個目標,即指明被調用過程起始的指令地址。
  • 有些狀況下局部數據必須存放在內存中。
    • 寄存器不夠存放全部本底數據。
    • 對一個局部變量使用地址運算符「&」。
    • 某些局部變量是數組活結構。
  • 寄存器組是惟一被全部過程共享的資源。必須確保一個過程調用另外一過程時,寄存器值不會被覆蓋。

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

(一個模板:我看了這一段文字 (引用文字),有這個問題 (提出問題)。 我查了資料,有這些說法(引用說法),根據個人實踐,我獲得這些經驗(描述本身的經驗)。 可是我仍是不太懂,個人困惑是(說明困惑)。【或者】我反對做者的觀點(提出做者的觀點,本身的觀點,以及理由)。 )html

  • 問題1:本章主要內容是彙編相關的,但我對彙編相關指令還不是很熟悉。
  • 問題1解決方案:
    -----------------------算數運算指令-----------------------
    ADD 加法
    ADC 帶位加法
    SBB 帶位減法
    SUB 減法.
    INC 加法.
    NEC 求反(以0減之).
    NEG 求反而後加1,假如NEG AL至關於Not AL; INC AL
    CMP 比較.(兩操做數做減法,僅修改標誌位,不回送結果).
    INC DPTR 數據指針寄存器值加1 (說明:將16位的DPTR加1,當DPTR的低字節(DPL)從FFH溢出至00H時,會使高字
    節(DPH)加1,不影響任何標誌位)

MUL A B 將累加器的值與B寄存器的值相乘,乘積的低位字節存回累加器,高位字節存回B寄存器(說明:將累加
器A和寄存器B內的無符號整數相乘,產生16位的積,低位字節存入A,高位字節存入B寄存器.若是積大於FFH,則溢出
標誌位(OV)被設定爲1,而進位標誌位爲0)數組

IMUL 整數乘法. 以上兩條,結果回送AH和AL(字節運算),或DX和AX(字運算),
DIV A B 將累加器的值除以B寄存器的值,結果的商存回累加器,餘數存回B寄存器(說明:無符號的除法運算,
將累加器A除以B寄存器的值,商存入A,餘數存入B。執行本指令後,進位位(C)及溢出位(OV)被清除爲0)安全

IDIV 整數除法. 以上兩條,結果回送: 商回送AL,餘數回送AH, (字節運算); 或 商回送AX,餘數回送DX, (字運算).數據結構

-----------------------邏輯運算指令---------------------------------
AND 與運算.
OR 或運算.
XOR 異或運算.
NOT 取反.
TEST 測試.(兩操做數做與運算,僅修改標誌位,不回送結果).
SHL 邏輯左移.
SHR 邏輯右移.
SAL 算術左移.(=SHL)
SAR 算術右移. (左移是同樣的,右移是不一樣的.邏輯右移補0,算術右移補最高位)
ROL 循環左移. ( ((unsigned char)a) << 5 ) | ( ((unsigned char)a) >> 3 )
rol eax,cl ==> eax=(eax<<cl)+(eax>>(32-cl));
ROR 循環右移. ror eax,cl ==> eax=(eax>>cl)+(eax<<(32-cl));
RCL 經過進位的循環左移.
RCR 經過進位的循環右移.
以上八種移位指令,其移位次數可達255次.
移位一次時, 可直接用操做碼. 如 SHL AX,1.
移位>1次時, 則由寄存器CL給出移位次數.
如 MOV CL,04
SHL AX,CL函數

-----------------------數據轉移指令---------------------------------學習

  1. 通用數據傳送指令.
    MOV 傳送字或字節.
    MOVSX 先符號擴展,再傳送.
    MOVZX 先零擴展,再傳送.
    PUSH 把字壓入堆棧.
    POP 把字彈出堆棧.
    PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆棧.
    POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆棧.
    PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆棧.
    POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆棧.
    BSWAP 交換32位寄存器裏字節的順序
    XCHG 交換字或字節.( 至少有一個操做數爲寄存器,段寄存器不可做爲操做數)
    CMPXCHG 比較並交換操做數.( 第二個操做數必須爲累加器AL/AX/EAX )
    XADD 先交換再累加.( 結果在第一個操做數裏 )
    XLAT 字節查錶轉換.
    ── BX 指向一張 256 字節的表的起點, AL 爲表的索引值 (0-255,即 0-FFH); 返回 AL測試

    爲查表結果. ( [BX+AL]->AL )
  2. 輸入輸出端口傳送指令.
    IN I/O端口輸入. ( 語法: IN 累加器, {端口號│DX} )
    OUT I/O端口輸出. ( 語法: OUT {端口號│DX},累加器 )
    輸入輸出端口由當即方式指定時, 其範圍是 0-255; 由寄存器 DX 指定時,
    其範圍是 0-65535.優化

----------------------- 標誌傳送指令-----------------------設計

LAHF 標誌寄存器傳送,把標誌裝入AH.
SAHF 標誌寄存器傳送,把AH內容裝入標誌寄存器.
PUSHF 標誌入棧.
POPF 標誌出棧.
PUSHD 32位標誌入棧.
POPD 32位標誌出棧.
0012F618 |00A8E5A8 ASCII "nk'MHBh30"指針

-----------------------程序轉移指令 -----------------------

1>無條件轉移指令 (長轉移)
JMP 無條件轉移指令
CALL 過程調用
RET/RETF過程返回.
2>條件轉移指令 (短轉移,-128到+127的距離內)
( 當且僅當(SF XOR OF)=1時,OP1<OP2 )
JA/JNBE 不小於或不等於時轉移.
JAE/JNB 大於或等於轉移.
JB/JNAE 小於轉移.
JBE/JNA 小於或等於轉移.
以上四條,測試無符號整數運算的結果(標誌C和Z).
JG/JNLE 大於轉移.
JGE/JNL 大於或等於轉移.
JL/JNGE 小於轉移.
JLE/JNG 小於或等於轉移.
以上四條,測試帶符號整數運算的結果(標誌S,O和Z).
JE/JZ 等於轉移.
JNE/JNZ 不等於時轉移.
JC 有進位時轉移.
JNC 無進位時轉移.
JNO 不溢出時轉移.
JNP/JPO 奇偶性爲奇數時轉移.
JNS 符號位爲 "0" 時轉移.
JO 溢出轉移.
JP/JPE 奇偶性爲偶數時轉移.
JS 符號位爲 "1" 時轉移.
3>循環控制指令(短轉移)
LOOP CX不爲零時循環.
LOOPE/LOOPZ CX不爲零且標誌Z=1時循環.
LOOPNE/LOOPNZ CX不爲零且標誌Z=0時循環.
JCXZ CX爲零時轉移.
JECXZ ECX爲零時轉移.
4>中斷指令
INT 中斷指令
INTO 溢出中斷
IRET 中斷返回
5>處理器控制指令
HLT 處理器暫停, 直到出現中斷或復位信號才繼續.
WAIT 當芯片引線TEST爲高電平時使CPU進入等待狀態.
ESC 轉換到外處理器.
LOCK 封鎖總線.
NOP 空操做.
STC 置進位標誌位.
CLC 清進位標誌位.
CMC 進位標誌取反.
STD 置方向標誌位.
CLD 清方向標誌位.
STI 置中斷容許位.
CLI 清中斷容許位.

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

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

代碼託管

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

上週考試錯題總結

  • main.c 調用了靜態庫libmath.a中的函數,編譯main.c的命令是()
    A .
    gcc -static main.c ./libmath.a -o main
    B .
    gcc -static main.c -L. -lmath -o main
    C .
    gcc -static main.c -L. -llibmath.a -o main
    D .
    gcc -static main.o ./libmath.a -o main

正確答案: A B 你的答案: C

  • 針對以上代碼:gcc -c *.c 能夠獲得m.o,swap.o兩個模塊,相對於m.o, buf是()
    A .
    外部符號
    B .
    全局符號
    C .
    局部符號
    D .
    以上都不對

正確答案: B 你的答案: A

  • 針對以上代碼:gcc -c *.c 能夠獲得m.o,swap.o兩個模塊,哪些符號會出如今swap.o模塊的.symtab條目中()

A .
buf
B .
temp
C .
swap
D .
buffp0

正確答案: A C D 你的答案: C D

  • 上圖是典型的ELF的可重定位目標文件的格式,對於代碼:
    int a[100] ={0};
    int b[100];

int main()
{
int i=0;
for(i=0; i<100; i++)
b[i] = i;
printf("the b[3]= %d\n", b[3]);
return 1;

}
其中b[100]存放在()節
A .
.text
B .
.data
C .
.bss
D .
.rodata

正確答案: C 你的答案: B

  • 編譯驅動程序gcc -c 會調用()
    A .
    預處理器
    B .
    編譯器
    C .
    彙編器
    D .
    連接器

正確答案: C 你的答案: B

  • dll,so文件的連接是運行在()
    A .
    編譯時
    B .
    加載時
    C .
    運行時
    D .
    連接時

正確答案: C 你的答案: B

結對及互評

點評模板:

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

本週結對學習狀況

- [20155219](http://www.cnblogs.com/paypay/)
- 結對照片

- 結對學習內容
    - XXXX
    - XXXX
    - ...

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

xxx
xxx

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 3/3
第二週 32/32 1/2 4/7
第三週 109/141 1/3 8/15
第四周 58/199 1/4 8/15

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

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法

  • 計劃學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進狀況:

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

參考資料

相關文章
相關標籤/搜索