一、
[要求] 完成strcpy 并考虑三种传递参数的情况
[源程序]
a. 段内调用,堆栈传递参数
STRCPY PROC NEAR
PUSH BP
MOV BP,SP
PUSH AX
PUSH SI
PUSH DI
MOV DI,[BP+4]
MOV SI,[BP+6]
CLD
STRCPY_LP:
LODSB
STOSB
CMP AL,0
JZ STRCPY_END
JMP STRCPY_LP
STRCPY_END:
POP DI
POP SI
POP AX
POP BP
RET 4
STRCPY ENDP
b.段内调用、寄存器传递参数
STRCPY2 PROC
PUSH AX
STRCPY2_LP:
LODSB
CMP AL,0
JZ STRCPY2_EXIT
STOSB
JMP STRCPY2_LP
STRCPY2_EXIT:
POP AX
RET
STRCPY2 ENDP
c.段间调用、堆栈传递参数
STRCPY3 PROC FAR
PUSH BP
MOV BP,SP
PUSH AX
PUSH SI
PUSH DI
MOV DI,[BP+6]
MOV SI,[BP+8]
CLD
STRCPY3_LP:
LODSB
STOSB
CMP AL,0
JZ STRCPY3_END
JMP STRCPY3_LP
STRCPY3_END:
POP DI
POP SI
POP AX
POP BP
RET 6
STRCPY3 ENDP
[运行截图]
二、
[要求] 查找"名称1"替换成 "名称2"
[原理] 使用一块内存作为buff,先在原字符串中找到第一个待替换字符串,将原字符串从起点到这个字符串的开始位置为止,复制到buff中,并将所替换的串拼接到buff中,将原字符串指针移到代替换串之后,重复执行以上步骤直到寻找不到代替换字符串,这时将剩余部分也拼接到buff中,最后将buff复制回原字符串完成替换操作。
[源程序]
REPLACE PROC
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
PUSH AX
PUSH BX
PUSH CX
MOV SI,[BP+8] ;src : string to be operated
LEA BX,BUFFER ;store buffer address
CLD
REPLACE_LP:
MOV DI,[BP+6] ;rep : string to be replaced
PUSH SI
PUSH DI
CALL FIND
CMP AX,-1
JNZ REPLACE_FOUND
JZ REPLACE_NOT_FOUND
REPLACE_FOUND:
MOV CX,AX ;copy src to buffer
SUB CX,SI
MOV DI,BX
REP MOVSB
PUSH SI ;copy dst to buffer
MOV SI,[BP+4]
CALL STRCPY2
POP SI
MOV BX,DI
MOV CX,-1
MOV DI,[BP+6] ;calculate length of rep
MOV AL,0
REPNE SCASB
NEG CX
SUB CX,2 ;CX=1+len(rep)+1
ADD SI,CX
JMP REPLACE_LP
REPLACE_NOT_FOUND:
MOV DI,BX ;copy left src to buff
CALL STRCPY2
LEA SI,BUFFER ;copy buffer to src
MOV DI,[BP+8]
CALL STRCPY2
POP CX
POP BX
POP AX
POP DI
POP SI
POP BP
RET 6
REPLACE ENDP
FIND PROC
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
PUSH CX
MOV SI,[BP+6] ;string to find in
MOV DI,[BP+4] ;string to match
MOV AX,0
MOV CX,0
CLD
FIND_LP:
CMP [DI],AL
JZ FIND_SUCCESS
CMP [SI],AL
JZ FIND_FAILED
CMPSB
JZ FIND_MATCH
JNZ FIND_NOTMATCH
FIND_MATCH:
INC CX
JMP FIND_LP
FIND_NOTMATCH:
MOV CX,0
MOV DI,[BP+4]
JMP FIND_LP
FIND_SUCCESS:
SUB SI,CX
MOV AX,SI
JMP FIND_EXIT
FIND_FAILED:
MOV AX,-1
JMP FIND_EXIT
FIND_EXIT:
POP CX
POP DI
POP SI
POP BP
RET 4
FIND ENDP
[运行截图]
三、
[要求]:设计一个循环,完成大小写转换,复制,查找,并显示
预留,之后补充