什麼是過程呼叫的棧分配?


在棧分配中,它可以分析在執行時呼叫過程時和從過程返回值時記憶體是如何分配的。

  • 向過程傳遞引數 (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 被呼叫之前的位置。


更新於: 2021年11月8日

1K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.