【正文】
(返回地址,寄存器值??) 實(shí)參 (形式單元)和參數(shù)個(gè)數(shù) S P 控制鏈 (老 SP ) TOP R 的數(shù)組區(qū) S P R 的活動(dòng)記錄 Q 的活動(dòng)記錄 主程序全局 數(shù)據(jù)區(qū) 嵌套過程語言的棧式 分配方案 ? 主要特點(diǎn) : ?(語言)一個(gè)過程可以引用包圍它的任一外層過程所定義的標(biāo)識(shí)符(如變量,數(shù)組或過程等)。 ?? R end /* R*/ proc P (a)。 integer m,n。 end。 例如:如果有一個(gè)從第 5層分程序轉(zhuǎn)出到達(dá)第 1層分程序的標(biāo)號(hào) L,雖然在第 5層分程序工作時(shí)知道 L所屬的層數(shù),我們極易從DISPLAY中獲得第 1層分程序的活動(dòng)記錄基址( SP),但是怎么知道第 1層分程序進(jìn)入時(shí)的 TOP呢?唯一的辦法是從 5,4,3和2各層順序退出。而過程體分程序(假定是一個(gè)分程序)當(dāng)作是它所管轄的第 1層分程序。 ( b) 進(jìn) 入 分 程 序 B1。 a[j]:=x (5) end。 (10)begin (11) a:=1。 swap(a,b); 其結(jié)果: a,b調(diào)用前的值不改變。 其結(jié)果等價(jià)于執(zhí)行下列運(yùn)算: x :=a; y :=b; temp :=x; x :=y; y :=temp 傳地址 的實(shí)現(xiàn) ( call by reference )(callbyaddress)(callbylocation) 把實(shí)在參數(shù)的地址傳遞給相應(yīng)的形參,即 調(diào)用過程把一個(gè)指向?qū)崊⒌拇鎯?chǔ)地址的指針傳遞給被調(diào)用過程相應(yīng)的形參: 1實(shí)在參數(shù)是一個(gè)名字,或具有左值的表達(dá)式 傳遞左值 2實(shí)在參數(shù)是無左值的表達(dá)式 計(jì)算值,放入一存儲(chǔ)單元,傳此存儲(chǔ)單元地址 3目標(biāo)代碼中,被調(diào)用過程對(duì)形參的引用變成對(duì)傳遞給被調(diào)用過程的指針的間接引用 procedure swap( x,y:integer)。 *y=temp。 begin m:=3。 ? (2)procedure b(function h(n:integer):integer)。 ? (9)begin ? (10) c ? (11)end 圖 1027 嵌套過程作為參數(shù)傳遞 p ar am c 存取鏈 m b f . 存取鏈圖 10 28 連同存取鏈一起 傳遞過程實(shí)參 各種數(shù)據(jù)對(duì)象的存儲(chǔ)分配 數(shù)據(jù)對(duì)象 name 名字,名稱 type 類型 location 內(nèi)存地址 value 值 ponent 成分 除實(shí)參是過程情況外,還有實(shí)參為數(shù)組,實(shí)參為標(biāo)號(hào)等情況。 ? (4)procedure c。 procedure c。 (8) swap(a,b)。 begin temp:=x。 ? ,并將其放在對(duì)應(yīng)形式單元開辟的空間中。 (12) swap(a,b)。 (2)var a,b:integer。 數(shù) 組 C 數(shù) 組 C 數(shù) 組 B 數(shù) 組 B C 的 向 量 內(nèi) 情 eB5的 T O PC 的 內(nèi) 情 向 量B4的 T O PB4 的 T O PB 的 內(nèi) 情 向 量B 的 內(nèi) 情 向 量 z Z B1的 T O PB1 的 T O P D I S P L A YD I S P L A Y 形式單元 m , n 2 形式單元 m , n 2連接數(shù)據(jù)連 接 數(shù) 據(jù) A 的 T O PA 的 T O P ∶ ∶ ∶ ∶ ( e ) ( f)( e ) 進(jìn)入分程序 B4分配數(shù)組 C 之后; ( f ) 進(jìn)入分程序 B5 。 ,共四項(xiàng): ( 1)老 SP值; ( 2)返回地址; (3)全局 DISPAY地址; ( 4)調(diào)用時(shí)的棧頂單元地址,老 TOP。 為了解決上述問題,可采取兩種措施。 分程序結(jié)構(gòu)的存儲(chǔ)配方案 處理分程序結(jié)構(gòu)存儲(chǔ)分配方案的一種簡(jiǎn)單辦法是,把分程序看成 “無參過 程”,它在哪里定義就在哪