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

5.0 KiB
Raw Permalink Blame History

实验七:字符串操作

一、基础性实验

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 思考题

  1. MOVS 指令与 REP 前缀配合使用时,有什么注意事项?
  2. CMPS 指令在比较字符串时会影响哪些标志位?
  3. 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 思考题

  1. 字符串排序中使用什么算法?该算法的特点是什么?
  2. 在字符串替换中,如何判断是否找到了需要替换的字符?
  3. 字符串连接程序中使用什么方法实现字符串复制?