5.0 KiB
5.0 KiB
实验七:字符串操作
一、基础性实验
1.1 实验目的
掌握汇编语言中字符串操作指令的使用方法。
1.2 实验内容
程序 1:字符串复制程序
将一个字符串复制到另一个内存位置。
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:字符串比较程序
比较两个字符串是否相等。
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:字符串查找程序
在字符串中查找指定字符。
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:字符串转换程序
将小写字母转换为大写。
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 思考题
- MOVS 指令与 REP 前缀配合使用时,有什么注意事项?
- CMPS 指令在比较字符串时会影响哪些标志位?
- SCAS 指令常用于什么场景?
二、加强性实验
2.1 实验目的
掌握字符串操作指令的综合应用,实现复杂的字符串处理功能。
2.2 实验内容
程序 1:字符串排序程序
对一组字符串进行排序。
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:字符串替换程序
将字符串中的指定字符替换为另一个字符。
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:多字符串连接程序
将多个字符串连接成一个字符串。
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 思考题
- 字符串排序中使用什么算法?该算法的特点是什么?
- 在字符串替换中,如何判断是否找到了需要替换的字符?
- 字符串连接程序中使用什么方法实现字符串复制?