標籤:
第三章,程式的機器級表示
電腦執行機器代碼。在本章中,我們會近距離地觀察機器代碼,以及人類可讀的表示——彙編代碼。
Intel處理器系列俗稱x86。8086、80286、i386、i486、Pentium、PentiumPro、PentiumⅡ、PentiumⅢ、Pentium4、Pentium4E、Core2、Core i7。
摩爾定律:晶體管數量每26個月就會翻一番。
Linux使用平坦式定址方式,使程式員將整個儲存空間看做一個大的位元組數組。
3.2程式編碼
3.21機器及代碼
兩個抽象:①機器級程式的格式和行為,定義為指令集體繫結構(ISA),它定義了處理器狀態、指令格式、以及每條指令對狀態的影響。
②機器級程式使用的儲存空間地址是虛擬位址,提供的儲存空間模型看上去是一個非常大的位元組數組。
3.22程式碼範例
假設寫一個C語言代碼檔案code.c,在命令列上使用“-s”選項,就能得到C語言編譯器產生的彙編代碼,會使gcc運行編譯器,產生一個彙編檔案code.s,但是不做進一步工作。
3.3資料格式
char 位元組 b 1
short 字 w 2
int 雙字 l 4
long int 雙字 l 4
long long int — — 4
char * 雙字 l 4
float 單精確度 s 4
double 雙精確度 l 8
long double 擴充精度 t 10/12
3.4訪問資訊
一個IA32中央處理器單元包括一組8個儲存32位的寄存器。這些寄存器用來儲存整數資料和指標。
3.41運算元指示符
大多數指令有一個或多個運算元,指示出一個操作中要引用的來源資料值,以及放置結果的目標位置。
三種類型:①立即數,也就是常數值。
②寄存器,它表示某個寄存器的內容。
③儲存空間引用,它會根據有效地址訪問某個儲存空間的位置
有多種不同的定址模式
這種引用的四個組成部分:①立即數位移Imm
②基底位址暫存器Eb
③變址寄存器Ei
④比例因素s(這裡s必須是1、2、4、8)
3.42資料傳送指令
MOV、MOVS、MOVZ
MOV
MOV reg/mem, imm ;立即數?寄存器或儲存空間
MOV reg/mem/seg, reg ;寄存器的值?寄存器/記憶體/段寄存器
MOV reg/seg, mem ;記憶體單元的值?寄存器/段寄存器
MOV reg/mem, seg ;段寄存器的值?寄存器/記憶體單元
IA32的限制:兩個運算元都不能指向儲存空間。
MOVZ中pushl將雙字壓棧和popl將雙字出棧。
棧是一個資料結構,可以添加或者刪除值,需要遵循“後進先出”的規則。通過操作把資料壓進棧中,通過pop操作刪除資料。
總是從一端插入或刪除元素,這一端稱為棧頂。
*將一個雙字值壓入棧中,首先要將棧指標減4,然後將值寫到新的棧頂地址。
3.6控制
3.61條件碼
CF:進位標誌
ZF:零標誌
SF:符號標誌
OF:溢出標誌
資料傳送指令
MOV 不影響標誌位
PUSH POP 不影響標誌位
XCHG 交換指令 不影響標誌位
XLAT 換碼指令 不影響標誌位
LEA 有效地址送寄存器指令 不影響標誌位
PUSHF 標誌進棧指令 不影響標誌位
POPF 標誌出棧指令 標誌位由裝入值決定
3.62訪問條件碼
setl:小於時設定
setb:低於時設定
movzbl:清零%eax的三個高位位元組
3.7 過程1.棧幀
為單個過程分配的那部分棧稱為棧幀,通用結構見149頁
所以本質上棧幀還是棧。
2.兩個指標
最頂端的棧幀以兩個指標界定:
寄存器%ebp-幀指標寄存器%esp-棧指標
棧指標可移動,所以資訊訪問多相對於幀指標。
3.調用的過程
課本150頁過程P調用過程Q的樣本。
調用者的幀應該在被調用者的下面,並且調用者返回地址是它的棧幀末尾,這樣可以保證被調用者執行完畢全都出棧後,程式能夠繼續向下執行。
關於被調用者Q用棧的幾個用處:
1.儲存不能存放在寄存器中的局部變數。
當要對一個局部變數使用地址操作符&的時候,就必須要為它產生一個地址,所以要入棧。這個用法!以前沒見過!
2.存放它調用的其他過程的參數。
Q會用棧幀來存放它調用的其他過程的參數。第一個參數放在相對於%ebp位移量為8的位置處。剩下的參數儲存在後續的4位元組塊中,所以參數i就在相對於%ebp的位移量為4+4i的地方。 call指令有一個目標,即指明被調用過程起始的指令地址。(可以直接也可以間接)call指令效果是將返回地址入棧,並跳轉到被調用過程的起始處。ret命令從棧中彈出地址,並跳轉到這個位置。正確的使用這條命令,要使棧做好準備,棧指標要指向前面call指令儲存返回地址的位置。寄存器%eax可以用來傳回值。 程式寄存器是唯一能被所有過程共用的資源。根據慣例,寄存器%eax,%edx,和%ecx被劃分為調用者儲存寄存器,寄存器%edx,%esi,和%edi被劃分為被調用者儲存寄存器。 GCC堅持一個X86編程指導方針,也就是一個函數使用的所有棧空間必須是16字的整數倍。採用這個原則是為了保證訪問資料的嚴格對齊。、棧規則提供了一種機制,每次函數調用都有它自己私人的狀態資訊(儲存的返回位置,棧指標和被調用者儲存寄存器的值)儲存。有需要的話還可以提供局部變數的儲存。 參考資料---閆佳歆,萬子惠
資訊安全系統設計基礎第四周學習總結