運行時存儲空間組織課件_第1頁
運行時存儲空間組織課件_第2頁
運行時存儲空間組織課件_第3頁
運行時存儲空間組織課件_第4頁
運行時存儲空間組織課件_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

運行時存儲空間組織9.1目標程序運行時的活動以Pascal為例,假定程序由若干個過程組成過程(procedure)定義一個過程的活動指的是該過程的一次執(zhí)行過程P一個活動的生存期,指的是從執(zhí)行該過程體第一步操作到最后一步操作之間的操作序,包括執(zhí)行P時調(diào)用其它過程花費的時間過程可以是遞歸的(1)programsort(input,output)(2)vara:array[0..10]ofinteger;(3)procedurereadarray;(4)vari:integer;(5)begin(6)fori:=1to9doread(a[i])(7)end;(8)functionpartition(y,z:integer):integer;(9)vari:integer;(10)begin......(11)end;programsortprocedurereadarray

functionpartitionprocedurequicksort(12)procedurequicksort(m,n:integer);(13)vari:integer;(14)begin(15)if(n>m)thenbegin(16)i:=partition(m,n);(17)

quicksort(m,i-1);(18)quicksort(i+1,n)(19)end;(20)end;(21)begin(22)a[0]:=-9999;a[10]:=9999;(23)readarray;(24)quicksort(1,9)(25)end.programsortprocedurereadarray

functionpartitionprocedurequicksort參數(shù)傳遞過程是模塊程序設計的主要手段,同時也是節(jié)省程序代碼和擴充語言的主要途徑。過程定義:procedureadd(x,y:integer;varz:integer)beginz:=x+y;end;過程調(diào)用

add(a,b,c);參數(shù)傳遞方式傳地址得結(jié)果傳值傳名參數(shù)傳遞方式一.傳地址把實在參數(shù)的地址傳遞給相應的形式參數(shù)方法:調(diào)用段預先把實在參數(shù)的地址傳遞到被調(diào)用段可以拿到的地方;程序控制轉(zhuǎn)入被調(diào)用段之后,被調(diào)用段首先把實在參數(shù)的地址抄進自己相應的形式單元中;過程體對形式參數(shù)的引用域賦值被處理成對形式單元的間接訪問。PASCAL的變量參數(shù)方式procedureswap(varm:integer;varn:integer);vari:integer;begini:=m;m:=n;n:=i;endswap(a,b)把a,b的地址送到已知單元j1和j2中m:=j1;n:=j2;i:=m↑;m↑:=n↑;n↑:=i;參數(shù)傳遞方式二.得結(jié)果傳地址的一種變形方法:每個形參對應兩個形式單元,第一個形式單元存放實參地址,第二個單元存放實參的值。在過程體中對形式參數(shù)的任何引用或賦值都看作對它的第二個單元的直接訪問。過程完成返回前把第二個單元的內(nèi)容存放到第一個單元所指的實參單元中。有些Fortran采用這種方式;參數(shù)傳遞方式三.傳值把實在參數(shù)的值傳遞給相應的形式參數(shù)方法:調(diào)用段預先把實在參數(shù)的的值計算出來并放在被調(diào)用段可以拿到的地方;被調(diào)用段開始工作時,首先把實參的值抄入形式參數(shù)相應的單元;被調(diào)用段中,象引用局部數(shù)據(jù)一樣引用形式單元。PASCAL的值參數(shù)參數(shù)傳遞方式四.傳名過程調(diào)用的作用相當于把被調(diào)用段的過程體抄到調(diào)用出現(xiàn)的地方,但把其中任一出現(xiàn)的形式參數(shù)都替換成相應的實參。方法:在進入被調(diào)用段之前不對實在參數(shù)預先進行計值,而是讓過程體中每當使用到相應的形式參數(shù)時才逐次對它實行計值(或計算地址)。因此,通常把實在參數(shù)處理成一個子程序(稱為參數(shù)子程序),每當過程體中使用到相應的形式參數(shù)時就調(diào)用這個子程序。PROGRAMEX… varA:integer; PROCEDUREP(B:integer) … varA:integer; BEGIN

A:=0;

B:=B+1;

A:=A+B; END;BEGIN

A:=2;

TA:=0;

A:=A

+1;

TA:=TA+A;write(A);ENDBEGIN

A:=2;

P(A);write(A);END傳名舉例例:…procedureP(w,x,y,z);beginy:=y*w;z:=z+x;endbegina:=5;b:=3;P(a+b,a-b,a,a);write(a);end傳值: 傳地址:得結(jié)果:傳名: 542777傳名…procedureP(w,x,y,z);beginy:=y*w;z:=z+x;endbegina:=5;b:=3;P(a+b,a-b,a,a);write(a);endBEGIN

a:=5;b:=3

a:=a*(a+b)

;

a:=a+(a-b)

;write(a);END小結(jié)目標程序運行時的活動參數(shù)傳遞

傳值、傳址、得結(jié)果、傳名第九章運行時存儲空間組織目標程序運行時的活動運行時存儲器的劃分靜態(tài)存儲管理一個簡單棧式存儲分配嵌套過程語言的棧式實現(xiàn)編譯程序組織存儲空間須考慮的問題:

過程是否允許遞歸?當控制從一個過程的活動返回時,對局部名稱的值如何處理?過程是否允許引用非局部名稱?過程調(diào)用時如何傳遞參數(shù);過程是否可以做為參數(shù)被傳遞和做為結(jié)果被返回?存儲空間可否在程序控制下進行動態(tài)分配?存儲空間是否必須顯式地釋放?9.2運行時存儲器的劃分

一個目標程序運行所需的存儲空間包括:存放目標代碼的空間存放數(shù)據(jù)項目的空間存放程序運行的控制或連接數(shù)據(jù)所需單元(控制棧)一個程序在運行時刻的內(nèi)存劃分:代碼(Code)靜態(tài)數(shù)據(jù)(StaticData)棧(Stack)

堆(Heap)

9.2.2活動記錄活動記錄:為了管理過程在一次執(zhí)行中所需要的信息所使用的一個連續(xù)的存儲塊。假定語言的特點為:允許過程遞歸調(diào)用、允許過程含有可變數(shù)組,但過程定義不允許嵌套,如C語言。采用棧式存儲分配機制。運行時,每當進入一個過程就有一個相應的活動記錄累筑于棧頂。此記錄含有連接數(shù)據(jù)、形式單元、局部變量、局部數(shù)組的內(nèi)情向量和臨時工作單元等。對任何局部變量X的引用可表示為變址訪問:dx[SP]dx:變量X相對于活動記錄起點的地址,在編譯時可確定。參數(shù)個數(shù)返回地址形式單元臨時單元內(nèi)情向量局部變量SP

012老SPTOP

每個過程的活動記錄內(nèi)容(非嵌套語言)連接數(shù)據(jù)返回地址動態(tài)鏈:指向調(diào)用該過程前的最新活動記錄地址的指針。靜態(tài)鏈:指向靜態(tài)直接外層最新活動記錄地址的指針,用來訪問非局部數(shù)據(jù)。靜態(tài)鏈動態(tài)鏈形式單元臨時單元內(nèi)情向量局部變量SP

012返回地址TOP

每個過程的活動記錄內(nèi)容(嵌套語言)形式單元:存放相應的實在參數(shù)的地址或值。局部數(shù)據(jù)區(qū):局部變量、內(nèi)情向量、臨時工作單元(如存放對表達式求值的結(jié)果)。靜態(tài)鏈動態(tài)鏈形式單元臨時單元內(nèi)情向量局部變量SP

012返回地址TOP

每個過程的活動記錄內(nèi)容

靜態(tài)分配策略(FORTRAN)如果在編譯時能確定數(shù)據(jù)空間的大小,則可采用靜態(tài)分配方法:在編譯時刻為每個數(shù)據(jù)項目確定出在運行時刻的存儲空間中的位置。動態(tài)分配策略(PASCAL)如果在編譯時不能確定運行時數(shù)據(jù)空間的大小,則必須采用動態(tài)分配方法。允許遞歸過程和動態(tài)申請釋放內(nèi)存。棧式動態(tài)分配:允許遞歸堆式動態(tài)分配:允許動態(tài)釋放內(nèi)存9.2.3存儲分配策略

PROGRAMMAIN…integerX,YCOMMON/C/A,B…ENDSUBROUTINESUB1…realX,ZCOMMON/C/A1,B1…END9.3 靜態(tài)存儲管理(FORTRAN)9.3 靜態(tài)存儲管理FORTRAN程序的特點:整個程序所需數(shù)據(jù)空間的總量在編譯時完全確定,每個數(shù)據(jù)名的地址可以靜態(tài)地進行分配。由于每個FORTRAN程序段可以獨立編譯,運行前由裝入程序把各段連成可運行的整體。按數(shù)據(jù)區(qū)組織存儲:每個程序段定義一個局部數(shù)據(jù)區(qū),用來存放程序段中未出現(xiàn)在COMMON里的局部名的值。每個公用塊定義一個公用數(shù)據(jù)區(qū),用來存放公用塊里各個名字的值。每個數(shù)據(jù)區(qū)有一個編號,地址分配時,在符號表中,對每個數(shù)據(jù)名登記其所屬數(shù)據(jù)區(qū)編號及在該區(qū)中的相對位置。每個局部數(shù)據(jù)區(qū)的內(nèi)容及存放次序:寄存器保護區(qū)返回地址形式單元臨時變量數(shù)組簡單變量01A考慮子程序段:SUBROUTINESWAP(A,B)T=AA=BB=TRETURNEND寄存器保護區(qū)返回地址ATB01aa+2a+4第九章運行時存儲空間組織目標程序運行時的活動運行時存儲器的劃分靜態(tài)存儲管理一個簡單棧式存儲分配嵌套過程語言的棧式實現(xiàn)9.4 一個簡單棧式存儲分配假定語言的特點為:允許過程遞歸調(diào)用、允許過程含有可變數(shù)組,但過程定義不允許嵌套,如C語言。采用棧式存儲分配機制活動記錄:運行時,每當進入一個過程就有一個相應的活動記錄累筑于棧頂。此記錄含有連接數(shù)據(jù)、形式單元、局部變量、局部數(shù)組的內(nèi)情向量和臨時工作單元等。

全局數(shù)據(jù)說明Main(){ Main中的數(shù)據(jù)說明}

voidR(){ R中的數(shù)據(jù)說明}…voidQ(){Q中的數(shù)據(jù)說明}主程序→過程Q→過程R全局數(shù)據(jù)區(qū)

全局數(shù)據(jù)說明Main(){ Main中的數(shù)據(jù)說明}

voidR(){ R中的數(shù)據(jù)說明}…voidQ(){Q中的數(shù)據(jù)說明}主程序→過程Q→過程R主程序活動記錄TOP

SP

全局數(shù)據(jù)區(qū)

全局數(shù)據(jù)說明Main(){ Main中的數(shù)據(jù)說明}

voidR(){ R中的數(shù)據(jù)說明}…voidQ(){Q中的數(shù)據(jù)說明}主程序→過程Q→過程RQ的活動記錄主程序活動記錄TOP

SP

全局數(shù)據(jù)區(qū)

全局數(shù)據(jù)說明Main(){ Main中的數(shù)據(jù)說明}

voidR(){ R中的數(shù)據(jù)說明}…voidQ(){Q中的數(shù)據(jù)說明}主程序→過程Q→過程RQ的活動記錄主程序活動記錄TOP

R的活動記錄SP

參數(shù)個數(shù)返回地址形式單元內(nèi)情向量局部變量老SP臨時單元全局數(shù)據(jù)區(qū)

全局數(shù)據(jù)說明Main(){ Main中的數(shù)據(jù)說明}

voidR(){ R中的數(shù)據(jù)說明}…voidQ(){Q中的數(shù)據(jù)說明}主程序→過程Q→過程RQ的活動記錄主程序活動記錄全局數(shù)據(jù)區(qū)R的活動記錄TOP

SP

TOP

SP

全局數(shù)據(jù)說明Main(){ Main中的數(shù)據(jù)說明}

voidR(){ R中的數(shù)據(jù)說明}…voidQ(){Q中的數(shù)據(jù)說明}主程序→過程Q→過程RQ的活動記錄主程序活動記錄全局數(shù)據(jù)區(qū)TOP

SP

TOP

SP

全局數(shù)據(jù)說明Main(){ Main中的數(shù)據(jù)說明}

voidR(){ R中的數(shù)據(jù)說明}…voidQ(){Q中的數(shù)據(jù)說明}主程序→過程Q→過程R主程序活動記錄全局數(shù)據(jù)區(qū)TOP

SP

全局數(shù)據(jù)說明Main(){ Main中的數(shù)據(jù)說明}

voidR(){ R中的數(shù)據(jù)說明}…voidQ(){Q中的數(shù)據(jù)說明}主程序→過程Q→過程R每個過程的活動記錄內(nèi)容如圖:對任何局部變量X的引用可表示為變址訪問:dx[SP]dx:變量X相對于活動記錄起點的地址,在編譯時可確定。參數(shù)個數(shù)返回地址形式單元臨時單元內(nèi)情向量局部變量SP

012老SPTOP

9.4.1C的活動記錄過程調(diào)用的語句P(T1,T2,……,Tn)翻譯成四元式序列: parT1 parT2 … parTn callP,n9.4.2C的過程調(diào)用、過程進入、數(shù)組空間分配和過程返回1)每個parTi(i=1,2,…n)可直接翻譯成如下指令: (i+3)[TOP]:=Ti

(傳值) (i+3)[TOP]:=addr(Ti)

(傳地址)2)callP,n被翻譯成:1[TOP]:=SP(保護現(xiàn)行SP)3[TOP]:=n(傳遞參數(shù)個數(shù))JSRP(轉(zhuǎn)子指令)參數(shù)個數(shù)返回地址形式單元內(nèi)情向量局部變量老SP臨時單元對于par和call產(chǎn)生的目標代碼如下:TOP

SP

調(diào)用過程的活動記錄形式單元老SP參數(shù)個數(shù)3)轉(zhuǎn)進過程P后,首先應執(zhí)行下述指令: SP:=TOP+1 (定義新的SP) 1[SP]:=返回地址 (保護返回地址) TOP:=TOP+L (新TOP)L:過程P的活動記錄所需單元數(shù),

在編譯時可確定。

參數(shù)個數(shù)返回地址形式單元內(nèi)情向量局部變量老SP臨時單元TOP

調(diào)用過程的活動記錄返回地址TOP

SP

4)過程返回時,應執(zhí)行下列指令: TOP:=SP-1 (恢復調(diào)用前TOP) SP:=0[SP] (恢復調(diào)用前SP) X:=2[TOP] (把返回地址取到X中) UJ0[X] (按X返回)參數(shù)個數(shù)返回地址形式單元內(nèi)情向量局部變量老SP臨時單元調(diào)用過程的活動記錄TOP

SP

SP

TOP

4)過程返回時,應執(zhí)行下列指令: TOP:=SP-1 (恢復調(diào)用前TOP) SP:=0[SP] (恢復調(diào)用前SP) X:=2[TOP] (把返回地址取到X中) UJ0[X] (按X返回)參數(shù)個數(shù)返回地址形式單元內(nèi)情向量局部變量老SP臨時單元調(diào)用過程的活動記錄SP

TOP

小結(jié)運行時存儲器的劃分

活動記錄(像c等允許遞歸的語言)

局部數(shù)據(jù)區(qū)(像fortran等不含遞歸的語言)一個簡單棧式存儲分配C的活動記錄C的過程調(diào)用、過程進入、數(shù)組空間分配和過程返回第九章運行時存儲空間組織目標程序運行時的活動運行時存儲器的劃分靜態(tài)存儲管理一個簡單棧式存儲分配嵌套過程語言的棧式實現(xiàn)9.5

嵌套過程語言的棧式實現(xiàn)PASCAL非局部名字的訪問的實現(xiàn)靜態(tài)鏈和活動記錄嵌套層次顯示表display過程調(diào)用、過程進入、過程返回嵌套過程語言的棧式實現(xiàn)PASCAL非局部名字的訪問的實現(xiàn)靜態(tài)鏈和活動記錄嵌套層次顯示表display過程調(diào)用、過程進入、過程返回9.5 嵌套過程語言的棧式實現(xiàn)假定語言不僅允許過程的遞歸調(diào)用(和可變數(shù)組),而且允許過程定義的嵌套,如PASCAL,PL語言。PASCALPASCAL程序本身可以看成是一個操作系統(tǒng)所調(diào)用的過程,過程可以嵌套和遞歸。一個PASCAL過程:過程頭;說明段(由一系列的說明語句組成);begin執(zhí)行體(由一系列的執(zhí)行語句組成);end9.5 嵌套過程語言的棧式實現(xiàn)作用域:一個名字能被使用的區(qū)域范圍稱作這個名字的作用域。允許同一個標識符在不同的過程中代表不同的名字。名字作用域規(guī)則--"最近嵌套原則"一個在子程序B1中說明的名字X只在B1中有效(局部于B1);如果B2是B1的一個內(nèi)層子程序且B2中對標識符X沒有新的說明,則原來的名字X在B2中仍然有效。如果B2對X重新作了說明,那么,B2對X的任何引用都是指重新說明過的這個X。programmain

varA,B:real;

procedureP1varB:boolean;

begin

…end

procedureP2varA:integer;

…begin

…endbegin

…endA(real)B(real)B(bool)A(integr)嵌套過程語言的棧式實現(xiàn)PASCAL非局部名字的訪問的實現(xiàn)靜態(tài)鏈和活動記錄嵌套層次顯示表display過程調(diào)用、過程進入、過程返回9.5.1非局部名字的訪問的實現(xiàn)

主程序的層次為0;在i層中定義的過程,其層次為i+1;(層數(shù),偏移量)過程運行時,必須知道其所有外層過程的當前活動記錄的起始地址。

程序programP;vara,x:integer;procedureQ(b:integer); vari:integer; procedureR(u:integer;varv:integer); varc,d:integer; begin ifu=1thenR(u+1,v) ...... v:=(a+c)*(b-d); ...... end{R}begin ...... R(1,x); ......end{Q}procedureS; varc,i:integer; begin

a:=1; Q(c); ...... end{S}begin a:=0; S; ......end.{P}主程序P過程

S

過程

Q

過程

R

過程

RS的活動記錄主程序P活動記錄全局數(shù)據(jù)區(qū)Q的活動記錄R的活動記錄R的活動記錄嵌套過程語言的棧式實現(xiàn)PASCAL非局部名字的訪問的實現(xiàn)靜態(tài)鏈和活動記錄嵌套層次顯示表display過程調(diào)用、過程進入、過程返回一、靜態(tài)鏈和活動記錄靜態(tài)鏈:指向本過程的直接外層過程的活動記錄的起始地址,也稱存取鏈。動態(tài)鏈:指向本過程的調(diào)用過程的活動記錄的起始地址,也稱控制鏈。參數(shù)個數(shù)返回地址形式單元臨時單元內(nèi)情向量局部變量SP

012動態(tài)鏈(老SP)TOP

靜態(tài)鏈

程序programP;vara,x:integer;procedureQ(b:integer); vari:integer; procedureR(u:integer;varv:integer); varc,d:integer; begin ifu=1thenR(u+1,v) ...... v:=(a+c)*(b-d); ...... end{R}begin ...... R(1,x); ......end{Q}procedureS; varc,i:integer; begin a:=1; Q(c); ...... end{S}begin a:=0; S; ......end.{P}主程序P過程

S

過程

Q

過程

R

過程

R00返回地址102a3x4SP

TOP

主程序P參數(shù)個數(shù)返回地址形式單元臨時單元內(nèi)情向量局部變量SP

012動態(tài)鏈(老SP)TOP

靜態(tài)鏈00返回地址102a3x405返回地址6070(形參個數(shù))8c9i10SP

TOP

動態(tài)鏈靜態(tài)鏈主程序P

過程

S參數(shù)個數(shù)返回地址形式單元臨時單元內(nèi)情向量局部變量SP

012動態(tài)鏈(老SP)TOP

靜態(tài)鏈00返回地址102a3x405返回地址6070(形參個數(shù))8c9i10SP

TOP

動態(tài)鏈靜態(tài)鏈主程序P

過程

S?第N層過程調(diào)用第N+1層過程,如何確定被調(diào)用過程(第N+1層)過程的靜態(tài)鏈?A:調(diào)用過程(第N層過程)的最新活動記錄的起始地址.00返回地址102a3x405返回地址6070(形參個數(shù))8c9i10SP

TOP

動態(tài)鏈靜態(tài)鏈主程序P

過程

S

過程

Q511返回地址120131(形參個數(shù))14b(形參)15i16?第N層過程調(diào)用第N層過程,如何確定被調(diào)用過程(第N層)過程的靜態(tài)鏈?A:調(diào)用過程(第N層過程)的靜態(tài)鏈的值。00返回地址102a3x405返回地址6070(形參個數(shù))8c9i10動態(tài)鏈靜態(tài)鏈主程序P

過程

S

過程

Q

過程

R511返回地址120131(形參個數(shù))14b(形參)15i161117返回地址1811192(形參個數(shù))20u(形參)21v(形參)22c23d24SP

TOP

00返回地址102a3x405返回地址6070(形參個數(shù))8c9i10動態(tài)鏈靜態(tài)鏈主程序P

過程

S

過程

Q

過程

R

過程

R511返回地址120131(形參個數(shù))14b(形參)15i161117返回地址1811192(形參個數(shù))20u(形參)21v(形參)22c23d241725返回地址2611272(形參個數(shù))28u(形參)29v(形參)30c31d32TOP

SP

00返回地址102a3x405返回地址6070(形參個數(shù))8c9i10動態(tài)鏈靜態(tài)鏈主程序P

過程

S

過程

Q

過程

R

過程

Q511返回地址120131(形參個數(shù))14b(形參)15i161117返回地址1811192(形參個數(shù))20u(形參)21v(形參)22c23d24TOP

SP

1725返回地址260271(形參個數(shù))28b(形參)29i30?第N層過程調(diào)用第N-x層過程,如何確定被調(diào)用過程(第N-x層)過程的靜態(tài)鏈?A:沿著調(diào)用過程(第N層過程)的靜態(tài)鏈向前走x步到達的活動記錄的靜態(tài)鏈的值。嵌套過程語言的棧式實現(xiàn)如何根據(jù)調(diào)用過程P1的活動記錄信息建立被調(diào)過程P2的靜態(tài)鏈?第N層過程調(diào)用第N+1層:P2的靜態(tài)鏈為調(diào)用過程P1(第N層過程)的最新活動記錄的起始地址第N層過程調(diào)用第N層:P2的靜態(tài)鏈為調(diào)用過程P1(第N層過程)的靜態(tài)鏈的值第N層過程調(diào)用第N-x層:P2的靜態(tài)鏈為沿著調(diào)用過程P1的靜態(tài)鏈向前走x步到達的活動記錄的靜態(tài)鏈的值。P0P2P1P0P1P2P0P1P2嵌套過程語言的棧式實現(xiàn)PASCAL非局部名字的訪問的實現(xiàn)靜態(tài)鏈和活動記錄嵌套層次顯示表display過程調(diào)用、過程進入、過程返回二、嵌套層次顯示表display當進入一個過程后,在建立其活動記錄區(qū)的同時建立一張嵌套層次顯示表diaplay,把diaplay表作為活動記錄的一部分。令過程R的外層為Q,Q的外層為主程序為P,則過程R運行時的DISPLAY表內(nèi)容為:PRQ問題:當過程P1調(diào)用過程P2而進入P2后,P2應如何建立起自己的display表?P0P1P2P0P2P1P0P1P2問題:當過程P1調(diào)用過程P2而進入P2后,P2應如何建立起自己的display表?P0P1P2l2:P1的最新活動記錄的起始地址P0的最新活動記錄的起始地址P1的display表P0的最新活動記錄的起始地址l2:

P2的最新活動記錄的起始地址…………P2的display表從P1的display表中自底而上地取過l2個單元(l2為P2的層數(shù))再添上進入P2后新建立的SP值就構(gòu)成了P2的display表。

0l2-1

l2問題:當過程P1調(diào)用過程P2而進入P2后,P2應如何建立起自己的display表?P0P2P1l2-1:

P1的最新活動記錄的起始地址P0的最新活動記錄的起始地址P1的display表P0的最新活動記錄的起始地址P1的最新活動記錄的起始地址…………P2的display表從P1的display表中自底而上地取過l2個單元(l2為P2的層數(shù))再添上進入P2后新建立的SP值就構(gòu)成了P2的display表。l2:

P2的最新活動記錄的起始地址l2-2l2-1問題:當過程P1調(diào)用過程P2而進入P2后,P2應如何建立起自己的display表?P0P1P2P1的最新活動記錄的起始地址P0的最新活動記錄的起始地址P1的display表P0的最新活動記錄的起始地址…………P2的display表從P1的display表中自底而上地取過l2個單元(l2為P2的層數(shù))再添上進入P2后新建立的SP值就構(gòu)成了P2的display表。l2:

P2的最新活動記錄的起始地址l2:P2的最新活動記錄的起始地址問題:當過程P1調(diào)用過程P2而進入P2后,P2應如何建立起自己的display表?答案:從P1的display表中自底而上地取過l2個單元(l2為P2的層數(shù))再添上進入P2后新建立的SP值就構(gòu)成了P2的display表。把P1的display表(全局display表)地址作為連接數(shù)據(jù)之一傳送給P2就能夠建立P2的display表。P0P1P2P0P2P1P0P1P2全局display:調(diào)用過程的display表地址diaplay表在活動記錄中的相對地址d在編譯時能完全確定。假定在現(xiàn)行過程中引用了某層過程(令其層次為k)的X變量,那么,可用下面兩條指令獲得X的地址:LDR1(d+k)[SP]LDR2dx[R1]嵌套過程語言活動記錄參數(shù)個數(shù)返回地址形式單元臨時單元內(nèi)情向量局部變量SP

012老SPTOP

Display表全局Display3d…programP;vara,x:integer;procedureQ(b:integer); vari:integer; procedureR(u:integer;varv:integer); varc,d:integer; begin ifu=1thenR(u+1,v) ...... v:=(a+c)*(b-d); ...... end{R}begin ...... R(1,x); ......end{Q}procedureS; varc,i:integer; begin a:=1; Q(c); ...... end{S}begin a:=0; S; ......end.{P}主程序P過程

S

過程

Q

過程

R

過程

R00返回地址10(display)2a3x405返回地址62(全局display)70(形參個數(shù))809510主程序

過程

Sc11i12TOP

SP

動態(tài)鏈參數(shù)個數(shù)返回地址形式單元臨時單元內(nèi)情向量局部變量SP

012老SPTOP

Display表全局Display3d…00返回地址10(display)2a3x405返回地址62(全局display)70(形參個數(shù))809510主程序P

過程

S

過程

Qc11i12動態(tài)鏈513返回地址149(全局display)151(形參個數(shù))16b(形參)170181319i20TOP

SP

參數(shù)個數(shù)返回地址形式單元臨時單元內(nèi)情向量局部變量SP

012老SPTOP

Display表全局Display3d…00返回地址10(display)2a3x405返回地址62(全局display)70(形參個數(shù))809510主程序P

過程

S

過程

Q

過程

溫馨提示

  • 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

提交評論