例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