把可以多次調(diào)用、能夠完成特定操作功能的程序段編寫成獨(dú)立的程序模塊稱為子程序,又稱其為過程。主程序與子程序之間的關(guān)系如圖1所示。
圖1 主程序與子程序間的關(guān)系
一、子程序特性
1.重復(fù)性
2.通用性
3.可浮動(dòng)性
4.可遞歸和可重入性
二、子程序定義
格式:
procedure name proc attribute
┇
procedure name endp
1.子程序名
2.屬性
①near
②far。
三、子程序的設(shè)計(jì)方法
子程序是程序設(shè)計(jì)中經(jīng)常使用的程序結(jié)構(gòu),通過把一些固定的、經(jīng)常使用的功能做成子程序的形式,可以使源程序及目標(biāo)程序大大縮短,提高程序設(shè)計(jì)的效率和可靠性。
對(duì)于一個(gè)子程序,應(yīng)該注意它的入口參數(shù)和出口參數(shù)。
入口參數(shù)是由主程序傳給子程序的參數(shù),而出口參數(shù)是子程序運(yùn)算完傳給主程序的結(jié)果。另外,子程序所使用的寄存器和存儲(chǔ)單元往往需要保護(hù),以免影響返回后主程序的運(yùn)行。
主程序在調(diào)用子程序時(shí),一方面初始數(shù)據(jù)要傳給子程序,另一方面子程序運(yùn)行結(jié)果要傳給主程序,因此,主子程序之間的參數(shù)傳遞是非常重要的。
四、子程序的調(diào)用和返回
1.call指令
2.ret指令
五、現(xiàn)場(chǎng)保護(hù)與現(xiàn)場(chǎng)恢復(fù)
1.現(xiàn)場(chǎng)保護(hù)與現(xiàn)場(chǎng)恢復(fù)的原因
2.現(xiàn)場(chǎng)保護(hù)與現(xiàn)場(chǎng)恢復(fù)的實(shí)現(xiàn)
(1)push/pop
(2)pusha/popa
(3)pushad/popad
六、參數(shù)傳遞的實(shí)現(xiàn)
參數(shù)傳遞一般有四種方法實(shí)現(xiàn):
(1) 利用寄存器
這是一種最常見方法,把所需傳遞的參數(shù)直接放在主程序的寄存器中傳遞給子程序。
(2) 利用存儲(chǔ)單元
這種參數(shù)傳遞方法,把所需傳遞的參數(shù)直接放在子程序調(diào)用指令代碼之后。若子程序和調(diào)用程序在同一源文件(同一程序模塊)中,則子程序可直接訪問模塊中的變量,進(jìn)行參數(shù)傳遞。
(3) 利用堆棧
這種方法將參數(shù)壓入堆棧,在子程序運(yùn)行時(shí)從堆棧中取參數(shù)。
下面我們通過實(shí)例說明子程序設(shè)計(jì)及參數(shù)傳遞方法。
(4) 通過地址表傳遞參數(shù)地址
這種方法是在主程序中建立一個(gè)地址表,把要傳送給子程序的參數(shù)都存放在地址表中,然后把地址表的首地址通過寄存器bx傳送到子程序中去。子程序通過地址表取得所需參數(shù),并把結(jié)果存入指定的存儲(chǔ)單元中去。
五、增強(qiáng)功能的子程序定義偽操作
從masm5.1版開始為用戶提供增強(qiáng)功能的過程定義偽操作
偽操作格式:
procnameproc [attribute field][uses register list][, parameter field]
┇
procnameendp
說明:
①.其中屬性字段(attribute field)有以下幾項(xiàng)組成:distancelanguage typevisibilityprologue,每一項(xiàng)均為可選,各項(xiàng)之間用一空格或制表符分開。
?。甦istance就是near或far。
ⅱ.language type說明當(dāng)該過程作為某高級(jí)語言程序的子過程時(shí)所用的高級(jí)語言。
ⅲ.visibility說明該過程的可見性,可用private或public。如用private則該過程的可見性只能是當(dāng)前的源文件;如用public則允許其他模塊調(diào)用該過程(默認(rèn))。
ⅳ.prologue是一宏的名字,允許用戶用宏來控制過程的入口和出口有關(guān)的代碼。
②.uses字段允許用戶指定所需保存和恢復(fù)的寄存器表,masm將在過程入口自動(dòng)生成push指令來保存這些寄存器,并在過程出口的ret指令前自動(dòng)生成pop指令來恢復(fù)這些寄存器。
③.參數(shù)字段允許用戶指定該過程所用參數(shù),其格式為:identifier:type[,identifier:type]其中identifier給出參數(shù)的符號(hào)名,type給出參數(shù)的類型。參數(shù)之間用逗號(hào)隔開。
增強(qiáng)功能的過程定義偽操作還可在過程中定義局部變量。
局部變量是指在過程內(nèi)部使用的變量。它是在過程被調(diào)用時(shí)在堆棧中建立的,在退出過程時(shí)被釋放。它是以[bp-2]、[bp-4]、…的形式被訪問的。masm規(guī)定,在過程內(nèi)可以用local偽操作為局部變量申請(qǐng)空間。
偽操作格式:localvardef [,vardef]
說明:
①.其中變量定義可用的格式為:label label:type label [count]:type其中第一個(gè)未指定類型者masm將使用word。type可以指定任意合法的類型說明。第三種類型為用戶申請(qǐng)數(shù)組提供了方便。
②.local語句必須緊跟在過程定義偽操作之后,并在任何80x86指令或可以產(chǎn)生任何代碼的masm語句之前出現(xiàn)。它可以定義多個(gè)局部變量。
七、程序的調(diào)用
1.遞歸的概念
2.遞歸的特點(diǎn)