微机原理实验1:字符串匹配程序实验

一、实验目的

1.掌握分支程序的设计方法。
2.熟悉在PC机上建立、汇编、链接、调试和运行8086汇编程序的过程。

二、实验内容

1.比较两个字符串STRING1和STRING2所含的字符是否相同,若相同则显示‘Match’,否则显示‘No Match’。
2.修改程序,显示所比较字符的个数。

三、程序清单

DATAREA SEGMENT    ; 数据段
STRING1 DB      'Move the cursor backward.'
STRING2 DB      'Move the cursor backward.'

MESS1   DB      'Match.',13,10,'$'
MESS2   DB      'No match.',13,10,'$'
DATAREA ENDS
PROGNAM SEGMENT    ; 代码段
MAIN    PROC    FAR
        ASSUME  CS:PROGNAM,DS:DATAREA,ES:DATAREA    
START:  PUSH    DS
        SUB     AX,AX
        PUSH    AX
        MOV     AX,DATAREA
        MOV     DS,AX    ; DS指向数据段
        MOV     ES,AX    ; ES指向数据段
        LEA     SI,STRING1    ; 源数据寄存器
        LEA     DI,STRING2    ; 目的数据寄存器
        CLD                   ; DF=0,向高地址增加
        MOV     CX,STRING2-STRING1    ; 字符串STRING1的长度
        REPZ    CMPSB                 ; 当CX!=0并且ZF=1时 重复执行后边的指令,每执行一次CX的值减1 
        ;CMPSB 指令比较 SI 指向的内存操作数与 DI 指向的内存操作数,按字节比较
        JZ MATCH                      ; 比较完ZF=1则 匹配,否则 不匹配
        LEA     DX,MESS2
        JMP DISP
MATCH:  LEA     DX,MESS1
DISP:   MOV     AH,09H
        INT     21H
        RET
MAIN    ENDP
PROGNAM ENDS
        END     START

四、实验过程

1.用编辑器建立源文件D101-1.ASM
微机原理实验1:字符串匹配程序实验_第1张图片
2.用汇编程序MASM.EXE对源文件进行汇编,产生目标文件,再用连接程序LINK产生可执行文件
微机原理实验1:字符串匹配程序实验_第2张图片
3.使用调试工具DEBUG进行程序调试
先用U命令反汇编,以便了解指令地址。显示结果如下∶
微机原理实验1:字符串匹配程序实验_第3张图片
将断点设置在程序的主要部分运行前。
在这里插入图片描述
用G命令将程序运行到寄存器初始化后暂停,查看当前数据段中的值,如下:
微机原理实验1:字符串匹配程序实验_第4张图片
用R命令查看当前各个寄存器中的值如下:
在这里插入图片描述
用E命令将数据区的字符串backward,修改为forward.,如下:
微机原理实验1:字符串匹配程序实验_第5张图片

五、实验结果分析

1.程序执行结果
在这里插入图片描述
通过E命令修改STRING2为“Move the cursor forward.”后再运行程序,得到结果为“No match.”,即两个字符串内容不相同,如下。但使用L命令重新加载程序,结果还是“Match.”,这正说明了DEBUG调试期间所修改的数据段或代码段的内容只是修改内存中的内容,而磁盘文件并未改变。
微机原理实验1:字符串匹配程序实验_第6张图片微机原理实验1:字符串匹配程序实验_第7张图片
重新进入编辑器,通过编辑代码修改字符串的内容,使它们互不相同,如下:
在这里插入图片描述
然后重新汇编、连接、执行。其运行结果应为: No match!
在这里插入图片描述
2.分析总结
首先,实验指导书上所给的程序缺少2行代码需要自己进行补齐,才可以实现本实验的目的和该程序的功能,这两行代码分别是JZ MATCH和JMP DISP。其中,第一句代码的功能是在CX寄存器递减到值为0时,如果此时源操作地址和目的操作地址中的字节相同,那么说明两个字符串是相同的,则跳转到匹配标号;否则不跳转,执行第二句JMP指令。

其次,该实验的核心所在是指令REPZ CMPSB,只要把该条指令的执行过程搞明白了,那么整个实验原理基本就没什么问题了,该条指令中REPZ其含义为:当CX!=0并且ZF=1时,则重复执行后面紧接着的指令即CMPSB,每执行一次CX的值减1;而CMPSB指令的含义为:按字节比较比较SI指向的内存操作数与DI指向的内存操作数,也就是对两个操作数进行相减的操作,显然该操作影响标志位,因此其后面一般跟随跳转指令,在该程序中为JZ MATCH。

你可能感兴趣的:(posgradu小记)