1.STRCPY的汇编实现
DATA SEGMENT STRING1 DB 'I AM A STRING!',0ah,0dh,'$' ;其中0ah,0dh表示回车换行 STRING2 DB 50 DUP(?) MESSAGE1 DB 0ah,0dh,'SOURCE STRING:','$' MESSAGE2 DB 0ah,0dh,'DESTINATION STRING:','$' DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX LEA SI,STRING1 ;得到STRING1的段内相对偏移地址 MOV AX,SEG STRING2 MOV ES,AX ;将STRING2的段地址给ES LEA DI,STRING2 ;得到STRING2的段内相对偏移地址 MOV CX,17 LOOP1: MOVSB ;将DS:SI一个字节的数据搬运到ES:DI中 LOOP LOOP1 LEA DX,MESSAGE1 MOV AH,09H INT 21H LEA DX,STRING1 MOV AH,09H INT 21H ;打印STRING1的信息 LEA DX,MESSAGE2 MOV AH,09H INT 21H LEA DX,STRING2 MOV AH,09H INT 21H ;打印STRING2的信息 MOV AH,4CH INT 21H CODE ENDS END START
程序运行结果:
2.在一段字符串中匹配子串,并替换为另一个子串(两子串长度相同)
STACK SEGMENT PARA STACK STACK_AREA DW 100H DUP(?) STACK_BTM EQU $ - STACK_AREA STACK ENDS DATA SEGMENT STRING1 DB 'ZHANGCHONGZHI' ;原有的字符串 STRING2 DB 'CHONGZHIZHANG' ;替换后的字符串 STR_LEN DW STRING2 - STRING1 ;字符串的长度 RAM_AREA DB 'LINE 1: ZHANGCHONGZHI IS A STUDENT OF SCSE,BUAA.',0DH,0AH DB 'LINE 2: ZHANGCHONGZHI IS A BOY.',0DH,0AH DB 'LINE 3: ZHANGCHONGZHI IS INTERESTED IN DEEP LEARNING.',0DH,0AH DB '$' ;查找的内存区域 AREA_LEN EQU $ - RAM_AREA AREA_END DW $ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV AX,STACK_BTM MOV SP,AX ;初始化段寄存器 LEA DX,RAM_AREA MOV AH,09H INT 21H ;打印替换之前的内存里的内容 CALL SEARCH_REPLACE LEA DX,RAM_AREA ;打印替换之后的内存里的内容 MOV AH,09H INT 21H MOV AH,4CH INT 21H MAIN ENDP SEARCH_REPLACE PROC PUSH DI PUSH AX PUSH BX PUSH SI ;调用分程序的时候,先将本程序会改变的寄存器原有数据保存到栈里 LEA DI,RAM_AREA LEA BX,AREA_END LOOP1: CMP DI,BX JA PROC_END ;如果将内存区域都扫描过了,就返回主程序 LEA SI,STRING1 MOV CX,STR_LEN PUSH DI LOOP2: MOV AL,BYTE PTR [SI] CMP BYTE PTR [DI],AL ;开始逐字节的比较是否匹配原有的字符串 JNZ CONTINUE1 ;匹配失败,返回之前的DI的下一个字节重新寻找 INC SI INC DI LOOP LOOP2 LEA SI,STRING2 POP DI CALL REPLACE JMP CONTINUE2 ;匹配成功,替换之后,跳过替换部分,继续开始寻找 CONTINUE1: POP DI INC DI JMP LOOP1 CONTINUE2: ADD DI,STR_LEN JMP LOOP1 PROC_END: POP SI POP BX POP AX POP DI ;返回上级程序的时候,将保存的寄存器原有数据从栈里调回寄存器 RET SEARCH_REPLACE ENDP REPLACE PROC PUSH CX CLD MOV CX,STR_LEN REP MOVSB ;逐字节的替换过程 POP CX RET REPLACE ENDP CODE ENDS END MAIN
程序运行结果:
3.在一段字符串中实现大小写转换
DATA SEGMENT STRING DB 'THIS is a String.',0DH,0AH,'$' LEN EQU 25 UPSTRING DB 50 DUP(?) DOWNSTRING DB 50 DUP(?) MSG1 DB 'TO LOWER: $' MSG2 DB 'TO UPPER: $' MSG3 DB 'ORIGINAL: $' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR MOV AX,DATA ;初始化 MOV DS,AX LEA DX,MSG3 ;打印源字符串 MOV AH,09H INT 21H LEA DX,STRING MOV AH,09H INT 21H LEA DX,MSG2 MOV AH,09H INT 21H LEA SI,STRING LEA DI,UPSTRING MOV CX,LEN LOOP1: CMP BYTE PTR DS:[SI],61H ;将源字符串转化成全大写 JB NEXT CMP BYTE PTR DS:[SI],7AH JA NEXT MOV AL,BYTE PTR DS:[SI] SUB AL,20H MOV BYTE PTR DS:[DI],AL JMP NEXT2 NEXT: MOV AL,BYTE PTR DS:[SI] MOV BYTE PTR DS:[DI],AL NEXT2: INC SI INC DI LOOP LOOP1 LEA DX,UPSTRING ;打印全大写的字符串 MOV AH,09H INT 21H LEA DX,MSG1 MOV AH,09H INT 21H LEA SI,STRING LEA DI,DOWNSTRING MOV CX,LEN LOOP2: CMP BYTE PTR DS:[SI],41H ;将源字符串转化成全小写 JB NEXT3 CMP BYTE PTR DS:[SI],5AH JA NEXT3 MOV AL,BYTE PTR DS:[SI] ADD AL,20H MOV BYTE PTR DS:[DI],AL JMP NEXT4 NEXT3: MOV AL,BYTE PTR DS:[SI] MOV BYTE PTR DS:[DI],AL NEXT4: INC SI INC DI LOOP LOOP2 LEA DX,DOWNSTRING ;打印全小写的字符串 MOV AH,09H INT 21H EXIT: MOV AX,4C00H INT 21H MAIN ENDP CODE ENDS END MAIN
程序运行结果:
4.三个长度相同的字符串根据字典序排序
DATA SEGMENT STRING1 DB 'ABOVE$' STRING2 DB 'ABOUT$' STRING3 DB 'AGAIN$' TEMP_STRING DB 10 DUP(?) MY_ENTER DB 0DH,0AH,'$' STRING_LEN EQU 6 DATA ENDS STACK SEGMENT PARA STACK STACK_AREA DW 100H DUP(?) STACK_BTM EQU $ - STACK_AREA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,STACK_BTM MOV SP,AX ;初始化段寄存器 LEA SI,STRING1 LEA DI,STRING2 MOV AX,SEG STRING1 MOV DS,AX MOV AX,SEG STRING2 MOV ES,AX MOV CX,5 LOOP1: MOV AL,BYTE PTR DS:[SI] CMP AL,BYTE PTR ES:[DI] JA NEED_SWAP1 JB NO_NEED_SWAP1 INC SI INC DI LOOP LOOP1 NEED_SWAP1: LEA SI,STRING1 LEA DI,STRING2 LEA DX,TEMP_STRING MOV BX,SEG TEMP_STRING CALL SWAP NO_NEED_SWAP1: LEA SI,STRING1 LEA DI,STRING3 MOV AX,SEG STRING1 MOV DS,AX MOV AX,SEG STRING3 MOV ES,AX MOV CX,5 LOOP2: MOV AL,BYTE PTR DS:[SI] CMP AL,BYTE PTR ES:[DI] JA NEED_SWAP2 JB NO_NEED_SWAP2 INC SI INC DI LOOP LOOP2 NEED_SWAP2: LEA SI,STRING1 LEA DI,STRING3 LEA DX,TEMP_STRING CALL SWAP NO_NEED_SWAP2: LEA SI,STRING2 LEA DI,STRING3 MOV AX,SEG STRING2 MOV DS,AX MOV AX,SEG STRING3 MOV ES,AX MOV CX,5 LOOP3: MOV AL,BYTE PTR DS:[SI] CMP AL,BYTE PTR ES:[DI] JA NEED_SWAP3 JB NO_NEED_SWAP3 INC SI INC DI LOOP LOOP3 NEED_SWAP3: LEA SI,STRING2 LEA DI,STRING3 LEA DX,TEMP_STRING CALL SWAP NO_NEED_SWAP3: MOV AX,SEG STRING1 MOV DS,AX LEA DX,STRING1 MOV AH,09H INT 21H MOV AX,SEG MY_ENTER MOV DS,AX LEA DX,MY_ENTER MOV AH,09H INT 21H MOV AX,SEG STRING2 MOV DS,AX LEA DX,STRING2 MOV AH,09H INT 21H MOV AX,SEG MY_ENTER MOV DS,AX LEA DX,MY_ENTER MOV AH,09H INT 21H MOV AX,SEG STRING3 MOV DS,AX LEA DX,STRING3 MOV AH,09H INT 21H EXIT: MOV AX,4C00H INT 21H MAIN ENDP SWAP PROC PUSH AX ;默认第一个STRING在DS:SI,第二个STRING在ES:DI,TEMP在DS:DX中 PUSH CX MOV CX,STRING_LEN SWAP1: MOV AL,BYTE PTR DS:[SI] ;第一个串复制到temp中 XCHG DX,SI MOV BYTE PTR DS:[SI],AL XCHG DX,SI INC SI INC DX LOOP SWAP1 SUB SI,STRING_LEN SUB DX,STRING_LEN MOV CX,STRING_LEN SWAP2: MOV AH,BYTE PTR ES:[DI] ;第二个串复制到第一个中 MOV BYTE PTR DS:[SI],AH INC DI INC SI LOOP SWAP2 SUB DI,STRING_LEN SUB SI,STRING_LEN MOV CX,STRING_LEN SWAP3: XCHG SI,DX MOV AL,BYTE PTR DS:[SI] ;temp串复制到第二个中 MOV BYTE PTR ES:[DI],AL XCHG SI,DX INC DI INC DX LOOP SWAP3 SUB DI,STRING_LEN SUB DX,STRING_LEN POP CX POP AX RET SWAP ENDP CODE ENDS END MAIN
程序运行结果: