什么是过程调用的栈分配?
在栈分配中,它可以分析在运行时调用过程时和从过程返回值时内存是如何分配的。
- 向过程传递参数 (param x)− 当实际参数 x 传递给过程时,它将被压入栈中,即 push (x)。
∴ param(x) 指的是 push (x),它指的是将顶部指针从 N + 1 减小到 N,并且 x 将被压入栈中。
∴ 将执行以下语句。
- top = top – 1
- *top = x 或 0[top] = x
这里 0[top] 表示从顶部偏移 0 个位置,即距顶部 0 个距离,即顶部本身。
∴ *top = x 将为 top 分配值为 x。
- 调用过程 (call P, n)− 执行此语句将插入 P 的激活记录的所有条目,即参数的数量、返回地址、返回值的空间、旧栈指针到栈中。
∴ call P, n 将导致执行以下语句。
- push(n)− 压入参数的数量。
- push(I1)− l1是返回地址的标签。
- push()− 为要填充的返回值保留空空间。
- push(Sp)− 存储旧栈指针。
- goto I2− I2 是过程 P 的第一条语句的标签。
- 过程的第一条语句 (procbegin)− 它将栈指针的值分配给旧 SP。顶部指针将指向激活记录的顶部。局部数据,即过程 P 的大小将添加到栈中。
如果 SOP=过程的大小或内存被过程的局部数据占用。
∴ 将执行以下语句 −
- 𝐒𝐏 = 𝐭𝐨𝐩− 栈指针 SP 将指向先前存储在顶部的旧 SP。
- 𝐭𝐨𝐩 = 𝐒𝐏 + 𝐒𝐎𝐏− 过程的大小 (SOP) 加到 SP 上以给出顶部位置。
现在顶部指针将指向激活记录的顶部。
- 返回语句 (返回值)− 当过程返回值时,返回值将存储在栈指针 (SP) 位置上方保留的空栈中。
当过程返回时,过程的激活记录将被删除或从内存位置弹出。
当过程 P 返回值时,将顶部指针设置为 P 被调用之前具有的值。
将指针 P 设置为旧 SP 的值,即调用 P 的过程的 SP。
顶部指针将指向调用 P 的过程的激活记录的额外存储。
返回值时将执行以下语句 −
- 𝟏[𝐒𝐏] = 𝐯𝐚𝐥𝐮𝐞− 由于返回值始终是 SP 指针的 1 个位置。返回值将存储在距 SP 偏移 1 的位置。
- 𝐭𝐨𝐩 = 𝐒𝐏 + 𝟐− top 指向返回地址。
- 𝐒𝐏 =∗ 𝐒𝐏− 将指针 SP 设置为旧 SP 的值。
- 𝐥 =∗ 𝐭𝐨𝐩− l 的值将包含返回地址。
- 𝐭𝐨𝐩 = 𝐭𝐨𝐩 + 𝟏− top 指向参数的数量。
- 𝐭𝐨𝐩 = 𝐭𝐨𝐩 + 𝟏 +∗ 𝐭𝐨𝐩− 当前,top 指向参数的数量,加 1 将使顶部指针移动到实际参数,加 *top,即参数的数量将使顶部指针移动到 P 被调用之前的位置。
广告