8086汇编语言程序实验:
实验二、字符串匹配实验
题目:
1、 (必做题)编程实现:从键盘分别输入两个字符串(不必等长),然后进行比较,若两个字符串有相同的字符,则显示“MATCH”,若字符都不相同则显示“NO MATCH”。
2、 (选做题)编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度和对应字符都完全相同,则显示“MATCH”,否则显示“NO MATCH”。
对应程序如下所示:
;第1题
;====================================
HUICHE        MACRO            ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
    MOV    DL,0DH            ;2号功能“显示”回车。
    MOV    AH,02H
    INT    21H
    MOV    DL,0AH            ;2号功能“显示”换行。
    MOV    AH,02H
    INT    21H
    ENDM
DATA    SEGMENT
    MESSAGE1    DB  'MATCH','$'        ;定义“MATCH”提示信息,“$”作为调用9号功能的结束符。
    MESSAGE2    DB  'NO MATCH','$'    ;定义“NO  MATCH”提示信息。
    TISHI1        DB  'Please input the first string:','$'        ;提示输入第1个字符串的提示信息。
    TISHI2        DB  'Please input the second string:','$'    ;提示输入第1个字符串的提示信息。
    STRING1    DB  100                ; 100为存第一个字符串的最大可用空间的字节数。
                DB  ?                ;预留字节,存储将要输入的第1个字符串的实际长度。
                DB  100  DUP(?)        ;预留100个字节空间,用于存放第1个字符串。
    STRING2    DB  100
                DB  ?
                DB  100  DUP(?)
DATA    ENDS
STACK    SEGMENT                    ;定义一个50字节大小的堆栈段空间。
ZHAN            DB  50  DUP(?)
ZHANDING        EQU  LENGTH  ZHAN
STACK    ENDS
CODE    SEGMENT                    ;代码段开始。
    ASSUME    CS:CODE,DS:DATA,ES:DATA,SS:STACK
STARTUP:    MOV    AX,DATA        ;程序开始,首先将几个段寄存器初始化为各段的首地址。
    MOV    DS,AX                    ;
    MOV    ES,AX                    ;
    MOV    AX,STACK                ;
    MOV    SS,AX                    ;
    MOV    SP,ZHANDING            ;栈顶指针赋初值。
   
    MOV    DX,  OFFSET  TISHI1    ;9功能显示提示输入第1个字符串的提示信息。
    MOV    AH,9
    INT    21H
    HUICHE                    ;调用 宏定义的“回车换行”功能,程序运行到此处时进行回车换行。
    MOV    DX,  OFFSET  STRING1
    MOV    AH,0AH            ;10号功能输入第1个字符串。
    INT    21H
    HUICHE
    MOV    DX, OFFSET  TISHI2
    MOV    AH,9
    INT    21H
    HUICHE
    MOV    DX, OFFSET  STRING2        ;输入第2个字符串。
    MOV    AH,0AH
    INT    21H
    HUICHE
    CLD                    ; 方向标志位清0,按增址方向操作。
    MOV    SI, OFFSET  STRING1[2]    ;将第1个字符串第1个字符偏移地址传送给SI,为串搜索做准备。
    MOV    BX,0            ; BX为后面“记下第1个字符串已经被搜索过的字符的个数”做准备。
    MOV    CL, STRING1[1]
    MOV    CH,0            ; 将第1个字符串的实际长度赋给CX
L1:    PUSH    CX                        ;先将第1个字符串的实际长度压入堆栈,保留,为后面备用。
    MOV    DI, OFFSET  STRING2[2]    ;将第2个字符串第1个字符偏移地址传送给DI,为串搜索做准备。
    MOV    CL, STRING2[1]            ;将第2个字符串的实际长度传送给CX
    MOV    CH,0
    MOV    AL,[SI]
    REPNZ    SCASB        ;进行串搜索,将第2个字符串中的字符与第1个字符串的一个字符进行比较。
    JZ      XXX1
    INC    SI                ;SI1,指向第1个字符串的下一个字符。
    INC    BX                ;记下第1个字符串已经被搜索过的字符的个数。
    POP    CX
    CMP    CX,BX    ;“已经被搜索过的字符个数”BX与“第1个字符串实际长度”CX进行比较。
    JNZ    L1    ;BXCX不等,则进行“第1字符串的下一字符”与“第2字符串中的字符”的比较。
                ;BXCX相等,则进行执行下面的语句,显示“NO MACTH”。
    MOV    DX, OFFSET MESSAGE2            ;显示“NO MACTH”。
    MOV    AH,9
    INT    21H
    JMP    XXX2        ;显示“NO MACTH”后,跳转到XXX2,准备返回DOS系统。
   
XXX1:    MOV    DX, OFFSET MESSAGE1        ;显示“MACTH字符串长度和字节”。
    MOV    AH,9
    INT    21H
XXX2:    MOV    AH,1
    INT    21H            ;等待键盘响应,准备返回DOS系统。
    MOV    AH,4CH        ;返回DOS系统,准备结束程序。
    INT    21H
CODE    ENDS
END    STARTUP    ;程序从此处结束。
;===============================================================

;第2题
;=======================
HUICHE        MACRO            ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
    MOV    DL,0DH
    MOV    AH,02H
    INT    21H
    MOV    DL,0AH
    MOV    AH,02H
    INT    21H
    ENDM
DATA    SEGMENT
    MESSAGE1    DB 'MATCH','$'
    MESSAGE2    DB 'NO MATCH','$'
    TISHI1        DB 'Please input the first string:','$'
    TISHI2        DB 'Please input the second string:','$'
    STRING1    DB 100
                DB ?
                DB 100 DUP(?)
    STRING2    DB 100
                DB ?
                DB 100 DUP(?)
DATA    ENDS
CODE    SEGMENT
    ASSUME    CS:CODE,DS:DATA,ES:DATA
STARTUP:        MOV AX,DATA
    MOV    DS,AX
    MOV    ES,AX
   
    MOV    DX, OFFSET TISHI1
    MOV    AH,9
    INT    21H
    HUICHE                    ;调用 宏定义的“回车换行”功能,程序运行到此处时进行回车换行。
    MOV    DX,OFFSET  STRING1
    MOV    AH,0AH
    INT    21H
    HUICHE
    MOV    DX, OFFSET  TISHI2
    MOV    AH,9
    INT    21H
    HUICHE
    MOV    DX,OFFSET  STRING2
    MOV    AH,0AH
    INT    21H
    HUICHE
   
    CLD
    MOV    SI,OFFSET  STRING1[2]    ;将第1个字符串第1个字符偏移地址传送给SI,为串比较做准备。
    MOV    BL, STRING1[1]
    MOV    BH,0            ; 将第1个字符串的实际长度赋给BX
    MOV    DI,OFFSET  STRING2[2]    ;将第2个字符串第1个字符偏移地址传送给DI,为串比较做准备。
    MOV    CL, STRING2[1]
    MOV    CH,0            ; 将第2个字符串的实际长度赋给CX
    CMP    BX,CX            ;比较两个字符串的长度
    JNE    XXX0        ;若两个字符串的长度不相等,则转到XXX0处,显示“NO MACTH”。
    REPE    CMPSB        ;进行串比较,将第2个字符串与第1个字符串按字符逐一进行比较。
    JE      XXX1        ;若经过比较,两字符串完全相等,则跳到XXX1处,显示“MACTH”。
                        ;否则到XXX0处,显示“NO MACTH”。
XXX0:    MOV    DX, OFFSET  MESSAGE2        ;显示“NO MACTH”。
    MOV    AH,9
    INT    21H
    JMP    XXX2        ;显示“NO MACTH”后,跳转到XXX2,准备返回DOS系统。
   
XXX1:    MOV    DX, OFFSET  MESSAGE1        ;显示“MACTH”。
    MOV    AH,9
    INT    21H
XXX2:    MOV    AH,1    ;等待键盘响应,准备返回DOS系统。
    INT    21H
    MOV    AH,4CH
    INT    21H            ;返回DOS系统,准备结束程序。
CODE    ENDS
END    STARTUP    ;程序从此处结束。
;=====================================================

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。