




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第八章程序的加載和執行
可執行文件的加載
進程的上下文切換
程序的執行與CPU基本組成
程序的執行機制主要教學目標理解程序和進程概念的不同了解Linux中如何表示進程的存儲器映射了解程序的加載過程了解進程的上下文信息及其上下文切換了解程序和指令的執行過程了解內部異常和外部中斷的基本概念了解CPU的主要功能和基本組成程序的執行機制分以下兩個部分介紹第一講:進程和可執行文件的加載程序和進程的概念進程的存儲器映射程序的加載過程進程的邏輯控制流進程的上下文切換第三講:程序的執行與CPU基本組成程序及指令的執行過程內部異常和外部中斷的基本概念CPU的基本功能和基本組成“程序”和“進程”進程是OS對CPU執行的程序的運行過程的一種抽象。進程有自己的生命周期,它由于任務的啟動而創建,隨著任務的完成(或終止)而消亡,它所占用的資源也隨著進程的終止而釋放。一個可執行目標文件(即程序)可被加載執行多次,也即,一個程序可能對應多個不同的進程。例如,用word程序編輯一個文檔時,相應的用戶進程就是winword.exe,如果多次啟動同一個word程序,就得到多個winword.exe進程,處理不同的數據。程序(program)指按某種方式組合形成的代碼和數據集合,代碼即是機器指令序列,因而程序是一種靜態概念。進程(process)指程序的一次運行過程。更確切說,進程是具有獨立功能的一個程序關于某個數據集合的一次運行活動,因而進程具有動態含義。同一個程序處理不同的數據就是不同的進程進程的概念操作系統(管理任務)以外的都屬于“用戶”的任務。計算機處理的所有“用戶”的任務由進程完成。為強調進程完成的是用戶的任務,通常將進程稱為用戶進程。計算機系統中的任務通常就是指進程。例如,Linux內核中通常把進程稱為任務,每個進程主要通過一個稱為進程描述符(processdescriptor)的結構來描述,其結構類型定義為task_struct,包含了一個進程的所有信息。所有進程通過一個雙向循環鏈表實現的任務列表(tasklist)來描述,任務列表中每個元素是一個進程描述符。IA-32中的任務狀態段(TSS)、任務門(taskgate)等概念中所稱的任務,實際上也是指進程。
引入“進程”的好處“進程”的引入為應用程序提供了以下兩方面的抽象:一個獨立的邏輯控制流每個進程擁有一個獨立的邏輯控制流,使得程序員以為自己的程序在執行過程中獨占使用處理器一個私有的虛擬地址空間每個進程擁有一個私有的虛擬地址空間,使得程序員以為自己的程序在執行過程中獨占使用存儲器進程”的引入簡化了程序員的編程以及語言處理系統的處理,即簡化了編程、編譯、鏈接、共享和加載等整個過程。IA-32/x86-64+Linux平臺下,每個進程具有獨立的私有地址空間(虛擬地址空間)每個進程的虛擬地址空間劃分(即存儲映像)布局相同進程的地址空間用戶級上下文系統級上下文TSSLinux將虛存空間組織成“區域”的集合pgd:全局頁目錄地址vm_prot:訪問權限vm_flags:映射對象的類型vm_nextvm_nexttask_structmm_structpgdmmmmapvm_area_structvm_endvm_protvm_startvm_endvm_protvm_startvm_endvm_protvm_nextvm_startProcess
virtual
memoryTextDataShared
libraries0vm_flagsvm_flagsvm_flagstask_struct是某個進程(即任務)所有相關信息的描述結構(稱進程描述符),其中mm是其虛擬空間的描述結構進程的存儲器映射存儲器映射(memorymapping)是指將進程虛擬地址空間中的一個區域與硬盤上的一個對象建立關聯(生成頁表項),并初始化一個vm_area_struct結構信息可用mmap()函數實現存儲器映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);如何獲得mmap函數的實參?讀取可執行文件中的程序頭表而獲得實參!進程的存儲器映射可用mmap()函數實現存儲器映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);功能:將指定文件fd中偏移量offset開始的長度為length個字節的一塊信息映射到虛擬空間中起始地址為start、長度為length個字節的一塊區域,得到vm_area_struct結構的信息,并生成相應頁表項,建立文件地址和區域之間的映射關系。prot指定該區域內頁面的訪問權限位,對應vm_area_struct結構中的vm_prot字段PROT_EXE:頁面內容由指令組成PROT_READ:區域內頁面可讀PROT_WRITE:區域內頁面可寫PROT_NONE:區域內頁面不能被訪問flags指定所映射的對象的類型,對應vm_area_struct結構中的vm_flags字段MAP_PRIVATE:私有的寫時拷貝對象,對應可執行文件中只讀代碼區域(.init、.text.rodata)和已初始化數據區域(.data)MAP_SHARED:共享對象,對應共享庫文件中的信息MAP_ANON:請求0的頁,對應內核創建的匿名文件,相應頁框用0覆蓋并駐留內存MAP_PRIVATE|MAP_ANON:未初始化數據(.bss)、堆和用戶棧等對應區域虛頁第一次被裝入內存后,不管是用普通文件還是匿名文件對其進行初始化,以后都是在主存頁框和硬盤中交換文件(swapfile)間進行調進調出。交換文件由內核管理和維護,稱為交換分區(swaparea)或交換空間(swapspace)。Linux中虛擬地址空間中的區域MAP_PRIVATE|MAP_ANONMAP_SHAREDMAP_PRIVATEMAP_PRIVATE|MAP_ANONMAP_PRIVATE|MAP_ANON匿名文件:內核創建、無實際磁盤文件,無需從磁盤讀入、對應請求0的頁面普通文件:可執行文件和共享庫文件共享庫文件中的共享對象多個進程調用共享庫文件中的代碼,但共享庫代碼在內存和硬盤都只需要一個副本進程1運行過程中,內核為共享對象分配若干頁框進程2運行過程中,內核只要將進程2對應區域內頁表項中的頁框號直接填上即可一個進程對共享區域進行的寫操作結果,對于所有共享同一個共享對象的進程都是可見的,而且結果也會反映在硬盤上對應的共享對象中所分配的頁框在主存不一定連續,為簡化示意圖,這里圖中所示頁框是連續的硬盤私有的寫時拷貝對象同一個可執行文件對應不同進程時,只讀代碼區一樣,可讀可寫數據區開始也一樣,但屬于私有對象為節省主存,多采用寫時拷貝技術進程1運行過程中,內核為對象分配若干頁框,并標記為只讀進程2運行過程中,內核只要將進程2對應區域內頁表項中的頁框號直接填上,并標記為只讀若兩個進程都只是讀或執行,則在內存只有一個副本,節省主存;若進程2進行寫操作,則發生訪問違例,此時,內核判斷異常原因是進程試圖寫私有的寫時拷貝頁,就會分配一個新頁框,把內容拷貝到新頁框,并修改進程2的頁表項所分配的頁框在主存不一定連續,為簡化示意圖,這里圖中所示頁框是連續的硬盤程序的加載和運行UNIX/Linux系統中,可通過調用execve()函數來啟動加載器。execve()函數的功能是在當前進程上下文中加載并運行一個新程序。execve()函數的用法如下:
intexecve(char*filename,char*argv[],*envp[]);
filename是加載并運行的可執行文件名(如./hello),可帶參數列表argv和環境變量列表envp。若錯誤(如找不到指定文件filename),則返回-1,并將控制權交給調用程序;若函數執行成功,則不返回,最終將控制權傳遞到可執行目標中的主函數main。主函數main()的原型形式如下:
intmain(intargc,char**argv,char**envp);
或者:
intmain(intargc,char*argv[],char*envp[]);
argc指定參數個數,參數列表中第一個總是命令名(可執行文件名)
例如:命令行為“ld-otestmain.otest.o”時,argc=5回顧:程序的加載和運行Unix>ld
-otestmain.otest.o若在shell命令行提示符下輸入以下命令行ld是可執行文件名(即命令名),隨后是命令的若干參數,argv是一個以null結尾的指針數組,argc=5在shell命令行提示符后鍵入命令并按“enter”鍵后,便構造argv和envp,然后調用execve()函數來啟動加載器,最終轉main()函數執行intexecve(char*filename,char*argv[],*envp[]);intmain(intargc,char*argv[],char*envp[]);回顧:程序的加載和運行問題:hello程序的加載和運行過程是怎樣的?Step1:在shell命令行提示符后輸入命令:$./hello[enter]Step2:shell命令行解釋器構造argv和envpargvargv[0]nullargv[]“./hello"Step3:調用fork()函數,創建一個子進程,與父進程shell完全相同(只讀/共享),包括只讀代碼段、可讀寫數據段、堆以及用戶棧等。Step4:調用execve()函數,在當前進程(新創建的子進程)的上下文中加載并運行hello程序。將hello中的.text節、.data節、.bss節等內容加載到當前進程的虛擬地址空間(僅修改當前進程上下文中關于存儲映像的一些數據結構,不從磁盤拷貝代碼和數據等內容)Step5:調用hello程序的main()函數,hello程序開始在一個進程的上下文中運行。intmain(intargc,char*argv[],char*envp[]);回顧:可執行文件的加載通過調用execve系統調用函數來調用加載器加載器(loader)根據可執行文件的程序(段)頭表中的信息,將可執行文件的代碼和數據從磁盤“拷貝”到存儲器中(實際上不會真正拷貝,僅建立一種映像,這涉及到許多復雜的過程和一些重要概念,將在后續課上學習)加載后,將PC(EIP)設定指向Entrypoint
(即符號_start處),最終執行main函數,以啟動程序執行。程序被啟動如$./P調用fork()以構造的argv和envp為參數調用execve()execve()調用加載器進行可執行文件加載,并最終轉去執行main__libc_init_first_initatexitmain_exit_start:ELF文件信息舉例$readelf-hmain
ELFHeader:Magic:7f454c46010101000000000000000000Class:ELF32Data:2'scomplement,littleendianVersion:1(current)OS/ABI:UNIX-SystemVABIVersion:0Type:EXEC(Executablefile)Machine:Intel80386Version:0x1Entrypointaddress:x8048580Startofprogramheaders:52(bytesintofile)Startofsectionheaders:3232(bytesintofile)Flags:0x0Sizeofthisheader:52(bytes)Sizeofprogramheaders:32(bytes)Numberofprogramheaders:8Sizeofsectionheaders:40(bytes)Numberofsectionheaders:29Sectionheaderstringtableindex:26
可執行目標文件的ELF頭程序的加載fork、execve等OS內核代碼當IA-32/Linux系統開始執行main()函數時,在虛擬地址空間的用戶棧中的結構如左圖所示
intmain(intargc,char*argv[],char*envp[]);shell命令行解釋器A25邏輯控制流t0t1t2t3t4t5t6WordWordIEt7t8對于確定的數據集,某進程指令執行地址序列是確定的。稱為進程的邏輯控制流。
對于單處理器系統,進程會輪流使用處理器,即處理器的物理控制流由多個邏輯控制流組成。
p1的邏輯控制流為A11~A13、A11~A14、A15~A16。在A12處被打斷一次!邏輯控制流不會因被其他進程打斷而改變,還能回到原被打斷的“斷點”處繼續執行。進程p2的邏輯控制流為A21~A22、A23~A25。在A24處被打斷一次!P3未被打斷不同進程的邏輯控制流在時間上交錯或重疊的情況稱為并發(concurrency)P1和P2、P2和P3是并發執行;P1和P3不是并發執行!
“進程”
與“上下文切換”$./hellohello,world$“$”是shell命令行提示符,說明正在運行shell進程。在一個進程的生命周期中,可能會有其他不同進程在處理器上交替運行!感覺到的運行時間比真實執行時間要長!OS通過處理器調度讓處理器輪流執行多個進程。實現不同進程中指令交替執行的機制稱為進程的上下文切換(contextswitching)處理器調度等事件會引起用戶進程正常執行被打斷,因而形成異常控制流。進程的上下文切換機制很好地解決了這類異常控制流,實現了從一個進程安全切換到另一個進程執行的過程。
用戶態
內核態
用戶態
內核態
用戶態“進程”
的“上下文”進程的物理實體(代碼和數據等)和支持進程運行的環境合稱為進程的上下文。由進程的程序塊、數據塊、運行時的堆和用戶棧(兩者通稱為用戶堆棧)等組成的用戶空間信息被稱為用戶級上下文;由進程標識信息、進程現場信息、進程控制信息和系統內核棧等組成的內核空間信息被稱為系統級上下文;處理器中各寄存器的內容被稱為寄存器上下文(也稱硬件上下文),即進程的現場信息。在進行進程上下文切換時,操作系統把換下進程的寄存器上下文保存到系統級上下文中的現場信息位置。用戶級上下文地址空間和系統級上下文地址空間一起構成了一個進程的整個存儲器映像
進程的存儲器映像程序的執行機制分以下三個部分介紹第一講:進程和可執行文件的加載程序和進程的概念進程的存儲器映射程序的加載過程進程的邏輯控制流進程的上下文切換第二講:程序的執行與CPU基本組成程序及指令的執行過程內部異常和外部中斷的基本概念CPU的基本功能和基本組成程序及指令的執行過程程序和指令的關系程序由一條一條指令組成,指令按順序存放在連續存儲單元程序的執行:周而復始地執行一條一條指令正常情況下,指令按其存放順序執行遇到需改變程序執行流程時,用相應的轉移指令(包括無條件轉移指令、條件轉移指令、調用指令和返回指令等)來改變程序執行流程程序的執行流的控制將要執行的指令所在存儲單元的地址由程序計數器PC給出,通過改變PC的值來控制執行順序指令周期:CPU取出并執行一條指令的時間程序及指令的執行過程對于6.4.2中例子#include"stdio.h"#include"string.h"
voidoutputs(char*str)
{charbuffer[16];strcpy(buffer,str);printf("%s\n",buffer);}……intmain(intargc,char*argv[]){outputs(argv[1]);return0;}Strcpy的棧幀main:
……
calloutputsmoveax,………retoutputs:
……
callstrcpy……callprintf……retstrcpy:程序執行流:……calloutputs……callstrcpy……callprintf…...retmov%eax,…
……程序及指令的執行過程反匯編得到的outputs匯編代碼080483e4:push%ebp080483e5:mov%esp,%ebp080483e7:sub$0x18,%esp080483ea:mov0x8(%ebp),%eax080483ed:mov%eax,0x4(%esp)080483f1:lea0xfffffff0(%ebp),%eax080483f4:mov%eax,(%esp)080483f7:call0x8048330<__gmon_start__@plt+16>080483fc:lea0xfffffff0(%ebp),%eax080483ff:mov%eax,0x4(%esp)08048403:movl$0x8048500,(%esp)0804840a:call0x80483100804840f:leave08048410:ret將strcpy的兩個實參入棧將printf的兩個實參入棧程序及指令的執行過程在內存存放的指令實際上是機器代碼(0/1序列)08048394<add>:8048394:55push%ebp8048395:89e5mov%esp,%ebp8048397:8b450cmov0xc(%ebp),%eax804839a:034508add0x8(%ebp),%eax804839d:5d pop%ebp804839e:c3 ret對于add函數指令按順序存放在0x08048394開始的存儲空間。各指令長度可能不同,如push、pop和ret指令各占一個字節,第2行mov指令占兩個字節,第3行mov指令和第4行add指令各占3字節。各指令對應的0/1序列含義有不同的規定,如“push%ebp”指令為01010101B,其中01010為push指令操作碼,101為EBP的編號,“pop%ebp”為01011101B,其中01011為pop指令的操作碼。如何判定每條指令有多長?如何判定操作類型、寄存器編號、立即數等?如何區分第2行和第3行mov指令的不同?如何確定操作數是在寄存器中還是在存儲器中?一條指令執行結束后如何正確讀取到下一條指令?123456程序執行需要解決的問題:程序及指令的執行過程CPU運行程序的過程就是執行一條一條指令的過程CPU執行指令的過程中,包含CPU操作、訪問內存或I/O端口的操作兩類訪存或I/O:涉及存儲系統、總線和I/O接口等內容(后續課程內容)CPU內部操作:涉及CPU內部數據通路(后續課程內容)機器指令的執行過程CPU執行指令的過程取指令PC+“1”指令譯碼進行主存地址運算取操作數進行算術/邏輯運算存結果以上每步都需檢測“異常”若有異常,則自動切換到異常處理程序檢測是否有“中斷”請求,有則轉中斷處理指令執行過程問題:“取指令”一定在最開始做嗎?PC+“1”一定在譯碼前做嗎?“譯碼”須在指令執行前做嗎?你能說出幾種“異常”事件?“異常”和“中斷”的差別是什么?異常是在CPU內部發生的,中斷是由外部事件引起的取指階段執行階段“1”:指一條指令的長度,定長指令字每次都一樣;變長指令字每次可能不同定長指令字通常在譯碼前做,變長指令字在譯碼后做!機器指令的執行過程取指令:從PC所指單元取出指令送指令寄存器(IR),并增量PC。如add函數,開始PC(IA-32的EIP)中存放的是0x0848394,CPU根據PC取指令送IR,每次總是取最長指令字節數,假定最長指令是4個字節,即IR為32位,此時,也即5589E58BH被取到IR中。指令譯碼:不同指令其功能不同,因而需要不同的操作控制信號。CPU根據不同操作碼譯出不同控制信號。對于上述取到IR中的5589E58BH譯碼時,可根據高5位01010譯碼得到push指令的控制信號。源操作數地址計算并取操作數:根據尋址方式確定源操作數地址計算方式,若是存儲器數據,則需一次或多次訪存;若為間接尋址或兩操作數都在存儲器的雙目運算,則需多次訪存;若是寄存器數據,則直接從寄存器取數。執行數據操作:在ALU或加法器等運算部件中對取出的源操作數進行運算。目的操作數地址計算并存結果:根據尋址方式確定目的操作數地址計算方式,若是存儲器數據,則需要一次或多次訪存(間接尋址時);若是寄存器數據,則在進行數據操作時直接存結果到寄存器。指令地址計算并將其送PC。順序執行時,PC加上當前指令長度;遇到轉移類指令時,則需要根據條件碼、操作碼和尋址方式等確定下條指令地址。
機器指令的執行過程每條指令的功能總是由以下四種基本操作來實現:讀取某一主存單元的內容,并將其裝入某個寄存器(取指,取數)把一個數據從某個寄存器存入給定的主存單元中(存結果)把一個數據從某寄存器送到另一寄存器或者ALU(取數,存結果)進行算術或邏輯運算(PC+”1”,計算地址,運算)指令執行過程中查詢各種異常情況,并在發現異常時轉異常處理指令執行結束時查詢中斷請求,并在發現中斷請求時響應中斷操作功能可形式化描述描述語言稱為寄存器傳送語言RTL(RegisterTransferLanguage)回顧:馮.諾依曼結構模型機控制器CPUPC輸入設備輸出設備MARMDRALU標志寄存器
IR地址數據控制GPRs0123存儲器01234567
你媽會做的菜和廚師會做的菜不一樣,同一個菜譜的做法也可能不同如同不同架構支持的指令集不同,同一種指令的實現方式和功能也可能不同控制器
ALU標志寄存器
地址數據控制GPRs017ffffffff80483d680483d580483d405589e5EIPbfff0000MDRIRMARbeeefffc回顧:IA-32的體系結構是怎樣的呢?8個GPR(0~7),一個EFLAGs,PC為EIP可尋址空間4GB(編號為0~0xFFFFFFFF)指令格式變長,操作碼變長由若干字段(OP、Mod、SIB等)組成
程序由指令序列組成080483d4
<add>:80483d4: 55 push%ebp80483d5: 89e5 mov%esp,%ebp80483d7: 83ec10sub$0x10,%esp
80483da: 8b450cmov0xc(%ebp),%eax80483dd: 8b5508mov0x8(%ebp),%edx80483e0: 8d0402lea(%edx,%eax,1),%eax80483e3: 8945fcmov%eax,-0x4(%ebp)80483e6: 8b45fcmov-0x4(%ebp),%eax80483e9: c9leave80483ea: c3ret代碼執行從80483d4開始!“objdump-dtest”顯示的add函數結果起始EIP=?EIP←0x80483d4若i=2147483647,j=2,則程序執行結果是什么?每一步如何執行?想想媽媽怎么做菜的?根據EIP取指令指令譯碼取操作數指令執行回寫結果修改EIP的值取并執行指令OP假定0x80484d4等是內存地址,實際上它們是虛存地址,需要虛-實地址轉換指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff0000bfff000080483d480483d45589e583Rd5589e58355MDR5589e58380483d4S1:取指令IR5589e583RdS2:指令譯碼S3:指令執行MARbffefffc55功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff000080483d455MDR80483d4S1:取指令IRS2:指令譯碼S3:指令執行bffefffcMARbffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff000080483d455MDRS1:取指令IRS2:指令譯碼S3:指令執行bffefffcMARbffefffcbffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]54指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff000080483d4Wr55MDRS1:取指令IRWrS2:指令譯碼S3:指令執行bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff0000Wr55MDRS1:取指令IRWrS2:指令譯碼S3:指令執行bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc2000ffbf80483d4功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff000080483d555MDRS1:取指令IRS2:指令譯碼S3:指令執行、EIP增量bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc2000ffbf開始執行下一條指令45WrWr
程序由指令序列組成080483d4
<add>:
80483d4: 55 push%ebp80483d5: 89e5 mov%esp,%ebp80483d7: 83ec10sub$0x10,%esp
80483da: 8b450cmov0xc(%ebp),%eax80483dd: 8b5508mov0x8(%ebp),%edx
80483e0: 8d0402lea(%edx,%eax,1),%eax80483e3: 8945fcmov%eax,-0x4(%ebp)80483e6: 8b45fcmov-0x4(%ebp),%eax80483e9: c9leave80483ea: c3retEIP←0x80483d4若i=2147483647,j=2,則程序執行結果是什么?每一步如何執行?OPEDX和EAX中各是什么?R[edx]=i=0x7fffffffR[eax]=j=0x2回顧:IA-32的寄存器組織反映了體系結構發展的軌跡,字長不斷擴充,指令保持兼容ST(0)~ST(7)是80位,MM0~MM7使用其低64位指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5
EBPESPEIPbfff000080483e0MDRS1:取指令IRWrS2:指令譯碼S3:指令執行、EIP增量MAR7fffffffbeeefffc2000ffbf2
28d04028945功能:R[eax]←R[edx]+R[eax]*1回顧:ALU長啥樣呢?試想一下ALU中有哪些部件?(想想廚房做菜用什么工具?)補碼加/減器(可以干什么?)帶符號加、帶符號減無符號加、無符號減乘法器?(為什么可以沒有?)可用加/減+移位實現,也可有獨立乘法器帶符號乘和無符號乘是各自獨立的部件除法器?(為什么可以沒有?)可用加/減+移位實現,也可有獨立除法器帶符號除和無符號除是各自獨立的部件各種邏輯運算部件(可以干什么?)非、與、或、非、前置0個數、前置1個數…….大家能否畫出ALU框圖?回顧:ALU結構原理
ALU符號是怎樣的?ALUABRFlagsALUctrnnn4猜猜這是什么?補碼加/減器與門nnnFlagsR或門右移非門ABAA∧BA>>1A∨B4ALUctr多路選擇器指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5
EBPESPEIPbfff000080483e0MDRS1:取指令IRWrS2:指令譯碼S3:指令執行、EIP增量MAR7fffffffbeeefffc2000ffbf28d04028945功能:R[eax]←R[edx]+R[eax]*1(執行前)
2指令執行過程控制器
ALU標志寄存器
地址數據控制GPRs017bfff002080483d680483d580483d40
80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5
EBPESPEIPbfff000080483e0MDRS1:取指令IRWrS2:指令譯碼S3:指令執行、EIP增量MAR7fffffffbeeefffc2000ffbf2
800000018d04028945功能:R[eax]←R[edx]+R[eax]*1(執行后)lea指令執行的結果intadd(inti,intj){ returni+j;}intmain(){ int t1=2147483647;intt2=2; int sum=add(t1,t2); printf(”sum=%d”,
sum);}sum=-2147483647sum=0x80000001
sum的機器數和值分別是什么?
咦,怎么會兩個正數相加結果為負數呢?為什么?回顧:程序的機器級表示與執行intsum(inta[],unsignedlen){inti,sum=0;for(i=0;i<=len–1;i++) sum+=a[i];returnsum;}sum:….L3:…movl-4(%ebp),%eaxmovl12(%ebp),%edxsubl$1,%edxcmpl%edx,%eaxjbe .L3…程序的正常執行順序有哪兩種?(1)按順序取下一條指令執行(2)通過CALL/RET/Jcc/JMP等指令跳轉到轉移目標地址處執行CPU所執行的指令的地址序列稱為CPU的控制流,通過上述兩種方式得到的控制流為正常控制流。08048380<main>:8048380:55 push%ebp8048381:89e5mov%esp,%ebp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項目安全協議書范本
- 崗位大練兵活動總結模版
- 大學生職業規劃大賽《油氣儲運工程專業》生涯發展展示
- 用電消防安全試題及答案
- 藥品冷鏈運作流程圖解
- 典型的傳染病四個階段
- 醫藥類國企面試題及答案
- 知識產權質押融資合同與權屬登記
- 智能物流倉儲租賃及機器人操作合同
- 綜合管廊消防系統施工進度與質量監督合同
- 腎癌診療指南
- 2022-2023學年下學期期末高一年級《土木工程識圖》考試試題(附答案)
- 土狗養殖知識指南培訓課件
- 職業健康檢查機構執法監督檢查表
- 酒吧主題派對策劃方案
- 預防錯混料方案
- DLT 1051-2019電力技術監督導則
- 2024社會工作者(初)《社會工作實務(初級)》考前沖刺卷(含答案)
- 建筑地基處理技術規范
- 2023年山東煙草專賣局筆試試題
- 浙江省教學能力大賽二等獎中職語文教學實施報告現場展示
評論
0/150
提交評論