在調用子程序時,當需要向子程序傳遞大量數據時,因受到寄存器容量的限制,就不能采用寄存器傳遞參數的方式,而要改用約定存儲單元的傳送方式。這種參數傳遞方式有點象情報人員和聯絡人員之間的傳遞信息方式,一個向指定地點放情報,另一個從指定地點取情報。
例7.2是采用約定存儲單元傳遞參數的例子,所處理的數據不是直接傳給子程序,而是把存儲它們的地址告訴子程序。
例7.4:編寫一個子程序分類統計出一個字符串中數字字符、字母和其它字符的個數。該字符串的首地址用DS:DX來指定(以0為字符串結束),各類字符個數分別存放BX、CX和DI中。
解:
;子程序功能:分類統計出字符串中數字字符、字母和其它字符的個數
;入口參數:DS:DX指向被統計的字符串
;出口參數:BX、CX和DI分別保存數字字符、字母和其它字符的個數
;算法描述:1、當字符在’0’~’9’范圍時,數字字符個數BX加1;
2、為了判斷簡單,先把字字母變成大寫字母;
3、當字符在’A’~’Z’范圍時,字母個數CX加1;
4、否則,其它字符個數DI加1。
COUNTPROC
PUSHAX
PUSHSI
XORBX, BX
XORCX, CX
XORDI, DI;上三條指令使各類字符計數清零
MOVSI, DX
again:MOVAL, [SI]
INCSI
CMPAL, 0
JEover
CMPAL, ’0’
JLother
CMPAL, ’9’
JGnext
INCBX;數字字符個數加1
JMPagain
next:CALLUPPER;調用子程序把AL中的字母變成大寫字母
CMPAL, ’A’
JLother
CMPAL, ’Z’
JGother
INCCX;字母個數加1
JMPagain
other:INCDI;其它字符個數加1
JMPagain
over:POPSI
POPAX
RET
COUNTENDP
例7.5 顯示出任意字符串中數字字符、字母和其它字符的個數。
解:
.MODELSMALL
.DATA
MSGDB ’KSDJ L0984/[]3oiu OIU OIU (*&(5341’, 0
.CODE
.STARTUP
LEADX, MSG;DS:DX指向待統計的字符串
CALLCOUNT;調用子程序統計出各類字符的個數
CALLDISPBX;調用子程序顯示數字字符的個數
MOVBX, CX
CALLDISPBX ;調用子程序顯示字母的個數
MOVBX, DI
CALLDISPBX;調用子程序顯示其它字符的個數
.EXIT 0
END
例7.2是采用約定存儲單元傳遞參數的例子,所處理的數據不是直接傳給子程序,而是把存儲它們的地址告訴子程序。
例7.4:編寫一個子程序分類統計出一個字符串中數字字符、字母和其它字符的個數。該字符串的首地址用DS:DX來指定(以0為字符串結束),各類字符個數分別存放BX、CX和DI中。
解:
;子程序功能:分類統計出字符串中數字字符、字母和其它字符的個數
;入口參數:DS:DX指向被統計的字符串
;出口參數:BX、CX和DI分別保存數字字符、字母和其它字符的個數
;算法描述:1、當字符在’0’~’9’范圍時,數字字符個數BX加1;
2、為了判斷簡單,先把字字母變成大寫字母;
3、當字符在’A’~’Z’范圍時,字母個數CX加1;
4、否則,其它字符個數DI加1。
COUNTPROC
PUSHAX
PUSHSI
XORBX, BX
XORCX, CX
XORDI, DI;上三條指令使各類字符計數清零
MOVSI, DX
again:MOVAL, [SI]
INCSI
CMPAL, 0
JEover
CMPAL, ’0’
JLother
CMPAL, ’9’
JGnext
INCBX;數字字符個數加1
JMPagain
next:CALLUPPER;調用子程序把AL中的字母變成大寫字母
CMPAL, ’A’
JLother
CMPAL, ’Z’
JGother
INCCX;字母個數加1
JMPagain
other:INCDI;其它字符個數加1
JMPagain
over:POPSI
POPAX
RET
COUNTENDP
例7.5 顯示出任意字符串中數字字符、字母和其它字符的個數。
解:
.MODELSMALL
.DATA
MSGDB ’KSDJ L0984/[]3oiu OIU OIU (*&(5341’, 0
.CODE
.STARTUP
LEADX, MSG;DS:DX指向待統計的字符串
CALLCOUNT;調用子程序統計出各類字符的個數
CALLDISPBX;調用子程序顯示數字字符的個數
MOVBX, CX
CALLDISPBX ;調用子程序顯示字母的個數
MOVBX, DI
CALLDISPBX;調用子程序顯示其它字符的個數
.EXIT 0
END

