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

📄 pascal计算机.htm

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>New Page 1</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>

<body>

<h1>Pascal计算机</h1>

<p>“用min_Pascal语言书写的程序翻译成用Pascal计算机语言书写的程序”意味着下面两个方面: 

<ol>
  <li>用编译程序编译min_Pascal语言书写的程序,得到目标程序。这个目标程序是由Pascal计算机的命令组成的。</li>
  <li>Pascal计算机解释执行这个目标程序。</li>
</ol>

<p>为此,我们必须首先了解Pascal计算机的组成和命令,才能将min_Pascal程序翻译成相应的目标程序,在解释机上运行。这里介绍了如下几个部分: 

<ul>
  <li><a href="#Pascal计算机的内存">Pascal计算机的内存</a></li>
  <li><a href="#Pascal计算机的指令系统">Pascal计算机的指令系统</a></li>
  <li><a href="解释程序.htm">Pascal计算机的解释程序</a></li>
</ul>

<h3>1. <a name="Pascal计算机的内存">Pascal计算机的内存</a></h3>

<p>Pascal计算机的内存是一个叫做St的整型数组,St的元素和它的索引分别称为字和地址。存储和索引用Pascal语言定义如下:</p>

<pre>Const
    min=0;max=8192;
Type
    store=array[min..max] of integer;
Var
    st:store;
    p,b,s:integer;</pre>

<p>地址为X的存储单元表示为st[x],p,b,s为寄存器。st的划分和寄存器的使用如下图所示。</p>

<pre>                      <img src="../../My%20Documents/tu1.jpg" width="338"
height="217" alt="tu1.jpg (9011 bytes)" align="middle"></pre>

<p>内存st是一个栈,当程序激发一个过程时,Pascal计算机为过程中定义的变量在栈中分配空间,当这个过程的活动执行结束后,这些变量从栈中被去掉。</p>

<p>单个块中的变量映射到一个栈段,称为一个活动记录(如下图所示),它由下面四部分组成:参数部分,上下文(环境)部分,变量部分,临时变量部分。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<img src="../../My%20Documents/tu2.jpg" width="338" height="284"
alt="tu2.jpg (10660 bytes)" align="middle"></p>

<p>三个寄存器p,b,s的用途分别为: 

<ul>
  <li>p为指令计数器,总是指向下一条要执行的指令;</li>
  <li>b为活动记录中用到的指针,指向存取链所在的位置,所有变量(包括值参和变参)的偏移都是相对于相应活动记录的b的; 
    &nbsp; </li>
  <li>s为栈顶指针,总是指向st中下标最大的以用单元。</li>
</ul>

<p>每个活动记录中都包括了三条链组成的上下文部分。 

<ul>
  <li>存取链(static link)是用来访问变量的,它指向直接包括当前过程的外围过程的存取链;</li>
  <li>动态链(dynamic link)是用于过程返回时去掉活动记录,恢复b值的,它设置为这个活动记录的上一个活动记录的b值,即指向调用当前过程的过程的存取链;</li>
  <li>返回地址(return address)是用于过程返回时确定返回地址的,它记录了过程调用语句的下一个语句的地址。</li>
</ul>

<h3>2. <a name="Pascal计算机的指令系统">Pascal计算机的指令系统</a></h3>

<table border="1" width="100%">
  <tr>
    <td width="58%"><font face="黑体">命令</font></td>
    <td width="36%"><font face="黑体">作用</font></td>
    <td width="6%"><font face="黑体">说明</font></td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#variable">Variable(Level,displ:integer)</a></td>
    <td width="36%">变量访问(用于访问值参和变量)</td>
    <td width="6%"><a href="说明.htm#variable说明">有</a></td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#varparam">Varparam(Level,displ:integer)</a></td>
    <td width="36%">访问变量参数</td>
    <td width="6%"><a href="说明.htm#varparam说明">有</a></td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#index">Index(lower,upper,length,lineno:integer)</a></td>
    <td width="36%">求数组中某个下标变量地址于栈顶</td>
    <td width="6%"><a href="说明.htm#index说明">有</a></td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#field">field(displ:integer)</a></td>
    <td width="36%">求记录的域地址于栈顶</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#constant">constant(value:integer)</a></td>
    <td width="36%">取常数值于栈顶</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#value">value(length:integer)</a></td>
    <td width="36%">栈顶处的地址转为由它开始的一串值</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#notx">notx</a></td>
    <td width="36%">逻辑非</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#multiply">multiply</a></td>
    <td width="36%">整数乘</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#divide">divide</a></td>
    <td width="36%">整数除</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#modulo">modulo</a></td>
    <td width="36%">取模</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#andx">andx</a></td>
    <td width="36%">逻辑与</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#minus">minus</a></td>
    <td width="36%">一元负</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#add">add</a></td>
    <td width="36%">整数加</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#subtract">subtract</a></td>
    <td width="36%">整数减</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#orx">orx</a></td>
    <td width="36%">逻辑或</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#less">less</a></td>
    <td width="36%">小于</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#equal">equal</a></td>
    <td width="36%">等于</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#greater">greater</a></td>
    <td width="36%">大于</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#notgreater">notgreater</a></td>
    <td width="36%">不大于</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#notequal">notequal</a></td>
    <td width="36%">不等于</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#notless">notless</a></td>
    <td width="36%">不小于</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#readx">readx</a></td>
    <td width="36%">读一个整数</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#writeintx">writeintx</a></td>
    <td width="36%">写一个整数</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#writebooleanx">writebooleanx</a></td>
    <td width="36%">写一个布尔值</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#proccall">Proccall(level,displ:integer)</a></td>
    <td width="36%">过程调用</td>
    <td width="6%"><a href="说明.htm#proccall说明">有</a></td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#assigm">Assigm(length:integer)</a></td>
    <td width="36%">将栈顶的一些值赋到特定的地址处</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#Dox">dox(displ:integer)</a></td>
    <td width="36%">根据栈顶元素,条件转移</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#Gotox">gotox(displ:integer)</a></td>
    <td width="36%">无条件转移</td>
    <td width="6%">无</td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#Procedurex">Procedurex(varlength,templength,displ,lineno:integer)</a></td>
    <td width="36%">过程开始</td>
    <td width="6%"><a href="说明.htm#procedurex说明">有</a></td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#EndProc">endproc(paramlength:integer)</a></td>
    <td width="36%">过程结束</td>
    <td width="6%"><a href="说明.htm#endproc说明">有</a></td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#Programx">Programx(Varlength,templenth,displ,Lineno:integer)</a></td>
    <td width="36%">程序开始</td>
    <td width="6%"><a href="说明.htm#programx说明">有</a></td>
  </tr>
  <tr>
    <td width="58%"><a href="解释程序.htm#EndProg">Endprog</a></td>
    <td width="36%">程序结束</td>
    <td width="6%">无</td>
  </tr>
</table>

<p>除这些指令外,还有一些优化指令,如Localvar(displ:integer),Localvalue(displ:integer),Globalvar(displ:integer),simplevalue,simpleassign等。这些指令都是在上面的基本指令的加些限制实现的,看懂上面指令后,这些指令不难看懂。</p>

<p> </p>
</body>
</html>

⌨️ 快捷键说明

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