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

📄 8.5.2b.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.2.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.5.2c.htm'"></img></td>
</tr>
</table>
<br><br>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content" >
<P>一旦我们处理完一个基本块的所有三地址语句,我们就使用MOV指令存储那些在基本块的出口处是活跃的并且还不在它的存储单元中的名字的值。为进行这一工作,我们使用寄存器描述器来确定哪些名字的当前值仍保留在寄存器中,使用地址描述器来确定其中哪些名字的当前值还不在它的存储单元里,使用活跃变量信息来确定是否需要存储其当前值。</P>
<P><font class="definition2">函数getreg</font></P>
<P>函数getreg是一个函数过程,getreg(i:x:=y op     
z)给出一个寄存器或内存单元地址L,用来存放x的当前值。本节,基于上节介绍中所收集的下次引用信息,讨论一个实现此函数的简单方法。</P>
<P>(1)如果名字y的值是在一个寄存器中,且该寄存器不保留其它任何名字的值(考虑到复写指令x:=y可能引起一个寄存器同时保留两个或更多个名字的值),并且在执行x:=y     
op z以后y为“非活跃”“无下次引用”,那么就返回y的寄存器作为L,并更新 <BR>y的地祉描述器以表示y已不在L中。</P>    
<P>(2)如果(1)失败,则当有空寄存器时就返回一个这样的寄存器作为L。</P>
<P>(3)如果(2)失败,若x在该基本块中有一个下次引用,或者op是一个需要寄存器的算符,例如变址操作,则找一个已被占用的寄存器R。如果R的值尚未在存储单元中,则将R的值存放到一个单元M中(通过指令MOV     
R,M来实现),并且更新地址描述器为M。如果R同时保存了几个变量的值,则对每个需要存储的变量值都应生成一条MOV指令。</P>
<P>(4)如果x在该基本块中不再被引用,或者没有找到合适的被占用的寄存器,则选择x的存储单元作为L。</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.2.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.5.2c.htm'"></img></td>
</tr>
</table>

</BODY>

⌨️ 快捷键说明

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