存儲單元傳遞參數

字號:

在調用子程序時,當需要向子程序傳遞大量數據時,因受到寄存器容量的限制,就不能采用寄存器傳遞參數的方式,而要改用約定存儲單元的傳送方式。這種參數傳遞方式有點象情報人員和聯絡人員之間的傳遞信息方式,一個向指定地點放情報,另一個從指定地點取情報。
    例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