前面已经通过动手实现冒泡排序和大数乘法熟悉了X86的基本编程,此次作业则完成串处理相关操作。
本次主要实现四个程序:拷贝字符串、字符串的查找与替换、字符串的大小写转换、字符串的字典序排序
一、字符串拷贝
程序实现的功能是实现strcpy函数,我们很容易能够使用高级语言实现,用汇编则比较繁复。
我们使用LODSB STOSB命令来完成字符串的拷贝,同高级语言,我们仍然要考虑字符串重叠的问题,那么
就必须判别字符串首部的位置:
SI > DI,则正向复制,其他情况则反向复制
明确了这个,就很容易完成以下代码:
STACK SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU $ - STACK_AREA
STACK ENDS
DATA SEGMENT PARA
DRC1 DB 2 DUP(0)
SRC DB 'TEST STRING',00H
SRC_LEN EQU $ - SRC
DRC2 DB 'DRC2'
DB 10H DUP(0)
CPY_LEN EQU SRC_LEN ;此处设置拷贝字符串长度
DATA ENDS
CODE SEGMENT PARA
ASSUME DS:DATA,CS:DATA,SS:STACK,ES:DATA
MAIN PROC FAR
MOV AX,DATA ;INIT
MOV DS,AX
MOV ES,AX
CALL DISP_STR
MOV SI,OFFSET SRC
MOV DI,OFFSET DRC2
MOV CX,CPY_LEN
CALL STRCPY1
CALL DISP_STR
EXIT: MOV AX,4C00H
INT 21H
MAIN ENDP
STRCPY1 PROC
MOV AX,CPY_LEN
CMP AX,0
JZ STR1_END
CMP SI,DI
JA STR1_CLD ;SI > DI 正向复制
STR1_STD: STD
XOR AX,AX
ADD AX,CPY_LEN
DEC AX
ADD SI,AX
ADD DI,AX
JMP STR1_LP1
STR1_CLD: CLD
STR1_LP1: LODSB
STOSB
LOOP STR1_LP1
STR1_END: RET
STRCPY1 ENDP
DISP_STR PROC ;DOS中显示目的字符串
PUSH SI
PUSH DX
MOV SI,OFFSET DRC2 ;目的字符串
CLD
DISP1: LODSB
CMP AL,0
JZ DISP_EXIT
MOV DL,AL
MOV AH,2
INT 21H
JMP SHORT DISP1
DISP_EXIT: MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
INT 21H