📄 machine_note.htm
字号:
<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 topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" bgcolor="#FFFFFF" text="#669933" link="#CC3300" bgproperties="fixed" background="bj.gif">
<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>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>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<lower) or (i>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>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>Max then { 判断是否有内存溢出 }
Error(LineNo,'Stack limit') else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -