計算機系統(tǒng)-從應用程序到底層實現(xiàn) 課件 第9講-程序的機器級表示:基本_第1頁
計算機系統(tǒng)-從應用程序到底層實現(xiàn) 課件 第9講-程序的機器級表示:基本_第2頁
計算機系統(tǒng)-從應用程序到底層實現(xiàn) 課件 第9講-程序的機器級表示:基本_第3頁
計算機系統(tǒng)-從應用程序到底層實現(xiàn) 課件 第9講-程序的機器級表示:基本_第4頁
計算機系統(tǒng)-從應用程序到底層實現(xiàn) 課件 第9講-程序的機器級表示:基本_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《計算機系統(tǒng)》程序的機器級表示《計算機系統(tǒng)》課程教學組2025年春季學期從C代碼到機器代碼數(shù)據(jù)傳送與尋址方式算術(shù)操作010203內(nèi)容提要程序執(zhí)行CPUPC:程序計數(shù)器下一條指令的地址記為“EIP”(IA32)or“RIP”(x86-64)寄存器文件一組寄存器Conditioncodes條件碼是CPU根據(jù)運算結(jié)果由硬件設置的位,體現(xiàn)當前指令執(zhí)行結(jié)果的各種狀態(tài)信息是程序分支和程序循環(huán)的依據(jù)內(nèi)存代碼數(shù)據(jù)棧地址數(shù)據(jù)指令CPUPC寄存器文件條件碼Conditioncodes條件碼是CPU根據(jù)運算結(jié)果由硬件設置的位,體現(xiàn)當前指令執(zhí)行結(jié)果的各種狀態(tài)信息是程序分支和程序循環(huán)的依據(jù)內(nèi)存字節(jié)數(shù)組代碼與用戶數(shù)據(jù)支持過程的棧從C到目標代碼texttextbinarybinaryCompiler(gcc-S)Assembler(gccoras)Linker(gccorld)Cprogram(p1.cp2.c)Asmprogram(p1.sp2.s)Objectprogram(p1.op2.o)Executableprogram(p)Staticlibraries(.a)兩個源代碼文件p1.c

和p2.c,通過編譯指令

gcc–O1p1.cp2.c-op進行編譯,使用最基本的代碼優(yōu)化(-O1),二進制代碼文件p。編譯系統(tǒng)編譯系統(tǒng)將高級語言變成機器指令不僅僅是翻譯,還有語法檢查、優(yōu)化、鏈接等等編譯系統(tǒng)的重要性不亞于操作系統(tǒng)中國獨立自主的高性能編譯系統(tǒng)神威“太湖之光”超級計算機申威64指令集、神威睿智編譯器極其工具鏈、神威睿思操作系統(tǒng)……中國超算憑借獨立成果多次占據(jù)世界超算榜首。中國獨立自主的桌面操作系統(tǒng)

廖湘科院士

陳左寧院士

倪光南院士匯編代碼CCodeintsum(intx,inty){intt=x+y;returnt;}GeneratedIA32Assemblysum: pushl%ebp movl%esp,%ebp movl12(%ebp),%eax addl8(%ebp),%eax popl%ebp ret某些編譯器使用指令“l(fā)eave”來打包出棧指令機器代碼CCode兩個有符號整數(shù)相加匯編將兩個4字節(jié)整數(shù)相加有符號或無符號都是同一指令操作數(shù):y:

寄存器

%eaxx:

內(nèi)存

M[%ebp+8]t:

寄存器

%eax返回值保存在

%eax目標代碼3-字節(jié)指令保存在地址

0x80483caintt=x+y;Addl8(%ebp),%eax0x80483ca:034508相似表達式:

x+=y更精確的表達:inteax;int*ebp;eax+=ebp[8]目標代碼Codeforsum0x401040<sum>:0x550x890xe50x8b0x450x0c0x030x450x080x5d0xc3匯編器將.s文件轉(zhuǎn)成.o文件每條指令都編碼不同文件之間的聯(lián)系沒有體現(xiàn)鏈接解決文件之間的引用關系與靜態(tài)鏈接庫整合e.g.,codeformalloc,printf有些庫是動態(tài)鏈接的(

dynamicallylinked)當程序開始執(zhí)行時才鏈接一共有11個字節(jié)每條指令占1,2,or3個字節(jié)起始地址在0x0401040使用命令:gcc–O1-ccode.c–ocode.o得到文件:code.o目標代碼code.o起始地址是動態(tài)分配的反匯編0x401040<sum>:0x401040:55push%ebp0x401041:89e5mov%esp,%ebp0x401043:8b450cmov0xc(%ebp),%eax0x401046:034508add0x8(%ebp),%eax0x401049:5dpop%ebp0x40104a:c3ret反匯編器(Disassembler):將目標代碼編譯回匯編代碼objdump–dcode.o分析目標代碼時的有效工具反匯編另一種反匯編方式0x401040:0x550x890xe50x8b0x450x0c0x030x450x080x5d0xc3目標代碼使用GDBgdbpdisassemblesumx/11xbsum查看從sum函數(shù)地址開始的11個字節(jié)Dumpofassemblercodeforfunctionsum:0x080483c4<sum+0>:push%ebp0x080483c5<sum+1>:mov%esp,%ebp0x080483c7<sum+3>:mov0xc(%ebp),%eax0x080483ca<sum+6>:add0x8(%ebp),%eax0x080483cd<sum+9>:pop%ebp0x080483ce<sum+10>:rettest.s與反匯編代碼gcc-Etest.c-otest.igcc-Stest.i-otest.s

orgcc–Stest.c–otest.s

add:pushl %ebpmovl %esp,%ebpsubl $16,%espmovl 12(%ebp),%eaxmovl 8(%ebp),%edxleal (%edx,%eax),%eaxmovl %eax,-4(%ebp)movl -4(%ebp),%eaxleaverettest.s00000000<add>:0:55 push%ebp1:89e5 mov%esp,%ebp3:83ec10sub$0x10,%esp6:8b450cmov0xc(%ebp),%eax9:8b5508mov0x8(%ebp),%edxc:8d0402lea(%edx,%eax,1),%eaxf:8945fcmov%eax,-0x4(%ebp)12:8b45fcmov-0x4(%ebp),%eax15:c9leave16:c3ret位移量機器指令匯編指令反匯編目標代碼的結(jié)果兩種目標文件反匯編對比objdump–dtest.o反匯編test.o文件內(nèi)存地址機器指令匯編指令objdump–dtest反匯編可執(zhí)行目標文件“test”00000000<add>:0:55push%ebp1:89e5mov%esp,%ebp3:83ec10sub$0x10,%esp6:8b450cmov0xc(%ebp),%eax9:8b5508mov0x8(%ebp),%edxc:8d0402lea(%edx,%eax,1),%eaxf:8945fcmov%eax,-0x4(%ebp)12:8b45fcmov-0x4(%ebp),%eax15:c9leave16:c3ret080483d4<add>:80483d4:55push...80483d5:89e5…80483d7:83ec10…80483da:8b450c…80483dd:8b5508…80483e0:8d0402…80483e3:8945fc…80483e6:8b45fc…80483e9:c9…80483ea:c3ret課堂思考從目標文件到可執(zhí)行目標文件,主要的變化有哪些??從C代碼到機器代碼數(shù)據(jù)傳送與尋址方式算術(shù)操作010203內(nèi)容提要基本數(shù)據(jù)類型“整數(shù)”1,2,4,8bytes數(shù)據(jù)值地址(untypedpointers)—認真學習課程中心關于指針的講課視頻!浮點數(shù)4,8,or10bytes單精度(float:4bytes)雙精度(double:8bytes)長雙精度(longdoubleorextended:10bytes)數(shù)組與結(jié)構(gòu)內(nèi)存中一組連續(xù)分配的字節(jié)基本操作對寄存器或內(nèi)存數(shù)據(jù)進行操作的運算類指令在內(nèi)存與寄存器中之間傳送數(shù)據(jù)的傳送類指令將數(shù)據(jù)從內(nèi)存加載到寄存器中將寄存器數(shù)據(jù)保存到內(nèi)存中決定程序走向的控制類指令無條件/有條件跳轉(zhuǎn)分支/循環(huán)IA32寄存器%eax%ecx%edx%ebx%esi%edi%esp%ebp%ax%cx%dx%bx%si%di%sp%bp%ah%ch%dh%bh%al%cl%dl%bl16-bit虛擬寄存器(為了向下兼容)通用寄存器accumulatecounterdatabasesourceindexdestinationindexstackpointerbasepointerOrigin(mostlyobsolete)傳送數(shù)據(jù)IA32MOV指令movlSource,Dest:操作數(shù)類型Immediate:立即數(shù)

例:$0x400,$-533占用1,2,or4字節(jié)Register:8個整數(shù)寄存器之一例:%eax,%edx

%esp與%ebp保留作為特殊用途其他通用寄存器可能會在某些操作時有特定用途Memory:

內(nèi)存地址簡單例子:(%eax)有非常多的尋址模式%eax%ecx%edx%ebx%esi%edi%esp%ebp操作數(shù)組合沒有內(nèi)存到內(nèi)存的數(shù)據(jù)傳送指令movlImmRegMemRegMemRegMemRegSourceDestCAnalogmovl$0x4,%eaxtemp=0x4;movl$-147,(%eax)*p=-147;movl%eax,%edxtemp2=temp1;movl%eax,(%edx)*p=temp;movl(%eax),%edxtemp=*p;Src,Destpush與pop數(shù)據(jù)為int匯編格式區(qū)別:(1)Intel格式的指令助記符省略了指示數(shù)據(jù)大小的后綴;(2)Intel格式省略了寄存器名字前的%;(3)Intel格式指令中,源操作數(shù)在右邊,目的操作數(shù)在左邊。(與ATT正好相反)ATT格式 Intel格式movl(%ecx),%eax moveax,[ecx]movl(%ecx),%eaxmovl8(%ebp),%edx寄存器間接尋址(R) Mem[Reg[R]]寄存器R中存放了內(nèi)存地址基址變址尋址D(R)Mem[Reg[R]+D]寄存器R中存放了內(nèi)存的起始地址常數(shù)D給出了偏移量內(nèi)存尋址內(nèi)存尋址

Imm:常數(shù)1,2,or4bytes(偏移量)Eb

:基址寄存器Ei

:變址寄存器(不要用

%esp)S

:比例因子1,2,4,or8(whythesenumbers?)內(nèi)存尋址%edx0xf000%ecx0x0100ExpressionAddressComputationAddress0x8(%edx)0xf000+0x80xf008(%edx,%ecx)0xf000+0x1000xf100(%edx,%ecx,4)0xf000+4*0x1000xf4000x80(,%edx,2)2*0xf000+0x800x1e080地址計算舉例格式:lealSrc,DestSrc:地址計算表達式Src的結(jié)果保存在Dest中用途:計算內(nèi)存地址值本身(不取內(nèi)存里的值)e.g.,translationofp=&x[i];計算諸如x+k*y表達式的值k=1,2,4,or8舉例lea尋址LEAintmul12(intx){returnx*12;}leal(%eax,%eax,2),%eax;t<-x+x*2sall$2,%eax;returnt<<2課堂習題1參看下圖的寄存器信息和存儲器信息,若操作數(shù)為0xF4(,%edx,4),則該尋址方式獲得的值為:0XAB0X130XFF表中無正確值從C代碼到機器代碼數(shù)據(jù)傳送與尋址方式算術(shù)操作010203內(nèi)容提要算術(shù)操作指令雙操作數(shù)指令:

格式

計算addl

Src,Dest Dest=Dest+Srcsubl

Src,Dest Dest=Dest-Srcimull

Src,Dest Dest=Dest*Srcsall

Src,Dest Dest=Dest<<Src(Arithmetic)shll

Src,Dest Dest=Dest<<Src(Logical)sarl

Src,Dest Dest=Dest>>Src(Arithmetic)shrl

Src,Dest Dest=Dest>>Src(Logical)xorl

Src,Dest Dest=Dest^Srcandl

Src,Dest Dest=Dest&Srcorl

Src,Dest Dest=Dest|Src

注意操作數(shù)的順序!算術(shù)操作指令單操作數(shù)指令:

格式

計算inclDest

Dest=Dest+1declDest

Dest=Dest-1neglDest

Dest=-Dest (取補=各位取反后+1)notlDest

Dest=~Dest (取反=各位取反)

算術(shù)指令示例intarith(intx,inty,intz){intt1=x+y;intt2=z+t1;intt3=x+4;intt4=y*48;intt5=t3+t4;intrval=t2*t5;returnrval;}arith:pushl %ebpmovl %esp,%ebpmovl 8(%ebp),%ecxmovl 12(%ebp),%edxleal (%edx,%edx,2),%eaxsall $4,%eaxleal 4(%ecx,%eax),%eaxaddl %ecx,%edxaddl 16(%ebp),%edximull %edx,%eaxpopl %ebpretSetUpBodyFinish算術(shù)運算intarith(intx,inty,intz){intt1=x+y;intt2=z+t1;

溫馨提示

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

評論

0/150

提交評論