子程序一般都是完成某種特定功能的程序段。當一個程序調(diào)用一個子程序時,通常都向子程序傳遞若干個數(shù)據(jù)讓它來處理;當子程序處理完后,一般也向調(diào)用它的程序傳遞處理結(jié)果,我們稱這種在調(diào)用程序和子程序之間的信息傳遞為參數(shù)傳遞。
用程序向子程序傳遞的參數(shù)稱為子程序的入口參數(shù),子程序向調(diào)用它的程序傳遞的參數(shù)稱為子程序的出口參數(shù)。子程序的入口參數(shù)和出口參數(shù)都是任意項,對某個具體的子程序來說,要根據(jù)具體情況來確定其入口和出口參數(shù),也可以二者都沒有。
程序和被調(diào)用子程序之間的參數(shù)傳遞方法是程序員自己或和別人事先約定好的信息傳遞方法。這種信息傳遞方法可以是多種多樣的,在本節(jié),我們只介紹常用的、行之有效的參數(shù)傳遞方法有:寄存器傳遞參數(shù)、約定存儲單元傳遞參數(shù)和堆棧傳遞參數(shù)等。如果對其它的參數(shù)傳遞方法感興趣的話,可參考其它《匯編語言程序設計》書籍。
7.3.1 寄存器傳遞參數(shù)
一方面,由于CPU中的寄存器在任何程序中都是“可見”的,一個程序?qū)δ臣拇嫫髻x值后,在另一個程序中就能直接使用,所以,用寄存器來傳遞參數(shù)最直接、簡便,也是最常用的參數(shù)傳遞方式。但另一方面,CPU中寄存器的個數(shù)和容量都是非常有限,所以,該方法適用于傳遞較少的參數(shù)信息。
例7.1是用寄存器傳遞參數(shù)的例子,子程序處理的數(shù)據(jù)被保存在寄存器AL中。假設有下列的程序段:
…
MOVAL, ’b’
CALLUPPER;子返回時,(AL)=’B’
…
MOVAL, ’2’
CALLUPPER;子返回時,AL的值不變,因為’2’不是字母
…
例7.3 按五位十進制的形式顯示寄存器BX中的內(nèi)容,如果BX的值小于0,則應在顯示數(shù)值之前顯示負號’-’。
例如:(BX)=123,顯示:00123;(BX)=-234,顯示:-00234;
解:
;子程序功能:把寄存器BX的內(nèi)容按十進制有符號數(shù)顯示出來
;入口參數(shù):BX
;出口參數(shù):無,只有顯示信息
;算法描述:
1、定義6個字節(jié)的存儲單元
2、先判斷BX是否小于零,如果是,則先顯示負號’-’,再取BX的絕對值;
3、采用除10,得余數(shù)的方法,從低位向高位求出每位十進制位;
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;顯示負號’-’
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
用程序向子程序傳遞的參數(shù)稱為子程序的入口參數(shù),子程序向調(diào)用它的程序傳遞的參數(shù)稱為子程序的出口參數(shù)。子程序的入口參數(shù)和出口參數(shù)都是任意項,對某個具體的子程序來說,要根據(jù)具體情況來確定其入口和出口參數(shù),也可以二者都沒有。
程序和被調(diào)用子程序之間的參數(shù)傳遞方法是程序員自己或和別人事先約定好的信息傳遞方法。這種信息傳遞方法可以是多種多樣的,在本節(jié),我們只介紹常用的、行之有效的參數(shù)傳遞方法有:寄存器傳遞參數(shù)、約定存儲單元傳遞參數(shù)和堆棧傳遞參數(shù)等。如果對其它的參數(shù)傳遞方法感興趣的話,可參考其它《匯編語言程序設計》書籍。
7.3.1 寄存器傳遞參數(shù)
一方面,由于CPU中的寄存器在任何程序中都是“可見”的,一個程序?qū)δ臣拇嫫髻x值后,在另一個程序中就能直接使用,所以,用寄存器來傳遞參數(shù)最直接、簡便,也是最常用的參數(shù)傳遞方式。但另一方面,CPU中寄存器的個數(shù)和容量都是非常有限,所以,該方法適用于傳遞較少的參數(shù)信息。
例7.1是用寄存器傳遞參數(shù)的例子,子程序處理的數(shù)據(jù)被保存在寄存器AL中。假設有下列的程序段:
…
MOVAL, ’b’
CALLUPPER;子返回時,(AL)=’B’
…
MOVAL, ’2’
CALLUPPER;子返回時,AL的值不變,因為’2’不是字母
…
例7.3 按五位十進制的形式顯示寄存器BX中的內(nèi)容,如果BX的值小于0,則應在顯示數(shù)值之前顯示負號’-’。
例如:(BX)=123,顯示:00123;(BX)=-234,顯示:-00234;
解:
;子程序功能:把寄存器BX的內(nèi)容按十進制有符號數(shù)顯示出來
;入口參數(shù):BX
;出口參數(shù):無,只有顯示信息
;算法描述:
1、定義6個字節(jié)的存儲單元
2、先判斷BX是否小于零,如果是,則先顯示負號’-’,再取BX的絕對值;
3、采用除10,得余數(shù)的方法,從低位向高位求出每位十進制位;
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;顯示負號’-’
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