把可以多次調用、什程能夠完成特定操作功能的序程序程序段編寫成獨立的程序模塊稱為子程序,又稱其為過程。概念主程序與子程序之間的什程關系如圖1所示。
圖1 主程序與子程序間的序程序關系
一、子程序特性
1.重復性
2.通用性
3.可浮動性
4.可遞歸和可重入性
二、概念子程序定義
格式:
PROCEDURE NAME PROC ATTRIBUTE
┇
PROCEDURE NAME ENDP
1.子程序名
2.屬性
①NEAR
②FAR。什程
三、序程序子程序的概念設計方法
子程序是程序設計中經常使用的程序結構,通過把一些固定的什程、經常使用的序程序功能做成子程序的形式,可以使源程序及目標程序大大縮短,概念提高程序設計的什程效率和可靠性。
對于一個子程序,序程序應該注意它的概念入口參數和出口參數。
入口參數是由主程序傳給子程序的參數,而出口參數是子程序運算完傳給主程序的結果。另外,子程序所使用的寄存器和存儲單元往往需要保護,以免影響返回后主程序的運行。
主程序在調用子程序時,一方面初始數據要傳給子程序,另一方面子程序運行結果要傳給主程序,因此,主子程序之間的參數傳遞是非常重要的。
四、子程序的調用和返回
1.CALL指令
2.RET指令
五、現場保護與現場恢復
1.現場保護與現場恢復的原因
2.現場保護與現場恢復的實現
(1)PUSH/POP
(2)PUSHA/POPA
(3)PUSHAD/POPAD
六、參數傳遞的實現
參數傳遞一般有四種方法實現:
(1) 利用寄存器
這是一種最常見方法,把所需傳遞的參數直接放在主程序的寄存器中傳遞給子程序。
(2) 利用存儲單元
這種參數傳遞方法,把所需傳遞的參數直接放在子程序調用指令代碼之后。若子程序和調用程序在同一源文件(同一程序模塊)中,則子程序可直接訪問模塊中的變量,進行參數傳遞。
(3) 利用堆棧
這種方法將參數壓入堆棧,在子程序運行時從堆棧中取參數。
下面我們通過實例說明子程序設計及參數傳遞方法。
(4) 通過地址表傳遞參數地址
這種方法是在主程序中建立一個地址表,把要傳送給子程序的參數都存放在地址表中,然后把地址表的首地址通過寄存器BX傳送到子程序中去。子程序通過地址表取得所需參數,并把結果存入指定的存儲單元中去。
五、增強功能的子程序定義偽操作
從MASM5.1版開始為用戶提供增強功能的過程定義偽操作
偽操作格式:
procname PROC [attribute field][USES register list][, parameter field]
┇
procname ENDP
說明:
①.其中屬性字段(attribute field)有以下幾項組成:distance language type visibility prologue,每一項均為可選,各項之間用一空格或制表符分開。
Ⅰ.distance就是NEAR或FAR。
Ⅱ.language type說明當該過程作為某高級語言程序的子過程時所用的高級語言。
Ⅲ.visibility說明該過程的可見性,可用Private或Public。如用Private則該過程的可見性只能是當前的源文件;如用Public則允許其他模塊調用該過程(默認)。
Ⅳ.prologue是一宏的名字,允許用戶用宏來控制過程的入口和出口有關的代碼。
②.USES字段允許用戶指定所需保存和恢復的寄存器表,MASM將在過程入口自動生成push指令來保存這些寄存器,并在過程出口的ret指令前自動生成pop指令來恢復這些寄存器。
③.參數字段允許用戶指定該過程所用參數,其格式為:identifier:type[,identifier:type]其中identifier給出參數的符號名,type給出參數的類型。參數之間用逗號隔開。
增強功能的過程定義偽操作還可在過程中定義局部變量。
局部變量是指在過程內部使用的變量。它是在過程被調用時在堆棧中建立的,在退出過程時被釋放。它是以[BP-2]、[BP-4]、…的形式被訪問的。MASM規定,在過程內可以用LOCAL偽操作為局部變量申請空間。
偽操作格式:LOCAL vardef [,vardef]
說明:
①.其中變量定義可用的格式為:label label:type label [count]:type其中第一個未指定類型者MASM將使用WORD。type可以指定任意合法的類型說明。第三種類型為用戶申請數組提供了方便。
②.LOCAL語句必須緊跟在過程定義偽操作之后,并在任何80x86指令或可以產生任何代碼的MASM語句之前出現。它可以定義多個局部變量。
七、程序的調用
1.遞歸的概念
2.遞歸的特點