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

📄 machine_note.htm.bak

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 BAK
📖 第 1 页 / 共 2 页
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>New Page 3</title>
<style>
.unnamed1 {  font-family: "宋体"; font-size: 9pt; text-decoration: none; color: #666666}
body {  font-family: "宋体", "仿宋_GB2312", "楷体_GB2312"; font-size: 9pt}
tr {  font-family: "宋体", "仿宋_GB2312", "楷体_GB2312"; font-size: 9pt}
body {
background-color:#FFFFFF;
SCROLLBAR-FACE-COLOR: #f0f0f0;
SCROLLBAR-HIGHLIGHT-COLOR: #ffffff;
SCROLLBAR-SHADOW-COLOR: #339966;
SCROLLBAR-3DLIGHT-COLOR: #339966;
SCROLLBAR-ARROW-COLOR: #000000;
SCROLLBAR-TRACK-COLOR: #f0f0f0;
SCROLLBAR-DARKSHADOW-COLOR: #ffffff
}
a { text-transform: none; text-decoration: none }
-->
</style>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>

<body>

<h2>说明</h2>

<p><a name="variable说明">1</a>. 过程Variable(Level,Displ:integer)说明</p>

<pre>   输入:Level,
            若为值参,则Level=0;
            若为变量,则Level=当前访问变量的过程的层数-被访问变量所在过程的层数;
         Displ,
            值参或变量的偏移量。(参数的偏移为负)
   说明:
      这个过程是用于将值参或变量的地址放于栈顶。具体代码如下:

       s:=s+1;                               { 移动栈顶指针 }
       x:=b;
       while level&gt;0 do begin              |
                           x:=st[x];          | 
                           level:=level-1;    |  { 沿访问链寻找 } 
                           end;               |
       st[s]:=x+displ;                       { 被访问变量的地址放于栈顶 } 
       p:=p+3;                               { p指向下一条指令 }

<a
name="varparam说明">2. </a>过程VarParam(Level,Displ:integer)说明      </pre>

<pre>   输入:Level,
             若为变量,则Level=当前访问变量的过程的层数-被访问变量所在过程的层数;
         Displ,
             值参或变量的偏移量。
   说明:
      这个过程是用于将变参的地址放于栈顶。变参与值参的不同在于变参传递的是地址而不是数值。
      具体代码如下,大部分与上一个过程相同:

        s:=s+1;
        x:=b;
        while level&gt;0 do begin
                            x:=st[x];
                            level:=level-1;
                            end;
        st[s]:=st[x+displ];     { x+displ处存放的是被访问变参的地址,st[x+displ]得到变参的地址 }
        p:=p+3;

<a
name="index说明">3. </a>过程Index(Lower,Upper,Length,LineNo:integer)说明</pre>

<pre>   输入:Lower,
              数组的下标下界;
         Upper,
              数组的下标上界;
          Length,
              组成数组的元素的长度;
          LineNo,
              数组访问语句所在行的行号。
   说明:
      这个过程用于求数组中某个下标对应的变量地址于栈顶。在执行这个命令之前,栈顶依次存放着要访问
   的下标和数组的首址。具体代码如下:

       i:=st[s];                              { 取得下标 }
       s:=s-1;                                { 移动栈顶指针 }
       if (i&lt;lower) or (i&gt;upper) then         { 判断下标是否越界 }  
              error(lineno,'Range error')
       else st[s]:=st[s]+(i-lower)*length;    { st[s]为数组首址,这个语句求得下标变量的地址于栈顶 } 
       p:=p+5;                                {  p指向下一条语句 }   

<a
name="proccall说明">4</a>. 过程procedure proccall(level,displ:integer)说明</pre>

<pre>   输入:Level,
               level= 调用过程语句所在的过程的嵌套深度-被调用过程的名字的嵌套深度;
         displ,
               被调用过程相对于这条语句的偏移量。
   说明:这条命令执行的功能是过程调用。在它执行之前,如果被调用过程需要参数的话,应该已经将参数
         放置在栈顶;它执行完成后,程序指针将指向被调用过程的过程开始的位置-Procedurex命令;已
         经填写好了上下文,即三条链,b指向存取链的位置,s指向栈顶。具体代码如下:

             s:=s+1;
             x:=b;
             while level&gt;0 do begin               |    
                                 x:=st[x];           | { 沿着存取链查找被调用过程的直接外围过程 } 
                                 level:=level-1;     |
                                 end;                |
             st[s]:=x;                                 { 填写存取链 }
             st[s+1]:=b;                               { 填写动态链 }
             st[s+2]:=p+3;                             { 填写返回地址 } 
             b:=s;                                     { 设置b值 }
             s:=b+2;                                   { 设置栈顶指针 } 
             p:=p+displ;                               { 设置程序指针 }

<a
name="procedurex说明">5</a>. 过程procedure Procedurex(Varlength,TempLength,Displ,LineNo:integer)说明</pre>

<pre>   输入:Varlength,
                 变量总长度,即变量所占的内存空间之和;
         Templength,
                 最长的临时变量空间;
         Displ,
                 这个过程的内部过程的代码长度,即从这个命令到过程的第一条命令的偏移;
         Lineno,
                                  过程定义语句所在行的行号。
    说明:
         这个命令是Pascal计算机的过程定义命令,这些参数都是为了设置新过程的活动记录而传递的。在
         此之前,需要传递的参数已经放在了栈顶,并且形成了上下文。具体代码如下:

           s:=s+VarLength;                          { 为局部变量留出空间,移动栈顶指针 }
            if s+TempLength&gt;Max then              { 判断是否有内存溢出 }
                  Error(LineNo,'Stack limit') else

⌨️ 快捷键说明

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