Files
Operating-System/Experiment/asm-exp/实验七/字符串操作实验.md
2026-06-25 00:09:09 +08:00

314 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 实验七:字符串操作
## 一、基础性实验
### 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. 字符串连接程序中使用什么方法实现字符串复制?