例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 | ||||