# 实验七:字符串操作 ## 一、基础性实验 ### 1.1 实验目的 掌握汇编语言中字符串操作指令的使用方法。 ### 1.2 实验内容 #### 程序 1:字符串复制程序 将一个字符串复制到另一个内存位置。 ```asm DATAS SEGMENT STRING DB 'Hello, World!', 0 STRING_LEN EQU $-STRING DATAS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS START: MOV AX, DATAS MOV DS, AX LEA SI, STRING MOV DI, 2000H MOV CX, STRING_LEN CLD REP MOVSB MOV AH, 4CH INT 21H CODES ENDS END START ``` #### 程序 2:字符串比较程序 比较两个字符串是否相等。 ```asm DATAS SEGMENT STR1 DB 'ABCDE' STR2 DB 'ABCDF' RESULT DB ? DATAS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS START: MOV AX, DATAS MOV DS, AX LEA SI, STR1 LEA DI, STR2 MOV CX, 5 CLD REP CMPSB JZ EQUAL MOV RESULT, 0 JMP DONE EQUAL: MOV RESULT, 1 DONE: MOV AH, 4CH INT 21H CODES ENDS END START ``` #### 程序 3:字符串查找程序 在字符串中查找指定字符。 ```asm DATAS SEGMENT STR DB 'This is a test string', 0 CHAR DB 't' POS DB ? DATAS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS START: MOV AX, DATAS MOV DS, AX LEA SI, STR MOV AL, CHAR MOV CX, 100 CLD REP SCASB JZ FOUND MOV POS, 0FFH JMP DONE FOUND: DEC SI MOV POS, SI DONE: MOV AH, 4CH INT 21H CODES ENDS END START ``` #### 程序 4:字符串转换程序 将小写字母转换为大写。 ```asm DATAS SEGMENT STR DB 'hello world', 0 STR_LEN EQU $-STR DATAS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS START: MOV AX, DATAS MOV DS, AX LEA SI, STR MOV CX, STR_LEN NEXT: LODSB CMP AL, 'a' JB SKIP CMP AL, 'z' JA SKIP SUB AL, 20H MOV [SI-1], AL SKIP: LOOP NEXT MOV AH, 4CH INT 21H CODES ENDS END START ``` ### 1.3 实验结果 程序运行后,字符串操作指令成功完成复制、比较、查找和转换功能。REP MOVSB 指令完成字符串复制,REP CMPSB 完成字符串比较,REP SCASB 完成字符查找。 ### 1.4 思考题 1. MOVS 指令与 REP 前缀配合使用时,有什么注意事项? 2. CMPS 指令在比较字符串时会影响哪些标志位? 3. SCAS 指令常用于什么场景? --- ## 二、加强性实验 ### 2.1 实验目的 掌握字符串操作指令的综合应用,实现复杂的字符串处理功能。 ### 2.2 实验内容 #### 程序 1:字符串排序程序 对一组字符串进行排序。 ```asm DATAS SEGMENT STRINGS DB 'banana', 0 DB 'apple', 0 DB 'orange', 0 DB 'grape', 0 N DB 4 DATAS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS START: MOV AX, DATAS MOV DS, AX MOV CH, 0 MOV CL, N DEC CL OUTER_LOOP: MOV SI, OFFSET STRINGS MOV DI, SI ADD DI, 7 MOV BL, CL INNER_LOOP: MOV AH, 0 PUSH SI COMPARE_LOOP: MOV AL, [SI] CMP AL, [DI] JA SWAP JB NO_SWAP INC SI INC DI CMP AL, 0 JNE COMPARE_LOOP JMP NO_SWAP SWAP: POP SI PUSH DI MOV CX, 7 CLD REP MOVSB POP SI ADD SI, 7 MOV DI, SI ADD DI, 7 DEC BL JNZ INNER_LOOP JMP CONT NO_SWAP: POP SI ADD SI, 7 MOV DI, SI ADD DI, 7 DEC BL JNZ INNER_LOOP CONT: DEC CH JNZ OUTER_LOOP MOV AH, 4CH INT 21H CODES ENDS END START ``` #### 程序 2:字符串替换程序 将字符串中的指定字符替换为另一个字符。 ```asm DATAS SEGMENT STR DB 'This is a test string', 0 OLD_CHAR DB 't' NEW_CHAR DB 'T' DATAS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS START: MOV AX, DATAS MOV DS, AX LEA SI, STR MOV AL, OLD_CHAR MOV AH, NEW_CHAR NEXT: CMP BYTE PTR [SI], 0 JE DONE CMP [SI], AL JNE SKIP MOV [SI], AH SKIP: INC SI JMP NEXT DONE: MOV AH, 4CH INT 21H CODES ENDS END START ``` #### 程序 3:多字符串连接程序 将多个字符串连接成一个字符串。 ```asm DATAS SEGMENT STR1 DB 'Hello', 0 STR2 DB ' ', 0 STR3 DB 'World', 0 STR4 DB '!', 0 RESULT DB 50 DUP(?) DATAS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS START: MOV AX, DATAS MOV DS, AX LEA DI, RESULT LEA SI, STR1 CALL COPY_STR LEA SI, STR2 CALL COPY_STR LEA SI, STR3 CALL COPY_STR LEA SI, STR4 CALL COPY_STR MOV AH, 4CH INT 21H COPY_STR PROC CLD COPY_LOOP: LODSB CMP AL, 0 JE COPY_DONE STOSB JMP COPY_LOOP COPY_DONE: RET COPY_STR ENDP CODES ENDS END START ``` ### 2.3 实验结果 程序运行后,成功实现了字符串排序、替换和连接功能。字符串排序采用冒泡算法,通过字符串比较指令完成元素交换。 ### 2.4 思考题 1. 字符串排序中使用什么算法?该算法的特点是什么? 2. 在字符串替换中,如何判断是否找到了需要替换的字符? 3. 字符串连接程序中使用什么方法实现字符串复制?