王道17年考研群ics課件-ch3prog_第1頁
王道17年考研群ics課件-ch3prog_第2頁
王道17年考研群ics課件-ch3prog_第3頁
王道17年考研群ics課件-ch3prog_第4頁
王道17年考研群ics課件-ch3prog_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第三章 程序的轉換與機器級表示程序轉換概述IA-32 /x86-64指令系統(tǒng)C語言程序的機器級表示復雜數(shù)據(jù)類型的分配和訪問越界訪問和緩沖區(qū)溢出、x86-64架構程序的轉換與機器級表示主要教學目標了解高級語言與匯編語言、匯編語言與機器語言之間的關系掌握有關指令格式、操作數(shù)類型、尋址方式、操作類型等內(nèi)容了解高級語言源程序中的語句與機器級代碼之間的對應關系了解復雜數(shù)據(jù)類型(數(shù)組、結構等)的機器級實現(xiàn)主要教學內(nèi)容介紹C語言程序與IA-32機器級指令之間的對應關系。主要包括:程序轉換概述、IA-32指令系統(tǒng)、C語言中控制語句和過程調(diào)用等機器級實現(xiàn)、復雜數(shù)據(jù)類型(數(shù)組、結構等)的機器級實現(xiàn)等。本章所用的機

2、器級表示主要以匯編語言形式表示為主。采用逆向工程方法!程序的機器級表示分以下五個部分介紹第一講:程序轉換概述機器指令和匯編指令機器級程序員感覺到的屬性和功能特性高級語言程序轉換為機器代碼的過程第二講:IA-32 /x86-64指令系統(tǒng)第三講: C語言程序的機器級表示 過程調(diào)用的機器級表示選擇語句的機器級表示循環(huán)結構的機器級表示 第四講:復雜數(shù)據(jù)類型的分配和訪問 數(shù)組的分配和訪問 結構體數(shù)據(jù)的分配和訪問 聯(lián)合體數(shù)據(jù)的分配和訪問 數(shù)據(jù)的對齊 第五講:越界訪問和緩沖區(qū)溢出 從高級語言程序出發(fā),用其對應的機器級代碼以及內(nèi)存(棧)中信息的變化來說明底層實現(xiàn)圍繞C語言中的語句和復雜數(shù)據(jù)類型,解釋其在底層機

3、器級的實現(xiàn)方法數(shù)組的分配和訪問數(shù)組元素在內(nèi)存的存放和訪問 例如,定義一個具有4個元素的靜態(tài)存儲型 short 數(shù)據(jù)類型數(shù)組A,可以寫成“static short A4;” 第 i(0i3)個元素的地址計算公式為&A0+2*i。假定數(shù)組A的首地址存放在EDX中,i 存放在ECX中,現(xiàn)要將Ai取到AX中,則所用的匯編指令是什么? movw (%edx, %ecx, 2), %ax 其中,ECX為變址(索引)寄存器,在循環(huán)體中增量比例因子是2!數(shù)組的分配和訪問填寫下表數(shù)組的分配和訪問填寫下表數(shù)組元素在內(nèi)存的存放和訪問分配在靜態(tài)區(qū)的數(shù)組的初始化和訪問buf是在靜態(tài)區(qū)分配的數(shù)組,鏈接后,buf在可執(zhí)行目

4、標文件的數(shù)據(jù)段中分配了空間08048908 :08048908: 0A 00 00 00 14 00 00 00 假定 i 被分配在ECX中,sum被分配在EAX中,則“sum+=bufi;”和 i+ 可用什么指令實現(xiàn)?addl buf( , %ecx, 4), %eax 或 addl 0(%edx , %ecx, 4), %eax addl &1,%ecx此時,buf=&buf0=0 x08048908編譯器通常將其先存放到寄存器(如EDX)中int buf2 = 10, 20;int main ( ) int i, sum=0; for (i=0; i2; i+) sum+=bufi; r

5、eturn sum;數(shù)組元素在內(nèi)存的存放和訪問auto型數(shù)組的初始化和訪問分配在棧中,故數(shù)組首址通過EBP來定位 movl $10, -8(%ebp) /buf0的地址為Rebp-8,將10賦給buf0movl $20, -4(%ebp) /buf1的地址為Rebp-4,將20賦給buf1leal -8(%ebp), %edx /buf0的地址為Rebp-8,將buf首址送EDX對buf進行初始化的指令是什么?若buf首址在EDX中,則獲得buf首址的對應指令是什么?int adder ( ) int buf2 = 10, 20;int i, sum=0;for (i=0; i2; i+) s

6、um+=bufi;return sum;-4-8addl (%edx, %ecx, 4), %eax EDX、ECX各是什么?數(shù)組元素在內(nèi)存的存放和訪問數(shù)組與指針 在指針變量目標數(shù)據(jù)類型與數(shù)組類型相同的前提下,指針變量可以指向數(shù)組或數(shù)組中任意元素以下兩個程序段功能完全相同,都是使ptr指向數(shù)組a的第0個元素a0。a的值就是其首地址,即a=&a0,因而a=ptr,從而有&ai=ptr+i=a+i以及ai=ptri=*(ptr+i)=*(a+i)。 (1)int a10; int *ptr=&a0;(2) int a10, *ptr; ptr=&a0;小端方式下a0=?,a1=?a0=0 x674

7、52301, a1=0 x0efcdab數(shù)組首址0 x8048A00在ptr中,ptr+i 并不是用0 x8048A00加 i 得到,而是等于0 x8048A00+4*i 數(shù)組元素在內(nèi)存的存放和訪問數(shù)組與指針2、3、6和7對應匯編指令都需訪存,指令中源操作數(shù)的尋址方式分別是“基址”、“基址加比例變址”、“基址加比例變址”和“基址加比例變址加位移”的方式,因為數(shù)組元素的類型為int型,故比例因子為4。問題: 假定數(shù)組A的首址SA在ECX中,i在EDX中,表達式結果在EAX中,各表達式的計算方式以及匯編代碼各是什么?數(shù)組元素在內(nèi)存的存放和訪問數(shù)組與指針2、3、6和7對應匯編指令都需訪存,指令中源操

8、作數(shù)的尋址方式分別是“基址”、“基址加比例變址”、“基址加比例變址”和“基址加比例變址加位移”的方式,因為數(shù)組元素的類型為int型,故比例因子為4 。假設A首址SA在ECX,i 在EDX,結果在EAX數(shù)組元素在內(nèi)存的存放和訪問指針數(shù)組和多維數(shù)組由若干指向同類目標的指針變量組成的數(shù)組稱為指針數(shù)組。 其定義的一般形式如下: 存儲類型 數(shù)據(jù)類型 *指針數(shù)組名元素個數(shù);例如,“int *a10;”定義了一個指針數(shù)組a,它有10個元素,每個元素都是一個指向int型數(shù)據(jù)的指針。一個指針數(shù)組可以實現(xiàn)一個二維數(shù)組。a0a1a9數(shù)組元素在內(nèi)存的存放和訪問指針數(shù)組和多維數(shù)組計算一個兩行四列整數(shù)矩陣中每一行數(shù)據(jù)的和

9、。 main ( ) static short num 4= 2, 9, -1, 5, 3, 8, 2, -6; static short *pn =num0, num1; static short s2=0, 0; int i, j; for (i=0; i2; i+) for (j=0; j4; j+) si+=*pni+; printf (sum of line %d:%dn”, i+1, si); 08049300 :08049300: 02 00 09 00 ff ff 05 00 03 00 08 00 02 00 fa ff08049310 :08049310: 00 93 04

10、 08 08 93 04 0808049318: 08049318: 00 00 00 00num=num0=&num00=0 x8049300 pn=&pn0=0 x8049310pn0=num0=0 x8048300pn1=num1=0 x8048308 當i=1時,pni=*(pn+i)=Mpn+4*i=0 x8049308 若num=0 x8049300,則num、pn和s在存儲區(qū)中如何存放? 若處理“si+=*pni+;”時 i 在ECX,si在AX,pni在EDX,則對應指令序列可以是什么? movl pn(,%ecx,4), %edx addw (%edx), %ax addl

11、$2, pn(, %ecx, 4)pni+”1”pni 按行優(yōu)先方式存放數(shù)組元素入口參數(shù)的位置每個過程開始兩條指令總是pushl %ebpmovl %esp, %ebp在IA-32中,若棧中存放的參數(shù)的類型是char、unsigned char或short、unsigned short,也都分配4個字節(jié)。因而,在被調(diào)用函數(shù)的執(zhí)行過程中,可以使用Rebp+8、Rebp+12、Rebp+16、 作為有效地址來訪問函數(shù)的入口參數(shù)。 返回地址EBP在main中的值EBPEBP+8EBP+12入口參數(shù)1入口參數(shù)2入口參數(shù)3EBP+16movl . 準備入口參數(shù)call .結構體數(shù)據(jù)的分配和訪問 結構體成

12、員在內(nèi)存的存放和訪問 分配在棧中的auto結構型變量的首地址由EBP或ESP來定位分配在靜態(tài)區(qū)的結構型變量首地址是一個確定的靜態(tài)區(qū)地址結構型變量 x 各成員首址可用“基址加偏移量”的尋址方式 struct cont_info x=“0000000”, “ZhangS”, 210022, “273 long street, High Building #3015”, “12345678”;若變量x分配在地址0 x8049200開始的區(qū)域,那么x=&(x.id)=0 x8049200(若x在EDX中)&()= 0 x8049200+8=0 x8049208&(x.post)= 0 x8

13、049200+8+12=0 x8049214&(x.address)=0 x8049200+8+12+4=0 x8049218&(x.phone)=0 x8049200+8+12+4+100=0 x804927Cx初始化后,在地址0 x8049208到0 x804920D處是字符串“ZhangS”, 0 x804920E處是字符0,從0 x804920F到0 x8049213處都是空字符。 “unsigned xpost=x.post;”對應匯編指令為“movl 20(%edx), %eax” struct cont_info char id8; char name 12; unsigned

14、post; char address100; char phone20; ;結構體數(shù)據(jù)的分配和訪問結構體數(shù)據(jù)作為入口參數(shù)當結構體變量需要作為一個函數(shù)的形參時,形參和調(diào)用函數(shù)中的實參應具有相同結構有按值傳遞和按地址傳遞兩種方式若采用按值傳遞,則結構成員都要復制到棧中參數(shù)區(qū),這既增加時間開銷又增加空間開銷通常應按地址傳遞,即:在執(zhí)行CALL指令前,僅需傳遞指向結構體的指針而不需復制每個成員到棧中 void stu_phone1 ( struct cont_info *s_info_ptr) printf (“%s phone number: %s”, (*s_info_ptr).name, (*s

15、_info_ptr).phone);void stu_phone2 ( struct cont_info s_info) printf (“%s phone number: %s”, s_, s_info.phone);按地址調(diào)用按值調(diào)用 結構體數(shù)據(jù)的分配和訪問結構體數(shù)據(jù)作為入口參數(shù)(若對應實參是x)靜態(tài)數(shù)據(jù)區(qū)的結構變量x按地址傳遞按值傳遞struct cont_info char id8; char name 12; unsigned post; char address100; char phone20; ;結構體數(shù)據(jù)的分配和訪問按地址傳遞參數(shù) (*stu_info).n

16、ame可寫成stu_info-name,執(zhí)行以下兩條指令后: movl 8(%ebp), %edx leal 8(%edx), %eax EAX中存放的是字符串“ZhangS”在靜態(tài)存儲區(qū)內(nèi)的首地址0 x8049208指令執(zhí)行過程 控制器 ALU標志寄存器 地址數(shù)據(jù)控制bfff002080483d680483d580483d40 movl 8(%ebp), %edx leal 8(%edx), %eax5589e5 EBPESPEIPbfff0020bfff000055MDRS1:取指令IRS2:指令譯碼S3:指令執(zhí)行、改EIPbfff0000MAR功能: Redx MRebp+808ff00

17、bfff0028f001708fff00020111ffff54指令執(zhí)行過程 控制器 ALU標志寄存器 地址數(shù)據(jù)控制bfff002080483d680483d580483d40 movl 8(%ebp), %edx leal 8(%edx), %eax5589e5 EBPESPEIPbfff0020bfff000055MDRS1:取指令IRS2:指令譯碼S3:指令執(zhí)行、改EIPbfff0000MAR功能: Reax Redx+808ff00bfff0028f001708fff000208fff00854結構體數(shù)據(jù)的分配和訪問按值傳遞參數(shù) x所有成員值作為實參存到參數(shù)區(qū)。 stu_info.na

18、me送EAX的指令序列為: leal 8(%ebp), %edx leal 8(%edx), %eax EAX中存放的是“ZhangS”的棧內(nèi)參數(shù)區(qū)首址 。stu_phone1和stu_phone2功能相同,但兩者的時、空開銷都不一樣。后者開銷大,因為它需對結構體成員整體從靜態(tài)區(qū)復制到棧中,需要很多條mov或其他指令,從而執(zhí)行時間更長,并占更多??臻g和代碼空間聯(lián)合體數(shù)據(jù)的分配和訪問聯(lián)合體各成員共享存儲空間,按最大長度成員所需空間大小為目標union uarea char c_data; short s_data; int i_data; long l_data; ;IA-32中編譯時,long

19、和int長度一樣,故uarea所占空間為4個字節(jié)。而對于與uarea有相同成員的結構型變量來說,其占用空間大小至少有11個字節(jié),對齊的話則占用更多。通常用于特殊場合,如,當事先知道某種數(shù)據(jù)結構中的不同字段的使用時間是互斥的,就可將這些字段聲明為聯(lián)合,以減少空間。但有時會得不償失,可能只會減少少量空間卻大大增加處理復雜性。聯(lián)合體數(shù)據(jù)的分配和訪問unsigned float2unsign( float f) union float f; unsigned u; tmp_union; tmp_union.f=f; return tmp_union.u;還可實現(xiàn)對相同位序列進行不同數(shù)據(jù)類型的解釋 函數(shù)

20、形參是float型,按值傳遞參數(shù),因而傳遞過來的實參是float型數(shù)據(jù),賦值給非靜態(tài)局部變量(聯(lián)合體變量成員)過程體為:movl 8(%ebp), %eaxmovl %eax, -4(%ebp) movl -4(%ebp) , %eax將存放在地址Rebp+8處的入口參數(shù) f 送到EAX(返回值)從該例可看出:機器級代碼并不區(qū)分所處理對象的數(shù)據(jù)類型,不管高級語言中將其說明成float型還是int型或unsigned型,都把它當成一個0/1序列來處理??蓛?yōu)化掉!typedef structunion struct uint32_t eax;uint32_t ecx;uint32_t edx;ui

21、nt32_t ebx;uint32_t esp;uint32_t ebp;uint32_t esi;uint32_t edi; unionuint32_t _32;uint16_t _16;uint8_t _82; gpr8;swaddr_t eip; CPU_state;extern CPU_state cpu;enum R_EAX, R_ECX, R_EDX, R_EBX, R_ESP, R_EBP, R_ESI, R_EDI ;enum R_AX, R_CX, R_DX, R_BX, R_SP, R_BP, R_SI, R_DI ;enum R_AL, R_CL, R_DL, R_BL, R_AH, R_CH, R_DH, R_BH ;#define reg_l(index) (cpu.gprindex._32)#define reg_w(index) (cpu.gprindex._16)#define reg_b(index) (cpu.gprindex & 0 x3._8index 2)PA中模擬的IA-32的寄存器組織聯(lián)合體數(shù)據(jù)的分配和訪問利用嵌套可定義鏈表結構 union node struct int *ptr; int da

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論