簡介
子程式調用指令的格式為操作碼和目的地址。子程式調用指令的目的地址是子程式的首地址。子程式調用指令用於實現程式與程式之間的轉移,與轉移指令不同(轉移指令用於實現同一程式內的轉移)。子程式調用指令還可以進行嵌套調用,即可調用別的子程式,還可以實現遞歸調用,即直接或間接自己調用自己。
在程式的執行過程中,當需要執行子程式時,可以在主程式中發出子程式調用指令,而當子程式執行完畢後,給出子程式的入口地址,控制程式的執行序列從主程式轉入子程式;而子程式執行完畢後,可以利用返回指令返回主程式,使得程式重新返回主程式發出子程式調用指令的地方,繼續順序執行。在執行調用指令,通常採用堆疊來保存返回地址,即把下一條指令的地址壓入堆疊中保存,子程式執行完畢後,由返回指令壓入堆疊的返回地址從堆疊中彈出,返回調用程式。
轉子指令和返回指令
在子程式的調用與返回過程中,子程式的入口地址是指子程式第一條指令的地址。用於調用子程式、控制程式的執行從主程式轉向子程式的指令稱為專注指令(子程式調用指令、過程調用指令)。為了正確調用子程式,必須在轉子指令中給出子程式的入口地址。主程式中轉子指令的下一條指令的地址稱為斷點,斷點是子程式返回主程式的返回地址,從子程式返回主程式的指令稱為返回指令。為了在執行返回指令時能夠正確地返回主程式,轉子指令應具有保護斷點的功能。執行轉子指令時保護斷點的方式有多種,常用的有:將斷點保存到子程式第一條指令的前一個字單元;將斷點保存到某一約定的暫存器中;將斷點壓入堆疊。轉子指令和返回指令通常都是無條件的,但也有帶條件的轉子指令和返回指令。條件轉子指令和條件返回指令所需要的條件與轉移指令的條件類似 。
有關術語
子程式是一個大型程式中的某部分代碼,由一個或多個語句塊組成。它負責完成某項特定任務,而且相較於其他代碼,具備相對的獨立性。一般會有輸入參數並有返回值,提供對過程的封裝和細節的隱藏。這些代碼通常被集成為軟體庫。
主程式,也稱主函式,在許多命令式程式設計語言裡,主函式(main function)是程式開始運行的地方。而相對地,其它編程範式的語言中就很少會有這樣一個概念。
遞歸是一個函式、過程或者數據結構,如果在它們定義的內部又出現有定義本身的套用,則稱它們是遞歸的,或者是遞歸定義的。例如,一個過程的某一步要用到它自身的上一步的結果。遞歸調用就是在當前的函式中調用當前的函式並傳給相應的參數,這是一個動作,這一動作是層層進行的,直到滿足一般情況的的時候,才停止遞歸調用,開始從最後一個遞歸調用返回。
嵌套調用就是某個函式調用另外一個函式(即函式嵌套允許在一個函式中調用另外一個函式),它是一個語言提供的程式設計的方法,也就是語言的特性。
堆疊是一個在計算機科學中經常使用的抽象數據類型。堆疊中的物體具有一個特性: 最後一個放入堆疊中的物體總是被最先拿出來, 這個特性通常稱為後進先出(LIFO)佇列。 堆疊中定義了一些操作。 兩個最重要的是PUSH和POP。 PUSH操作在堆疊的頂部加入一 個元素。POP操作相反, 在堆疊頂部移去一個元素, 並將堆疊的大小減一。