📄 8.2.3.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.2d.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.3.1.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>8.2.3 名字的运行地址</b></font>
<table><tr><td>    </td>
<td class="content">
<P>存储分配策略和过程的活动记录中局部数据的安排决定了如何对名字存取。在第七章,我们已假定一条三地址语句中的名字实际上是指向符号表中相应该名字表项的指针。
<BR> 无论如何,名字最终会被存取地址的代码所取代。我们考虑简单的三地址语句x:=0的一些细节。当处理一个过程的说明语句时,假定有关x的表项包含一个x的相对地址12。首先,考虑x是在一个从地址static开始的静态分配区域中。则x的实际地址应为static+12。尽管编译器最终可在编译时间确定siatic+l2的值,但是,当存取名字的中间化码生成的时候,静态区域的位置并不知晓。在这样的情形下,它必须产生三地址代码以“计算”static+12,该计算将在代码生成时进行,或者在程序运行前由装配程序执行。因此,赋值x:=0被翻译成:</P>
<P align=left>
static [12]:=0<br>
如果静态区域是从地址100开始则上述语句的目标代码为:</P>
<P align=left>
MOV #0,112 </P>
<P>另一方面,假定我们的语言类似Pascal,并且如第六章所讨论的那样用一个display表存取非局部名字,又假定该display表是存放在一些寄存器中,并且x是局部于一个活动记录的变量,该活动记录的display表指针在寄存器R3中,那么,找们可以将语句x:=0翻译成为如下三地址语句;</P>
<P align=left>
t<SPAN class=down><sub>1</sub></SPAN>: =12+R<SPAN class=down><sub>3</sub></SPAN> <BR> *t<SPAN
class=down><sub>1</sub></SPAN>:=0<br>
其中t<SPAN class=down><sub>1</sub></SPAN>中存放的是x的地址。这个序列可由如下机器指令来实现:</P>
<P align=left>
MOV #0,12(R<SPAN
class=down><sub>3</sub></SPAN>)<br>
注意在寄存器R3中的值不能在编译时间确定。</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.2d.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.3.1.htm'"></img></td>
</tr>
</table>
</td></tr></table>
</BODY>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -