int bar(x,y){ int i; } int foo(a,b){ int c,d; } int main(){ foo(aa,bb); } 各場合におけるsp,bp,stackの状態 prog開始時 sp,bp v [] main内foo呼び出し直前 bp sp v v [n,n,n] foo開始時 bp sp v v [n,n,n,z,bb,aa,BP,ret,c,d] z :戻り値格納場所 aa,bb:arg BP :foo呼出前のBP位置 ret :return adr c,d :local var local_var/argアクセス arg1(aa) LDA -1[BP] arg2(bb) LDA -2[BP] local1(c) LDA 2[BP] local2(d) LDA 3[BP] call foo 手順 main v(BP0) [n,n,n] LEASP 1[SP] (sp=sp+1,戻値格納場所) [n,n,n,z] (push arg) (aa,bb) [n,n,n,z,bb,aa] PUSH [n,n,n,z,bb,aa,BP0] v(BP1) LEABP [SP] (bp=sp) [n,n,n,z,bb,aa,BP0] CALL foo (push ret_adr) [n,n,n,z,bb,aa,BP0,ret] foo LEASP 2[SP] (sp=sp+2,local_var数) [n,n,n,z,bb,aa,BP0,ret,c,d] LDA -3[BP] [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3] call bar foo v(BP1) [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n] LEASP 1[SP] [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,z] (push arg) (xx,yy) [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,z,yy,xx] PUSH [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,z,yy,xx,BP1] v(BP2) LEABP [SP] [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,z,yy,xx,BP1] CALL bar [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,z,yy,xx,BP1,ret] bar LEASP 1[SP] (i) [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,z,yy,xx,BP1,ret,i] LDA -3[BP] [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,z,yy,xx,BP1,ret,i,BP2-3] return bar bar v(BP2) [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,z,yy,xx,BP1,ret,i,BP2-3,v] STS ((BP-3)=ret_value) [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,v,yy,xx,BP1,ret,i,v] DEL [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,v,yy,xx,BP1,ret,i] LEASP 1[BP] (i) [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,v,yy,xx,BP1,ret] RET [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,v,yy,xx,BP1] foo v(BP1) POP [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,v,yy,xx] LEASP -2[SP](xx,yy) [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,n,n,v] return foo 手順 foo v(BP1) [n,n,n,z,bb,aa,BP0,ret,c,d,BP1-3,v] STS ((BP-3)=ret_value) [n,n,n,v,bb,aa,BP0,ret,c,d,v] DEL [n,n,n,v,bb,aa,BP0,ret,c,d] LEASP 1[BP] (c,d) [n,n,n,v,bb,aa,BP0,ret] RET [n,n,n,v,bb,aa,BP0] main v(BP) POP [n,n,n,v,bb,aa] LEASP -2[SP](aa,bb) [n,n,n,v]