match字符比较.docx
《match字符比较.docx》由会员分享,可在线阅读,更多相关《match字符比较.docx(16页珍藏版)》请在冰豆网上搜索。
match字符比较
微机原理实验报告
实验三循环程序的设计
1.实验目的
1)掌握提示信息的使用方法和键盘输入信息的用法;
2)掌握循环程序的设计方法
2.实验内容
编写程序,从键盘分别输入两个字符串,进行比较,若相同,则显示‘MATCH’,否则,显示‘NOMATCH’。
3.实验原理
强迫CPU重复执行一指令序列的程序结构是循环程序。
循环程序结构分成四部分:
初始化部分、循环处理部分、循环控制部分和结束部分。
4.程序及框图
1)程序框图
图4-1程序流程图
2)程序代码
CRLFMACRO
MOVAH,02H
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
MESS1DB'INPUTSTRING1:
',0DH,0AH,'$'
MESS2DB'INPUTSTRING2:
',0DH,0AH,'$'
MESS3DB'NOMATCH',0DH,0AH,'$'
MESS4DB'MATCH',0DH,0AH,'$'
MAXLEN1DB81
ACTLEN1DB?
STRING1DB81DUP(?
)
MAXLEN2DB81
ACTLEN2DB?
STRING2DB81DUP(?
)
DATAENDS
STACKSEGMENTPARASTACK'STACK'
STADB50DUP(?
)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
MOVSP,TOP
MOVAH,09H
MOVDX,OFFSETMESS1
INT21H
MOVAH,0AH
MOVDX,OFFSETMAXLEN1
INT21H
CRLF
MOVAH,09H
MOVDX,OFFSETMESS2
INT21H
MOVAH,0AH
MOVDX,OFFSETMAXLEN2
INT21H
CRLF
MOVSI,OFFSETACTLEN1
MOVBX,OFFSETACTLEN2
MOVAL,[SI]
CMPAL,[BX]
JNZNOMA
MOVCL,[BX]
AG:
INCSI
INCBX
MOVAL,[SI]
CMPAL,[BX]
JNZNOMA
DECCL
CMPCL,0
JNZAG
MOVAH,09H
MOVDX,OFFSETMESS4
INT21H
JMPDEND
NOMA:
MOVAH,09H
MOVDX,OFFSETMESS3
INT21H
DEND:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
5.实验调试过程
图5-2程序成功编译链接后获得lcy.EXE文件
1)进入DEBUG,利用G命令在源程序中首先在MOVAH,09处设置断点(GF),由图5-3可知,数据段DATA中的数据均正常写入内存单元,即MESS1、MESS2、MESS3和MESS4表示的字符串中各字符的ASCII码,以及数据缓冲器均写入内存单元,说明了程序的数据定义以及初始化的正确性。
图5-3数据段定义与初始化的断定设置
2)字符串的比较一共有三种情况:
(1)两个字符串长度不相同;
(2)两个字符串长度相同,字符串中有若干字符不相同;(3)两个字符串完全相同。
情况
(1):
两个字符串长度不相同,取字符串123456和abcd。
(1)用命令G43在MOVSI,0036处设置断点,由图5-4(a)可得,在DUBUG系统下,程序正常输出提示字符串MESS1“INPUTSTRING1:
”,该断点表明显示提示信息1的代码运行的准确性。
在输入字符串“123456”后,程序正常输出提示字符串MESS2“INPUTSTRING2:
”,该断点表明显示提示信息2的代码运行的准确性。
(2)由图5-4(a)可得,在输入字符串“123456”后,用D0命令查看数据段内存中数值变化,则在ACTLEN1存储单元中已存在输入字符长度6,在STRING1数组存储单元中已存储输入字符串“123456”的ASCII码31、32、33、34、35和36以及回车CR的ASCII码0D。
(a)
(b)
图5-4提示信息显示及读取键盘键入字符串的断点设置
(3)用D命令查看字符串2在内存单元中的存储内容,如图5-4(b),在ACTLEN2存储单元中已存在输入字符长度4,在STRING2数组存储单元中已存储输入字符串“abcd”的ASCII码61、62、63和64以及回车CR的ASCII码0D。
说明了读取键盘键入信息以及自动换行对应程序的准确性。
(4)用命令G4D在JNZ0066处设置断点,程序已将[SI]中存储的输入字符串1长度赋值给AL,将输入字符串2的长度赋值给[BX],长度均为6,并且经过CMPAL,[BX]判断两个字符串长度大小后,零位清零,即变为NZ。
利用单步执行命令T,程序执行指令JNZ0066,即表明程序跳转至NOMA。
用命令G6D在MOVAX,4C00处设置断点,程序执行结果显示程序,并成功在屏幕上显示结果“NOMATCH”。
上述程序调试过程表明了本程序在判断两个字符串长度不相同的情况下,程序运行的准确性。
情况
(2):
两个字符串长度相同,字符串中有若干字符不相同,取字符串123456和12a456。
(1)考虑到情况
(1)中已经对提示信息显示及读取键盘键入字符串作断点设置,表明程序在显示提示信息和存储键盘输入字符串方面运行的准确性,此处不做赘述,其内存中显示结果如图5-6所示。
图5-6输入字符串123456和12a456在内存中的显示结果
(2)利用命令G4D在JNZ006A处设置断点,由图5-7所示,其中比较两个字符串程度后,其长度均为6,故经指令CMPAL,[BX]比较长度大小后,零位清零,无法执行指令JNZ006A。
(3)利用命令T单步执行,进入循环体AG。
(4)利用命令G5E在JNZ0051处设置断点,由图5-7可知,对CL进行字符串长度赋值后,将AL与[BX]比较,即比较字符串1和字符串2首字母的ASCII码,由于其均为31,则将CL减1,判断CL为5,非零,则循环跳回AG,循环运行。
图5-7使用T命令进入循环的断点设置
(5)循环两次后,CL变为4,运用G55命令在CMPAL,[BX]处设置断点,由图5-8可知,此时即将字符串1中‘3’的ASCII码33赋值给AL,将字符串2中的‘a’的ASCII码61赋值给[BX]。
(6)利用T命令单步执行CMPAL,[BX]指令,则由图5-8所示,零位清零,变为NZ。
其次仍使用T命令单步执行,则程序执行JNZ006A,IP指向下一条指令MOVAH,09。
图5-8判别两字符串内部字符是否相同的断点设置
(7)用命令MOVAX,4C00处设置断点,如图5-9所示,程序执行结果显示程序,并成功在屏幕上显示结果“NOMATCH”。
图5-9结果显示的断点设置
上述程序调试过程表明了本程序在判断两个字符串长度相同,字符串中有若干字符不同的情况下,程序运行的准确性。
情况(3):
两个字符串相同,取字符串123abc和123abc。
(1)考虑到情况
(1)中已经对提示信息显示及读取键盘键入字符串作断点设置,表明程序在显示提示信息和存储键盘输入字符串方面运行的准确性,情况
(2)中已将程序循环部分进行调试,此处不做赘述,其内存中显示结果如图5-10所示。
图5-10输入字符串123abc和123abc在内存中的显示结果
(2)利用命令G4D在JNZ006A处设置断点,由图5-11所示,其中比较两个字符串程度后,其长度均为6,故经指令CMPAL,[BX]比较长度大小后,零位清零,无法执行指令JNZ006A。
(3)利用命令T单步执行,进入循环体AG。
(4)利用命令G5E在JNZ0051处设置断点,对CL进行字符串长度赋值后,将AL与[BX]比较,即比较字符串1和字符串2首字母的ASCII码,由于其均为31,则将CL减1,判断CL为5,非零,则循环跳回AG,循环运行。
(5)循环5次后,CL变为0,运用G5b命令在CMPCL,00处设置断点,由图5-12可知,此时经过5次循环,已将这两个字符串中的6个字符比较完毕(首字符的比较是在外部直接运行进入循环体内,故此处不计入循环次数内)。
比较结果为两字符的6个字符均相同。
(6)利用T命令单步执行CMPCL,00,则由图5-12所示,零位置位,变为ZR。
其次仍使用T命令单步执行,由于标志位位ZR,则程序不执行JNZ0051,跳出循环体,IP指向下一条指令MOVAH,09,如图5-13所示。
图5-12判断字符串比较结束的断点设置
(7)用命令G71在MOVAX,4C00处设置断点,如图5-13所示,程序执行结果显示程序,并成功在屏幕上显示结果“MATCH”。
图5-13结果显示的断点设置
上述程序调试过程表明了本程序在判断两个字符串相同情况下,程序运行的准确性。
程序调试过程结束。
6.实验结果、数据及现象
在DOS下运行lcy.EXE文件。
(1)根据提示信息“INPUTSTRING1:
”,输入字符串1“123”,根据提示信息“INPUTSTRING2:
”,输入字符串2“45”,运行结果显示为“NOMATCH”;
(2)根据提示信息“INPUTSTRING1:
”,输入字符串1“123abc”,根据提示信息“INPUTSTRING2:
”,输入字符串2“123asd”,运行结果显示为“NOMATCH”;
(3)根据提示信息“INPUTSTRING1:
”,输入字符串1“123”,根据提示信息“INPUTSTRING2:
”,输入字符串2“123”,运行结果显示为“MATCH”
程序运行结果如图6-1所示。
图6-1DOS下lcy.EXE运行结果
7.实验结果分析
从实验调试过程以及实验结果看出,该循环结构程序在判断输入的两个字符串是否相同以及显示结果的准确性。
同时通过BEBUG的调试过程更清晰的明确了每行代码对应的计算机对于其寄存器和存储器的数据操作,深入了解了CMP、JAE、JNZ等判断,跳转指令与标志位相配合的运行过程,并交替使用G命令和T命令,合理调试程序的循环部分。
8.实验思考题
1)总结伪指令和子程序的异同。
解:
不同点:
伪指令无对应的机器代码,但其在汇编过程中由汇编器进行处理,用来指示汇编后的数据存储分配、变量赋值、逻辑段的分段以及源程序的结束等信息。
子程序有对应的机器代码,并通过相关的指令直接操作数据存储分配,变量赋值、逻辑段分段等步骤。
相同点:
使用伪指令和子程序均可简化源程序设计,增强程序的可读性和可维护性。
同时在8086系统中,以过程定义子程序,并设有相应的伪指令。
2)指出用DEBUG命令跟踪循环程序时,使用G、T和P命令中的哪几个?
并简要地予以总结。
解:
在用DEBUG命令跟踪循环程序时,使用了G命令和T命令。
G命令格式:
G[=ADDR][ADDR]...
G命令运行时从指定地址(即等号后的地址ADDR指定)开始运行程序,如不指定(即G命令后无=ADDR),则从当前的CS:
IP开始执行,直至遇到断点或者程序正常结束。
断点地址若只有偏移地址,则默认位代码段CS。
T命令格式:
T[=ADDR]逐条指令跟踪T[=ADDR][NUM]多条指令跟踪。
T命令也称为单步命令,从指定地址起执行一条或NUM参数指定条数的指令后停下来,每条指定执行完毕后显示所有寄存器和标志位以及下一条指令。
如未指定地址,则从当前的CS:
IP开始执行。
T命令遇到调用指令和中断时,将跟踪进入。
P命令格式:
P[=ADDR][NUM]
P命令类似T命令,但当遇到子程序调用、中断功能调用和循环指令时,不在子程序、中断服务程序或循环体中单步执行,而是直接完成子程序、中断服务程序或循环体,然后显示结果。
3)输入两个字符串,若第一个字符串包含在第二个字符串内,则显示“MATCH”,否则显示“NOMATCH”。
解:
修改后的程序代码:
CRLFMACRO
MOVAH,02H
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
MESS1DB'INPUTSTRING1:
',0DH,0AH,'$'
MESS2DB'INPUTSTRING2:
',0DH,0AH,'$'
MESS3DB'NOMATCH',0DH,0AH,'$'
MESS4DB'MATCH',0DH,0AH,'$'
MAXLEN1DB81
ACTLEN1DB?
STRING1DB81DUP(?
)
MAXLEN2DB81
ACTLEN2DB?
STRING2DB81DUP(?
)
DATAENDS
SSEGSEGMENTPARASTACK'STACK'
STADB50DUP(?
)
TOPEQULENGTHSTA
SSEGENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
SSEG
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,SSEG
MOVSS,AX
MOVSP,TOP
MOVAH,09H
MOVDX,OFFSETMESS1
INT21H;TIPMESS1
MOVAH,0AH
MOVDX,OFFSETMAXLEN1
INT21H;INPUTSTRING1
CRLF
MOVAH,09H
MOVDX,OFFSETMESS2
INT21H;TIPMESS2
MOVAH,0AH
MOVDX,OFFSETMAXLEN2
INT21H;INPUTSTRING2
CRLF
MOVSI,OFFSETACTLEN1
MOVBX,OFFSETACTLEN2
MOVAL,[SI]
CMPAL,[BX]
JANOMA
XORCX,CX
MOVCL,ACTLEN1
MOVCH,ACTLEN2
MOVAH,CL
DECAH
MOVSI,OFFSETSTRING1
MOVBX,OFFSETSTRING2
BACK:
MOVAL,[SI]
NEXT:
DECCH
CMPCH,AH
JLNOMA
PUSHBX
CMPAL,[BX]
JEJUDGE
INCBX
JMPNEXT
JUDGE:
INCSI
INCBX
DECCL
JZMATCH
MOVAL,[SI]
CMPAL,[BX]
JNEPROTECT
JMPJUDGE
PROTECT:
MOVCL,ACTLEN1
POPBX
MOVSI,OFFSETSTRING1
INCBX
JMPBACK
MATCH:
MOVAH,09H
MOVDX,OFFSETMESS4
INT21H
JMPDONE
NOMA:
MOVAH,09H
MOVDX,OFFSETMESS3
INT21H
DONE:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART