📄 8.2.2.htm
字号:
<html>
<head>
<title>编译原理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link type="text/css" rel="stylesheet" href="../css/specification.css">
</head>
<body>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.2.1b.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.2.2b.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>8.2.2 栈式分配管理</b></font>
<table><tr><td>    </td>
<td class="content">
<P>通过对活动记录的存储单元使用相对地址,静态分配可以改造成栈式分配。在栈式分配中,一个过程的活动记录位置直到运行时刻方才知晓,这个位置常被存放在一个寄存器中,从而活动记录中的字可以通过对此寄存器中值的偏移值来存取。具体实现上,采取目标机器的索引地址方式是很方便的。
<P>一个活动记录中的偏移地址可看成此活动记录中对已知位置的偏移值,如我们在6.2节所看到的那样。我们在一个寄存器SP中保存一个指向栈顶活动记录开始的指针。当发生过程调用时,调用过程给SP一个增量,同时将控制转移到被调用过程;当控制返回到调用过程时,再将SP减去原来的增量,从而释放了被调用过程的活动记录。
<P>第一个过程的代码通过将SP置为存储器中栈区的开始位置来初始化栈:
<P align=left>
MOV #stackstart,SP <font color="#008000">/*初始化栈*/</font><br>
第一个过程的代码<br>
HALT
<font color="#008000"> /*终止过程运行*/</font><br>
一个过程调用序列给SP一个增量,并存储返回地址及将控制转移到被调用过程:</P>
<p>ADD #caller.recordsize,SP<font color="#008000"> /*将调用过程的活动记录的长度<br> 加入到SP中*/</font>
<p>MOV #here+16,*SP<font color="#008000"> /*存储返回地址*/</font>
<p>GOTO callee.code-area<font color="#008000"> /*转移到被调用过程的代码的<br>
第一条指令*/</font><br>
</td></tr></table>
<p>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.2.1b.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.2.2b.htm'"></img></td>
</tr>
</table>
</BODY>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -