一、实验目的
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 FARASSUME CS:PROGNAM,DS:DATAREA,ES:DATAREA
START: PUSH DSSUB AX,AXPUSH AXMOV AX,DATAREAMOV 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,MESS2JMP DISP
MATCH: LEA DX,MESS1
DISP: MOV AH,09HINT 21HRET
MAIN ENDP
PROGNAM ENDSEND START
四、实验过程
1.用编辑器建立源文件D101-1.ASM
2.用汇编程序MASM.EXE对源文件进行汇编,产生目标文件,再用连接程序LINK产生可执行文件
3.使用调试工具DEBUG进行程序调试
先用U命令反汇编,以便了解指令地址。显示结果如下∶
将断点设置在程序的主要部分运行前。
用G命令将程序运行到寄存器初始化后暂停,查看当前数据段中的值,如下:
用R命令查看当前各个寄存器中的值如下:
用E命令将数据区的字符串backward,修改为forward.,如下:
五、实验结果分析
1.程序执行结果
通过E命令修改STRING2为“Move the cursor forward.”后再运行程序,得到结果为“No match.”,即两个字符串内容不相同,如下。但使用L命令重新加载程序,结果还是“Match.”,这正说明了DEBUG调试期间所修改的数据段或代码段的内容只是修改内存中的内容,而磁盘文件并未改变。
重新进入编辑器,通过编辑代码修改字符串的内容,使它们互不相同,如下:
然后重新汇编、连接、执行。其运行结果应为: 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。