子程序的參數(shù)傳遞

字號:

子程序一般都是完成某種特定功能的程序段。當(dāng)一個(gè)程序調(diào)用一個(gè)子程序時(shí),通常都向子程序傳遞若干個(gè)數(shù)據(jù)讓它來處理;當(dāng)子程序處理完后,一般也向調(diào)用它的程序傳遞處理結(jié)果,我們稱這種在調(diào)用程序和子程序之間的信息傳遞為參數(shù)傳遞。
    用程序向子程序傳遞的參數(shù)稱為子程序的入口參數(shù),子程序向調(diào)用它的程序傳遞的參數(shù)稱為子程序的出口參數(shù)。子程序的入口參數(shù)和出口參數(shù)都是任意項(xiàng),對某個(gè)具體的子程序來說,要根據(jù)具體情況來確定其入口和出口參數(shù),也可以二者都沒有。
    程序和被調(diào)用子程序之間的參數(shù)傳遞方法是程序員自己或和別人事先約定好的信息傳遞方法。這種信息傳遞方法可以是多種多樣的,在本節(jié),我們只介紹常用的、行之有效的參數(shù)傳遞方法有:寄存器傳遞參數(shù)、約定存儲單元傳遞參數(shù)和堆棧傳遞參數(shù)等。如果對其它的參數(shù)傳遞方法感興趣的話,可參考其它《匯編語言程序設(shè)計(jì)》書籍。
    7.3.1 寄存器傳遞參數(shù)
    一方面,由于CPU中的寄存器在任何程序中都是“可見”的,一個(gè)程序?qū)δ臣拇嫫髻x值后,在另一個(gè)程序中就能直接使用,所以,用寄存器來傳遞參數(shù)最直接、簡便,也是最常用的參數(shù)傳遞方式。但另一方面,CPU中寄存器的個(gè)數(shù)和容量都是非常有限,所以,該方法適用于傳遞較少的參數(shù)信息。
    例7.1是用寄存器傳遞參數(shù)的例子,子程序處理的數(shù)據(jù)被保存在寄存器AL中。假設(shè)有下列的程序段:
    …
    MOVAL, ’b’
    CALLUPPER;子返回時(shí),(AL)=’B’
    …
    MOVAL, ’2’
    CALLUPPER;子返回時(shí),AL的值不變,因?yàn)椤?’不是字母
    …
    例7.3 按五位十進(jìn)制的形式顯示寄存器BX中的內(nèi)容,如果BX的值小于0,則應(yīng)在顯示數(shù)值之前顯示負(fù)號’-’。
    例如:(BX)=123,顯示:00123;(BX)=-234,顯示:-00234;
    解:
    ;子程序功能:把寄存器BX的內(nèi)容按十進(jìn)制有符號數(shù)顯示出來
    ;入口參數(shù):BX
    ;出口參數(shù):無,只有顯示信息
    ;算法描述:
    1、定義6個(gè)字節(jié)的存儲單元
    2、先判斷BX是否小于零,如果是,則先顯示負(fù)號’-’,再取BX的絕對值;
    3、采用除10,得余數(shù)的方法,從低位向高位求出每位十進(jìn)制位;
    4、輸出數(shù)據(jù)的字符串。
    SubDataSEGMENT
    DB 5 DUP(’0’), 0ah, 0dh, ’$’    ;0ah、0dh:換行、回車
    SubDataENDS
    DISPBXPROC
    ASSUMEDS:SubData
    PUSHDS
    PUSHDX
    PUSHCX
    PUSHAX
    MOVAX, SubData;取子程序所用的數(shù)據(jù)區(qū)段地址
    MOVDS, AX
    CMPBX, 0
    JGEnext
    MOVDL, ’-’
    MOVAH, 2
    INT21H;顯示負(fù)號’-’
    NEGBX;求-BX,使其值為正數(shù)
    next:MOVSI, 4
    MOVAX, BX
    MOVCX, 10D
    again:XORDX, DX
    IDIVCX;DX存放余數(shù),AX存放商
    ADDDL, ’0’
    MOV[SI], DL
    DECSI
    JGEagain
    XORDX, DX
    MOVAH, 9
    INT21H;調(diào)用中斷21的功能9,顯示DS:DX指向的字符串
    POPAX
    POPCX
    POPDX
    POPDS
    RET
    DISPBXENDP