|
|
![]() |
例10.2 编写一个把字符串中的所有小写字符转换成大写字符的子程序Strupr,要求字符串的首地址和结束符为其入口参数。
解: | |||
.MODEL SMALL, C | |||
.DATA | |||
buff |
DB "This is a example.", 0 | ||
.CODE | |||
Strupr | PROC USES AX BX, String:PTR BYTE, Tail:BYTE | ||
MOV | BX, String | ||
.REPEAT | |||
MOV |
AL, [BX] | ||
.IF AL>='a' && AL<='z' |
|||
SUB |
AL, 20H | ||
MOV |
[BX], AL | ||
.ENDIF |
|||
INC |
BX | ||
.UNTIL | AL==Tail | ||
RET | |||
Strupr | ENDP | ||
.STARTUP | |||
INVOKE Strupr, ADDR buff, 0 | |||
.EXIT 0 | |||
END |
例10.3 编写一个从字符串中拷贝子串的子程序Strncpy,它有四个参数str1、str2、idx和num,其具体功能为把字符串str2中从第idx个(从0开始记数)字符开始、num个字符传送给str1,字符串str1和str2都是以ASCII码0为结束符。
解: | ||||
.MODEL | SMALL, C | |||
.DATA | ||||
str1 |
DB "12345ABCDEF", 0 | |||
str2 |
DB 20 DUP('A') | |||
.CODE | ||||
Strlen | PROC USES AX BX, String:PTR BYTE | |||
…… | ;参见例10.1 | |||
Strlen | ENDP | |||
Strncpy | PROC USES AX CX DI SI DS ES, str1:FAR PTR BYTE, str2:FAR PTR BYTE, idx:WORD, num:WORD | |||
LES | DI, str1 | |||
LDS | SI, str2 | ;取两个字符串的首地址 | ||
INVOKE | Strlen, SI | ;计算源字符串的长度,在CX中 | ||
MOV | AX, idx | |||
.IF AX >= CX | ;若字符起点就超过源串的长度 | |||
MOV |
BYTE PTR ES:[DI], 0 | ;拷贝的字符串为“空” | ||
JMP |
over | |||
.ENDIF | ||||
ADD | SI, AX | ;定源串中字符的起点SI | ||
MOV | CX, num | |||
CLD | ||||
.REPEAT | ||||
LODSB |
||||
STOSB |
||||
.UNTILCXZ AL==0 | ||||
.IF AL!=0 | ;设置目标串的结束符 | |||
MOV |
BYTE PTR[DI], 0 | |||
.ENDIF | ||||
over: | RET | |||
Strncpy | ENDP | |||
.STARTUP | ||||
INVOKE | Strncpy, ADDR str2, ADDR str1, 3, 5 | |||
.EXIT | 0 | |||
END |