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