⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8.5.2.htm

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 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.5.1.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.5.2b.htm'"></img></td>
</tr>
</table>
<br><br>

<font class="title2"><b>8.5.2 代码生成算法</b></font>        
<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content" >
<P>现在我们介绍一个基本块的代码生成算法。它把构成一个基本块的三地址语句序列作为输入。为简单起见,假设基本块中每个三地址语句形如x:=y op z。如果基本块中含有其它形式的三地址语句,也不难仿照下述算法写出对应的算法。基本块的代码生成算法如下:</P>    
<P>对每个形如i:x:=y op z 的三地址语句,依次执行下述步骤:</P>    
<P>1. 以三地址语句i:x:=y op z作为参数,调用函数过程getreg(i:x:=y op z),当从getreg返回时,我们得到一个地址L,它将用来存放计算y op z所得的结果。这里的L常常是一个寄存器,但也可能是一个存储单元。我们将在下面描述getreg的细节。</P>    
<P>2. 考虑名字y的地址描述器以确定y',y'为y的值存放的当前位置(或当前位置之一)。若y的值同时在主存中和一个寄存器中,那么y'取寄存器更好。若y的值尚不在L中,则生成指令MOV y',L将y的值复写到L中。</P>    
<P>3. 生成指令op z',L,其中z'为z的值存放的一个当前位置。同样,若z的值同时存放在主存中和一个寄存器中,则取z'为寄存器。然后,更新x的地址描述器以记录x在L中。如果L是一个寄存器,则更新这个寄存器描述器以记录该寄存器存有x的值。</P>    
<P>4. 如果y和/或z的当前值没有下次引用,在基本块的出口又是非活跃的(一般由三地址语句i上的附加信息知道),并且是在寄存器中,则更新y的和/或z的寄存器描述器和地址描述器以表示,在执行语句i:x:=y op z之后,这些寄存器不再包含y和/或z的值。</P>    
<P>如果当前的三地址语句的算符为一目运算,则可作类似的处理,另一个重要的特殊情况是复写语句x:=y。首先,如果y是在一个寄存器中,只需简单地更新寄存器和地址描述器以记录x的值仅在保存y的那个寄存器中,如果y没有下次引用且在基本块的出口是非活跃的,则该寄存器不再保留y的值,其次,如果y是在主存中,我们使用getreg函数来获得一个寄存器用来存入x的值,并把此寄存器地址作为x的地址。</P>

</td></tr></table>


  

<br>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.5.1.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.5.2b.htm'"></img></td>
</tr>
</table>

</BODY>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -