什麼是子程式?


子程式是被其他程式用來完成特定任務的程式。子程式可以從微程式主體的任何點呼叫。通常,許多微程式包含相同的程式碼段。透過使用包含常用微程式碼段的子程式,可以節省微指令。

例如,為指令生成運算元有效地址所需的微操作序列對於所有記憶體引用指令都是通用的。此序列可以是一個子程式,可以從許多其他程式中呼叫以執行有效地址計算。

使用子程式的微程式必須有在子程式呼叫期間儲存返回地址並在子程式返回期間恢復地址的機制。這可以透過將控制地址暫存器的增量輸出放入子程式暫存器並跳轉到子程式的開頭來實現。

然後,子程式暫存器可以成為將返回到主程式的地址傳輸的源。構建儲存子程式地址的暫存器檔案的最佳方法是將暫存器組織成後進先出 (LIFO) 堆疊。

將程式控制轉移到子程式的指令有不同的名稱。最常用的名稱是呼叫子程式、跳轉到子程式、分支到子程式或分支並儲存地址。

呼叫子程式指令由操作碼和指定子程式開頭的地址組成。

該指令的執行包括執行以下兩個操作:

  • 程式計數器 (PC) 中下一個可用指令的地址(返回地址)儲存在臨時位置,以便子程式知道返回位置。
  • 控制轉移到子程式的開頭。每個子程式的最後一條指令(通常稱為從子程式返回)將返回地址從臨時位置轉移到程式計數器。這導致程式控制轉移到其地址最初儲存在臨時位置的指令。

子程式呼叫用以下微操作實現:

SP ← SP − 1它可以遞減堆疊指標。
M[SP] ← PC它用於將 PC 的內容壓入堆疊。
PC ← 有效地址它可以將控制轉移到子程式。

如果當前子程式呼叫另一個子程式,新的返回地址將被壓入堆疊,依此類推。從最後一個子程式返回的指令由以下微操作實現:

PC ← M[SP]它用於彈出堆疊並將內容轉移到 PC。
SP ← SP + 1它可以遞增堆疊指標。

透過使用子程式堆疊,所有返回地址都由硬體在一個單元中自動儲存。程式設計師不必擔心或記住返回地址儲存在哪裡。

遞迴子程式是呼叫自身的子程式。如果只有一個暫存器或記憶體位置可以儲存返回地址,並且遞迴子程式呼叫自身,它將結束之前的返回地址。

這是不可取的,因為重要資訊會被破壞。如果為子程式的每次使用都採用不同的儲存位置,而另一個更低級別的使用仍然處於活動狀態,則可以解決此問題。

使用堆疊時,每個返回地址都可以壓入堆疊而不會破壞任何以前的值。這解決了遞迴子程式的問題,因為下一個要退出的子程式始終是最後呼叫的子程式。

更新於:2021年7月24日

21K+ 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告