314 lines
5.0 KiB
Markdown
314 lines
5.0 KiB
Markdown
# 实验七:字符串操作
|
||
|
||
## 一、基础性实验
|
||
|
||
### 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. 字符串连接程序中使用什么方法实现字符串复制? |