资源描述
8.5 8.5 嵌套过程语言的栈式存储分配嵌套过程语言的栈式存储分配 (PASCALPASCAL语言)语言)8.5.1 8.5.1 语言特性:语言特性:.过程允许递归调用;过程允许递归调用;.可变数组;可变数组;.过程嵌套定义;过程嵌套定义;(内层过程可引用外层过程定义的名字内层过程可引用外层过程定义的名字)层数:过程定义的嵌套层次;层数:过程定义的嵌套层次;约定:主程序的层数约定:主程序的层数=0=0;P P中定义中定义:Q,R:Q,R,若若P P的层数的层数=n,=n,则:则:Q Q的层数的层数=n+1=n+1;R R的层数的层数=n+1=n+1;称:称:P P 是是 Q Q,R R 的直接外层过程,的直接外层过程,Q,R Q,R 是是P P的内层过程的内层过程 Q,R Q,R 是同层的过程是同层的过程 Proc PProc QProc RProgram P;var a,x:integer;procedure Q(b:integer);var i:integer;procedure R(u:integer;var v:integer);var c,d:integer;begin if u=1 then R(u+1,v);v:=(a+c)*(b-d)+i;L处处 end;R begin R(1,x);end;Q procedure S;var c,i:integer;begin a:=1;Q(c);end;S begin a:=0;S;end;P,主程序主程序0层层1层层2层层1层层名字的作用域名字的作用域a,a,x xb,b,i iu,u,v,v,c,c,d dc,ic,i值参值参 变参变参L L处:处:PSPSQRQR1 1RR2 2数据区数据区TOPR2c,dSPR1Qb,iSPa返回返回pascalpascal子程序的调用规定:子程序的调用规定:任何子程序都不能调用主程序。任何子程序都不能调用主程序。任何子程序(包括主程序)可调用自己的直接内任何子程序(包括主程序)可调用自己的直接内 层子程序,但不能调用隔层的内层子程序。层子程序,但不能调用隔层的内层子程序。(图图1)1)子程序可以调用自己,以及它的任何一层外层子子程序可以调用自己,以及它的任何一层外层子 程序(不包括主程序)。(图程序(不包括主程序)。(图2 2)P1P2Call P2 P P1 1调用调用P P2 2 P P2 2是是P P1 1的直接内层的直接内层图图1 1 P P2 2调用调用P P0 0 P P0 0是是P P2 2的外层的外层P0P2P1Call P0图图2 2pascalpascal子程序的调用规定:子程序的调用规定:并列子程序中后说明的可以调用先说明的,而先并列子程序中后说明的可以调用先说明的,而先 说明的不能调用后说明的说明的不能调用后说明的(除非采用向前引用)。(除非采用向前引用)。一个子程序可以调用所有与自己的某个外层子程一个子程序可以调用所有与自己的某个外层子程 序并列的子程序(其说明先于这个外层子程序)。序并列的子程序(其说明先于这个外层子程序)。P0P1P2Call P2P P1 1调用调用P P2 2 P P1 1、P P2 2并列并列图图1 1图图2 2P0P2P1Call P1P3 P3调用调用P1 P1与与P3的外层并列的外层并列8.5.2 8.5.2 非局部名字的访问的实现非局部名字的访问的实现TOP临时单元临时单元内情向量内情向量局部变量局部变量形参单元形参单元形参个数形参个数*静态链静态链 返回地址返回地址连接数据连接数据SP动态链动态链(老老SP)SP)/1.1.实现方案实现方案:静态链:静态链活动记录中,加活动记录中,加“静态链静态链”,指向静态直接外层过程的最指向静态直接外层过程的最新新活动记录的地址活动记录的地址(有多次有多次调用时调用时,以最后一次为准以最后一次为准)。数据区数据区TOPR2c,dSPR1Qb,iSPaR R2 2中中:v:=(a+c):v:=(a+c)*(b-d)+i(b-d)+i;要访问要访问b,i(Qb,i(Q),或,或a(Pa(P),),必须必须知道外层过程的活动记录首知道外层过程的活动记录首址,即:址,即:SPSPQ Q ,SPSPP P活活动动记记录录TOP临时单元临时单元内情向量内情向量局部变量局部变量形参单元形参单元 主程序主程序P P没有没有形参个数形参个数静态链静态链 返回地址返回地址连接数据连接数据SP动态链动态链(老老SP)SP)/PASCALPASCAL中,主程序无参数项,所以主程序的活动记录中,主程序无参数项,所以主程序的活动记录中没有形参单元、形参个数。中没有形参单元、形参个数。P P活活动动记记录录x xL=5L=5a a静态链静态链:0:0返回地址返回地址老老SPSP临时单元临时单元内情向量内情向量局部变量局部变量形参单元形参单元形参个数形参个数静态链静态链返回地址返回地址动态链动态链(老老SP)SP)活活动动记记录录格格式式过程过程参数参数局部名局部名P(P(主主)a,xa,xQ Qb bi iR Ru,vu,vc,dc,dS Sc,ic,i Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;PProc PProc PProc QProc QProc RProc RProc SProc S程序结构程序结构Q Q活活动动记记录录i i形参单元形参单元:b:bL=6L=6形参个数形参个数:1:1静态链静态链:SP:SPP P返回地址返回地址老老SPSP临时单元临时单元内情向量内情向量局部变量局部变量形参单元形参单元形参个数形参个数静态链静态链返回地址返回地址动态链动态链(老老SP)SP)活动活动记录记录格式格式过程过程参数参数局部名局部名P(P(主主)a,xa,xQ Qb bi iR Ru,vu,vc,dc,dS Sc,ic,i Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;PR R活活动动记记录录d dc c形参单元形参单元:v:v形参单元形参单元:u:uL=8L=8形参个数形参个数:2:2静态链静态链:SP:SPQ Q返回地址返回地址老老SPSP临时单元临时单元内情向量内情向量局部变量局部变量形参单元形参单元形参个数形参个数静态链静态链返回地址返回地址动态链动态链(老老SP)SP)活动活动记录记录格式格式过程过程参数参数局部名局部名P(P(主主)a,xa,xQ Qb bi iR Ru,vu,vc,dc,dS Sc,ic,i Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;P临时单元临时单元内情向量内情向量局部变量局部变量形参单元形参单元形参个数形参个数静态链静态链返回地址返回地址动态链动态链(老老SP)SP)活动活动记录记录格式格式过程过程参数参数局部名局部名P(P(主主)a,xa,xQ Qb bi iR Ru,vu,vc,dc,dS Sc,ic,iS S活活动动记记录录i ic cL=6L=6形参个数形参个数:0:0静态链静态链:SP:SPP P返回地址返回地址老老SPSP Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;PP P活动记录活动记录x xa a静态链静态链:0:0返回地址返回地址老老SPSPQ Q活动记录活动记录i i形参单元形参单元:b:b形参个数形参个数:1:1静态链静态链:SP:SPP P返回地址返回地址老老SPSPR R活动记录活动记录d dc c形参单元形参单元:v:v形参单元形参单元:u:u形参个数形参个数:2:2静态链静态链:SP:SPQ Q返回地址返回地址老老SPSPS S活动记录活动记录i ic c形参个数形参个数:0:0静态链静态链:SP:SPP P返回地址返回地址老老SPSP Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;P过程过程参数参数局部名局部名L LP Pa,xa,x5 5Q Qb bi i6 6R Ru,vu,vc,dc,d8 8S Sc,ic,i6 6Proc PProc PProc QProc QProc RProc RProc SProc S程序结构程序结构过程过程L LP P5 5Q Q6 6R R8 8S S6 6老老SPSP:调用本过程时,调:调用本过程时,调 用者的用者的SP;(SP;(动态链动态链)静态链:本过程直接外层静态链:本过程直接外层 过程的最新过程的最新SPSP;静态链静态链动态链动态链TOP 32R2静态链静态链=SPQ=11SP 25老老SP=SPR1=1724R1静态链静态链=SPQ=1117老老SP=SPQ=1116Q静态链静态链=SPP=011老老SP=SPS=510S静态链静态链=SPP=05老老SP=SPP=04P静态链静态链=00老老SP=0调用顺序:调用顺序:PSQRPSQR1 1RR2 2访问访问b(Qb(Q):):=SP =SPQ Q=4SP=4SPQ Q 访问访问a(Pa(P):):=SP =SPQ Q=SP=SPP P=3SP=3SPP P 缺点:访问速度慢。缺点:访问速度慢。静态链静态链动态链动态链TOP 32R2静态链静态链=SPQ=11SP 25老老SP=SPR1=1724R1静态链静态链=SPQ=1117老老SP=SPQ=1116Q静态链静态链=SPP=011老老SP=SPS=510S静态链静态链=SPP=05老老SP=SPP=04P静态链静态链=00老老SP=0Proc PProc PProc QProc QProc RProc RProc SProc S程序结构程序结构过过程程参参数数局部局部名名P Pa,xa,xQ Qb bi iR R u,vu,v c,dc,dS Sc,ic,i2.2.实现方案实现方案:DISPLAYDISPLAY表(嵌套层次显示表)表(嵌套层次显示表).引入引入DISPLAYDISPLAY表表 设过程设过程P,P,层数层数n nP P,D D表有:表有:n nP P+1+1项项第第n nP P 层层,最新活动记录的首址最新活动记录的首址=SPP P第第1层,最新活动记录的首址层,最新活动记录的首址SP第第0层,最新活动记录的首址层,最新活动记录的首址SPR R的的DISPLAYDISPLAY表表SPR R2SPQ Q1SPP P 0Proc PProc PProc QProc QProc RProc RProc SProc S程序结构程序结构过程过程 层数层数P P0 0Q Q1 1R R2 2S S1 1第第n nP P 层层,最新活动记录的首址最新活动记录的首址=SPP P第第1层,最新活动记录的首址层,最新活动记录的首址SP第第0层,最新活动记录的首址层,最新活动记录的首址SP调用顺序:调用顺序:PSQRPSQR1 1RR2 2数据区数据区R2R1QSPR2 2 D D表表SPR2R22SPQ Q1SPP P 0Proc PProc PProc QProc QProc RProc RProc SProc S程序结构程序结构过程过程 层数层数P P0 0Q Q1 1R R2 2S S1 1名字地址名字地址=DISPLAY=DISPLAY静态层数静态层数 +相对数相对数访问访问b(Qb(Q):):=DISPLAY1+=DISPLAY1+相对数相对数 =相对数相对数SPSPQ Q 访问访问a(Pa(P):):=DISPLAY0+=DISPLAY0+相对数相对数 =相对数相对数SPSPP P 数据区数据区R2R1QSPR2 2 D D表表SPR2R22SPQ Q1SPP P 0Proc PProc PProc QProc QProc Proc R RProc SProc S过程过程层数层数参数参数 局部名局部名P P0 0a,xa,xQ Q1 1b bi iR R2 2u,vu,vc,dc,dS S1 1c,ic,i调用顺序:调用顺序:PSQRPSQR1 1RR2 2.活动记录活动记录格式:格式:其中:其中:*为新增项为新增项全局全局DISPLAY:指向调用者的:指向调用者的 DISPLAY表的位置;表的位置;DISPLAY表:本过程的表:本过程的嵌套层嵌套层 次显示表;次显示表;主程序没有主程序没有:参数项,参数项,全局全局DISPLAYDISPLAY。临时单元临时单元内情向量内情向量局部变量局部变量*DISPLAYDISPLAY表表形参单元形参单元 形参个数形参个数*全局全局DISPLAYDISPLAY返回地址返回地址动态链动态链(老老SP)SP)连连接接数数据据 过程的层数是静态确定的,过程的层数是静态确定的,D D表的大小是静态确定的(表的大小是静态确定的(=层数层数+1+1)。)。又又 过程的形参单元的数目在编译时是可以确定的,过程的形参单元的数目在编译时是可以确定的,D D表的相对地址表的相对地址d d也是静态确定的。也是静态确定的。返回返回P1PCall Pa)a)子程序可调用自己的直接内层子程序子程序可调用自己的直接内层子程序 则层数:则层数:n nP P =n nP1 P1+1 +1 P P的的D D表中,共有表中,共有n nP P+1+1项,项,P P的直接外层是的直接外层是P P1 1,“P“P的的D D表前表前n nP P项项”与与“P P1 1的的D D表表”相相同同.构造构造DISPLAYDISPLAY表表PASCALPASCAL的过程调用,有的过程调用,有4 4种情况:种情况:即:即:D DP P=D=DP1 P1+SP+SPP P =D=DP1P1前前n nP P项项 +SP+SPP P =调用者调用者D D表的前表的前n nP P项项+SP+SPP P全局全局DISPLAY:指向调用者的指向调用者的 D表的位置表的位置 P P1 1调用调用P P P P是是P P1 1的的 直接内层直接内层b)b)子程序可以调用自己,子程序可以调用自己,以及它的任何一层外层子程序以及它的任何一层外层子程序P P的的D D表中,共有表中,共有n nP P+1+1项,项,P P是是P P2 2的外层,的外层,“P“P的的D D表前表前n nP P项项”与与“P P2 2的的D D表前表前n nP P项项”相同相同即:即:D DP P=D=DP2P2前前n nP P项项 +SP+SPP P =调用者调用者D D表的前表的前n nP P项项+SP+SPP P全局全局DISPLAY:指向调用者的指向调用者的 D表的位置表的位置 P P2 2调用调用P P P P是是P P2 2的外层的外层PP2P1Call PP0P1PCall Pc)c)并列子程序中后说明的调用先说明的并列子程序中后说明的调用先说明的 层数:层数:n nP P=n=nP1P1=n=nP0P0+1+1 P P的直接外层是的直接外层是P P0 0,P P的的D D表前表前n nP P项项 与与 P P0 0的的D D表表 相同,相同,即:即:D DP P=D=DP0P0+SP+SPP P同理,同理,P P1 1的的D D表前表前n nP1P1项项 与与 P P0 0的的D D表表 相同,相同,即:即:D DP1P1=D=DP0P0+SP+SPP1P1 D DP P=D=DP0P0+SP+SPP P =D=DP1P1前前n nP P项项+SP+SPP P =调用者调用者D D表的前表的前n nP P项项+SP+SPP P全局全局DISPLAY:指向调用者的指向调用者的 D表的位置;表的位置;P P1 1调用调用P P P P1 1、P P并列并列d)d)子程序调用与自己的某个外层子程序调用与自己的某个外层 子程序并列的子程序子程序并列的子程序 P P的的D D表中,共有表中,共有n nP P+1+1项,项,其中前其中前n nP P项与项与 P P0 0的的D D表表 相同,相同,即:即:D DP P=D=DP0P0+SP+SPP P又又 P P0 0也是也是也是也是P P3 3的直接外层,的直接外层,P P3 3的的D D表的前表的前n nP P项项 与与 P P0 0的的D D表表相同相同 D DP P=D=DP0P0+SP+SPP P =D=DP3P3前前n nP P项项+SP+SPP P =调用者调用者D D表的前表的前n nP P项项+SP+SPP P全局全局DISPLAY:指向调用者的指向调用者的 D表的位置;表的位置;P0P2PCall PP3P3调用调用PP与与P3的外层并列的外层并列若有过程:若有过程:P P,Q Q,R R P P调用调用Q Q ,Q Q递归调用自己递归调用自己m m次,次,Q Q调用调用R R,则有:则有:D DQ1 Q1=D=DP P前前n nQ Q项项+SP+SPQ1Q1 D DQ2 Q2=D=DQ1Q1前前n nQ Q项项+SP+SPQ2 Q2=D=DP P前前n nQ Q项项+SP+SPQ2Q2 D DQmQm =D=DQm-1Qm-1前前n nQ Q项项+SP+SPQmQm =D=DP P前前n nQ Q项项+SP+SPQmQm DQ DQm+1 m+1=D=DQmQm前前n nQ Q项项+SP+SPQm+1Qm+1=D=DP P前前n nQ Q项项+SP+SPQm+1Qm+1 D DR R=D=DQm+1Qm+1前前n nR R项项+SP+SPR R过程过程层数层数D D表项数表项数P Pn nP Pn nP P +1+1Q Qn nQ Qn nQ Q +1+1R Rn nR Rn nR R +1+1临时单元临时单元内情向量内情向量局部变量局部变量DisplayDisplay表表形参单元形参单元形参个数形参个数全局全局DisplayDisplay返回地址返回地址动态链动态链(老老SP)SP)活动活动记录记录格式格式过程过程 层数层数 参数参数 局部名局部名L LP P0 0a,xa,x5 5Q Q1 1b bi iR R2 2u,vu,vc,dc,dS S1 1c,ic,i Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;PP P活活动动记记录录x xL=5L=5a aSPSPP PD D表表返回地址返回地址老老SPSP主程序主程序没有没有 Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;Pi iSPSPQ QD D表表SPSPP P形参单元形参单元:b:b形参个数形参个数:1:1全局全局DisplayDisplay返回地址返回地址老老SPSPL=8L=8过程过程 层数层数 参数参数 局部名局部名L LP P0 0a,xa,x5 5Q Q1 1b bi i8 8R R2 2u,vu,vc,dc,dS S1 1c,ic,iQ活活动动记记录录局部变量局部变量/内情向量内情向量/临时单元临时单元DisplayDisplay表表形参个数、形参单元形参个数、形参单元全局全局DisplayDisplay返回地址返回地址动态链动态链(老老SP)SP)活动活动记录记录格式格式局部变量局部变量/内情向量内情向量/临时单元临时单元DisplayDisplay表表形参个数、形参单元形参个数、形参单元全局全局DisplayDisplay返回地址返回地址动态链动态链(老老SP)SP)活动活动记录记录格式格式 Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;Pd dc cSPSPR RD D表表SPSPQ QSPSPP P形参单元形参单元:v:v形参单元形参单元:u:u形参个数形参个数:2:2全局全局DisplayDisplay返回地址返回地址老老SPSP过程过程 层数层数 参数参数 局部名局部名L LP P0 0a,xa,x5 5Q Q1 1b bi i8 8R R2 2u,vu,vc,dc,d1111S S1 1c,ic,iR活活动动记记录录局部变量局部变量/内情向量内情向量/临时单元临时单元DisplayDisplay表表形参个数、形参单元形参个数、形参单元全局全局DisplayDisplay返回地址返回地址动态链动态链(老老SP)SP)活动活动记录记录格式格式 Program P;Program P;var var a,x a,x:integer;:integer;procedure Q(b procedure Q(b););var var i:integer;i:integer;procedure R(u,v procedure R(u,v););var var c,d:integer;c,d:integer;begin end;R begin end;R begin end;Q begin end;Q procedure S;procedure S;var var c,i:integer;c,i:integer;begin end;S begin end;S begin end;P begin end;Pi ic cSPSPS SD D表表SPSPP P形参个数形参个数:0:0全局全局DisplayDisplay返回地址返回地址老老SPSP过程过程 层数层数 参数参数 局部名局部名 L LP P0 0a,xa,x5 5Q Q1 1b bi i8 8R R2 2u,vu,vc,dc,d1111S S1 1c,ic,i8 8S活活动动记记录录P P活动记录活动记录x xa aSPSPP PD D表表返回地址返回地址老老SPSPL=5L=5Q Q活动记录活动记录i iSPSPQ QD D表表SPSPP P形参单元形参单元:b:b形参个数形参个数:1:1全局全局DISPLAYDISPLAY返回地址返回地址老老SPSPL=8L=8R R活动记录活动记录d dc cSPSPR RD D表表SPSPQ QSPSPP P形参单元形参单元:v:v形参单元形参单元:u:u形参个数形参个数:2:2全局全局DISPLAYDISPLAY返回地址返回地址老老SPSPL=11L=11S S活动记录活动记录i ic cSPSPQ QD D表表SPSPP P形参个数形参个数:0:0全局全局DISPLAYDISPLAY返回地址返回地址老老SPSPL=8L=8返回返回过程过程 层数层数 参数参数 局部名局部名L LP P0 0a,xa,x5 5Q Q1 1b bi i8 8R R2 2u,vu,vc,dc,d1111S S1 1c,ic,i8 88.5.3 主要处理工作主要处理工作1.过程调用过程调用(红色标注红色标注)中间中间代码代码 par T1 par Tn Call P,n (n:参数个数参数个数)+5+5形式单元形式单元+4+4参数个数参数个数+3+3 全局全局DISPLAYDISPLAY+2+2返回地址返回地址+1+1老老SPSPTOPR1SPQSP P对:对:Par Par Ti (i i=1=1n),n),(i+(i+4 4)TOP:=Addr)TOP:=AddrTi (传地址传地址)或或:(i+(i+4 4)TOP:=)TOP:=Ti (传值传值)对:对:Call P,nCall P,n*1 1TOP:=SP TOP:=SP (保护工作环境保护工作环境)*4 4TOP:=n TOP:=n (参数个数参数个数)*3 3TOP:=TOP:=全局全局DISPLAY=SP+dDISPLAY=SP+d*JSR P JSR P (转子转子)PSQRPSQR1 1RR2 2返回返回2.2.过程进入过程进入(蓝色标注蓝色标注).建立新工作环境建立新工作环境.保护返回地址保护返回地址具体工作:具体工作:*SP:=TOP+1 SP:=TOP+1 (新新SP)SP)*1SP=1SP=返回地址返回地址 *TOP:=TOP+L TOP:=TOP+L (新新TOP)TOP)(L L:活动记录大小,静态确定:活动记录大小,静态确定)*建立本过程的建立本过程的D D表表,若层数若层数=n,=n,从全局从全局displaydisplay地址开始,向地址开始,向 上上n n个单元的内容个单元的内容 抄录到现抄录到现 行活动记录的行活动记录的DISPLAYDISPLAY表中,表中,再添上当前再添上当前SPSP,形成,形成D D表。表。新新TOPDISPLAYDISPLAY表表形式单元形式单元参数个数参数个数全局全局DISPLAYDISPLAY+1+1返回地址返回地址新新SP老老SPSPTOPR R1 1SPQ QS SP P返回返回3.3.数组分配空间数组分配空间 对可变数组,计算每维的上限、下限、维长,对可变数组,计算每维的上限、下限、维长,填入内情向量;填入内情向量;将将TOP+1TOP+1填入数组内情向量的填入数组内情向量的a a处处(起始地址起始地址);设数组大小设数组大小=M,TOP:=TOP+M ;4.4.引用各种数据的方式引用各种数据的方式 参数、局部量、临时单元、内情向量:参数、局部量、临时单元、内情向量:设相对数设相对数=x,以,以SPSP为变址器访问:为变址器访问:xSPxSP 数组元素数组元素 *从内情向量查出从内情向量查出a a,C C,维长等,计算出相对数,维长等,计算出相对数x x;*变址访问变址访问 xaxa 非局部量:非局部量:设:相对数设:相对数=x,所在层数所在层数=k=k,D D表的相对数表的相对数=d,(,(dSP:活动记录起始地址活动记录起始地址)LD R1,(d+k)SP (第第k k层过程的最新活动记录的层过程的最新活动记录的SPSP)LD R2,xR1 (取出值传送到取出值传送到R2)5.5.过程返回过程返回 (与(与C C相同)相同)中间代码:中间代码:proc 过程名过程名 过程体过程体 return(m)endproc过程返回过程返回*由由return引起引起*过程结束自然返回过程结束自然返回 过程返回值存入特定位置过程返回值存入特定位置 恢复老的工作环境恢复老的工作环境 TOP:=SP-1TOP:=SP-1 SP:=0SP SP:=0SP 按返回地址转移按返回地址转移 X:=2TOP X:=2TOP (返回地址)(返回地址)UJ 0X UJ 0X (无条件转移)(无条件转移)TOPDISPLAYDISPLAY表表形式单元形式单元参数个数参数个数全局全局DISPLAYDISPLAY+1+1返回地址返回地址SP老老SPSPTOPR1SPQSP P过程过程L LP P5 5Q Q8 8R R1111S S8 8示例程序示例程序活动记录活动记录13TOP 12Si11c105D表表9080参数个数参数个数72全局全局Display6返回地址返回地址SP 50老老SPTOP 4Px3a20D表表1返回地址返回地址SP 00老老SP调用:调用:PSPS过程调用过程调用过程进入过程进入返回返回TOP20Qi1913D表表18017b参数参数161参数个数参数个数159全局全局Display14返回地址返回地址SP135老老SPTOP12Si11c105D表表9080参数个数参数个数72全局全局Display6返回地址返回地址SP 50老老SP4P 0调用:调用:PSQPSQ示例程序示例程序活动记录活动记录返回返回过程调用过程调用过程进入过程进入过程过程L LP P5 5Q Q8 8R R1111S S8 8TOP 31R R1 1d30c2921D表表281327026v参数参数25u参数参数242参数个数参数个数2318全全Display22返回地址返回地址SP 2113老老SPTOP 20Qi1913D表表18017b参数参数调用:调用:PSQRPSQR1 116Q1参数个数参数个数159全全Display14返回地址返回地址SP135老老SP12S54P 0示例程序示例程序活动记录活动记录过程调用过程调用过程进入过程进入TOP42 R R2 2d41c4032D表表391338037v参数参数36u参数参数352参数个数参数个数3427全全Display33返回地址返回地址SP3221老老SPTOP31R R1 1d30c2921D表表2813270调用:调用:PSQRPSQR1 1RR2 226R R1 1v参数参数25u参数参数242参数个数参数个数2318全全Display22返回地址返回地址SP2113老老SP20Q1312S54P 0TOP42 R R2 2d41c4032D表表+7 3913+6 380+5 37v参数参数+4 36u参数参数+3 352参数个数参数个数+2 3427全全Display+1 33返回地址返回地址SP3221老老SP31R R1 12120Q1312S54P0调用:调用:PSQRPSQR1 1RR2 2访问访问b(Q):相对数相对数x=4,Q层数层数 k=1,现行现行D表相对表相对SP d=6,当前当前SP=32,LD R1,(6+1)SP /*R1=13*/LD R2,4R1 /*取出取出b*/Q数据区数据区命令:命令:LD R1,(d+k)SP LD R2,xR1 TOP42 R R2 2d41c4032D表表+7 3913+6 380+5 37v参数参数+4 36u参数参数+3 352参数个数参数个数+2 3427全全Display+1 33返回地址返回地址SP3221老老SP31R R1 12120Q1312S54P0调用:调用:PSQRPSQR1 1RR2 2访问访问a(P):相对数相对数x=3,P层数层数 k=0,现行现行D表相对表相对SP d=6,当前当前SP=32,LD R1,(6+0)SP /*R1=0*/LD R2,3R1 /*取出取出a*/P数据区数据区命令:命令:LD R1,(d+k)SP LD R2,xR1 作业:作业:P268 P268 第第 4 4 题题 函数函数F F中,增加一个动态数组,即:中,增加一个动态数组,即:FUNCTION F(n:integer):integer;FUNCTION F(n:integer):integer;var var M1.n:integer;M1.n:integer;begin begin end;end;
展开阅读全文