|
|
![]() |
在调用子程序时,当需要向子程序传递大量数据时,因受到寄存器容量的限制,就不能采用寄存器传递参数的方式,而要改用约定存储单元的传送方式。这种参数传递方式有点象情报人员和联络人员之间的传递信息方式,一个向指定地点放情报,另一个从指定地点取情报。
例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。 |
|||
COUNT | PROC | |||
PUSH | AX | |||
PUSH | SI | |||
XOR | BX, BX | |||
XOR | CX, CX | |||
XOR | DI, DI | ;上三条指令使各类字符计数清零 | ||
MOV | SI, DX | |||
again: | MOV | AL, [SI] | ||
INC | SI | |||
CMP | AL, 0 | |||
JE | over | |||
CMP | AL, '0' | |||
JL | other | |||
CMP | AL, '9' | |||
JG | next | |||
INC | BX | ;数字字符个数加1 | ||
JMP | again | |||
next: | CALL | UPPER | ;调用子程序把AL中的字母变成大写字母 | |
CMP | AL, 'A' | |||
JL | other | |||
CMP | AL, 'Z' | |||
JG | other | |||
INC | CX | ;字母个数加1 | ||
JMP | again | |||
other: | INC | DI | ;其它字符个数加1 | |
JMP | again | |||
over: | POP | SI | ||
POP | AX | |||
RET | ||||
COUNT | ENDP |
例7.5 显示出任意字符串中数字字符、字母和其它字符的个数。
解: | ||||
.MODEL | SMALL | |||
.DATA | ||||
MSG |
DB 'KSDJ L0984/[]3oiu OIU OIU (*&(5341', 0 | |||
.CODE | ||||
.STARTUP | ||||
LEA | DX, MSG | ;DS:DX指向待统计的字符串 | ||
CALL | COUNT | ;调用子程序统计出各类字符的个数 | ||
CALL | DISPBX | ;调用子程序显示数字字符的个数 | ||
MOV | BX, CX | |||
CALL | DISPBX | ;调用子程序显示字母的个数 | ||
MOV | BX, DI | |||
CALL | DISPBX | ;调用子程序显示其它字符的个数 | ||
.EXIT 0 | ||||
END |