139139139 2007-11-3 15:06
存储单元传递参数
在调用子程序时,当需要向子程序传递大量数据时,因受到寄存器容量的限制,就不能采用寄存器传递参数的方式,而要改用约定存储单元的传送方式。这种参数传递方式有点象情报人员和联络人员之间的传递信息方式,一个向指定地点放情报,另一个从指定地点取情报。 <br/><br/> 例7.2是采用约定存储单元传递参数的例子,所处理的数据不是直接传给子程序,而是把存储它们的地址告诉子程序。<br/> <br/> 例7.4:编写一个子程序分类统计出一个字符串中数字字符、字母和其它字符的个数。该字符串的首地址用DS:DX来指定(以0为字符串结束),各类字符个数分别存放BX、CX和DI中。 <br/><br/> 解: <br/> ;子程序功能:分类统计出字符串中数字字符、字母和其它字符的个数 <br/><br/> ;入口参数:DS:DX指向被统计的字符串 <br/><br/> ;出口参数:BX、CX和DI分别保存数字字符、字母和其它字符的个数 <br/><br/> ;算法描述:1、当字符在’0’~’9’范围时,数字字符个数BX加1; <br/><br/> 2、为了判断简单,先把字字母变成大写字母; <br/><br/> 3、当字符在’A’~’Z’范围时,字母个数CX加1; <br/><br/> 4、否则,其它字符个数DI加1。 <br/><br/> COUNTPROC <br/> PUSHAX <br/> PUSHSI <br/> XORBX, BX <br/> XORCX, CX <br/> XORDI, DI;上三条指令使各类字符计数清零 <br/> MOVSI, DX <br/> again:MOVAL, [SI] <br/> INCSI <br/> CMPAL, 0 <br/> JEover <br/> CMPAL, ’0’ <br/> JLother <br/> CMPAL, ’9’ <br/> JGnext <br/> INCBX;数字字符个数加1 <br/> JMPagain <br/> next:CALLUPPER;调用子程序把AL中的字母变成大写字母 <br/> CMPAL, ’A’ <br/> JLother <br/> CMPAL, ’Z’ <br/> JGother <br/> INCCX;字母个数加1 <br/> JMPagain <br/> other:INCDI;其它字符个数加1 <br/> JMPagain <br/> over:POPSI <br/> POPAX <br/> RET <br/> COUNTENDP <br/><br/> 例7.5 显示出任意字符串中数字字符、字母和其它字符的个数。 <br/> 解: <br/> .MODELSMALL <br/> .DATA <br/> MSGDB ’KSDJ L0984/[]3oiu OIU OIU (*&(5341’, 0 <br/> .CODE <br/> .STARTUP <br/> LEADX, MSG;DS:DX指向待统计的字符串 <br/> CALLCOUNT;调用子程序统计出各类字符的个数 <br/> CALLDISPBX;调用子程序显示数字字符的个数 <br/> MOVBX, CX <br/> CALLDISPBX ;调用子程序显示字母的个数 <br/> MOVBX, DI <br/> CALLDISPBX;调用子程序显示其它字符的个数 <br/> .EXIT 0 <br/> END