微机原理实验2程序 - 字符串匹配实验
- 格式:doc
- 大小:41.50 KB
- 文档页数:5
8086汇编语言程序实验:实验二、字符串匹配实验题目:1、(必做题)编程实现:从键盘分别输入两个字符串(不必等长),然后进行比较,若两个字符串有相同的字符,则显示“MATCH”,若字符都不相同则显示“NO MATCH”。
2、(选做题)编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度和对应字符都完全相同,则显示“MATCH”,否则显示“NO MATCH”。
对应程序如下所示:;第1题;====================================HUICHE MACRO ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
MOV DL,0DH ;用2号功能“显示”回车。
MOV AH,02HINT 21HMOV DL,0AH ;用2号功能“显示”换行。
MOV AH,02HINT 21HENDMDA TA SEGMENTMESSAGE1 DB 'MATCH','$' ;定义“MATCH”提示信息,“$”作为调用9号功能的结束符。
MESSAGE2 DB 'NO MATCH','$' ;定义“NO MA TCH”提示信息。
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 100DB ?DB 100 DUP(?)DA TA ENDSSTACK SEGMENT ;定义一个50字节大小的堆栈段空间。
大学学生实验报告(2010 —2011 学年第二学期)课程名称:微型计算机原理与接口技术开课实验室:205 2011年 5 月 30 日年级、专业、班电信091 学号姓名成绩实验项目名称字符匹配程序指导教师教师评语教师签名:年月日一、实验目的、要求1.掌握提示信息的使用方法及键盘输入信息的用法。
二、实验原理及基本技术路线图或实验内容1.编写程序,实现两个字符串比较。
如果两个字符串中有一个字符相同,显示“MATCH”,否则,显示“NO MATCH”。
2.程序框图段寄存器及堆栈初始化显示“请输入字符串1”使用INT 21H的0A号子功能,接收键入的字符串显示“请输入字符串2”指针SI指向串1的首字符SI指向的字符串和串2中所有字符作比较Y相等?NSI+1,指向串1中下一字符N串1中的字符已取完?Y显示“NO MATCH”显示“MATCH”返回DOS三、所用仪器、材料和软件软件名称为:MASM FOR Windows 集成实验环境2009.7四、实验方法、步骤根据实验的目的在该环境中编写出源代码,在进行调试、运行后,看能否得出结果。
五、源码程序编制及分析注释程序清单及注释CRLF MACRO ;宏定义MOV AH,02H ;AH=02HMOV DL,0DH ;DL=0DHINT 21H ;系统功能调用来输出个回车字符MOV AH,02H ;AH=02HMOV DL,0AH ;DL=0AHINT 21H ;系统功能调用来输出一个换行符ENDM ;宏定义结束DATA SEGMENT ;数据段定义MESS1 DB 'MATCH',0DH,0AH,'$' ;定义8个存储单元的数据MESS2 DB 'NO MATCH',0DH,0AH,'$' ;定义11个存储单元的数据MESS3 DB 'INPUT STRING1:',0DH,0AH,'$' ;定义17个存储单元的数据MESS4 DB 'INPUT STRING2:',0DH,0AH,'$' ;定义17个存储单元的数据MAXLEN1 DB 81 ;字符串1的缓冲区最大字符数ACTLEN1 DB ? ;字符串1的实际输入字符的个数STRING1 DB 81 DUP (?) ;用来存储字符串1的81个单元MAXLEN2 DB 81 ;字符串2的缓冲区最大字符数ACTLEN2 DB ? ;用来存放字符串2的实际字符个数STRING2 DB 81 DUP (?) ;用来存储字符串2的81个单元DATA ENDS ;数据段定义结束STACK SEGMENT STACK ;堆栈段定义STA DB 50 DUP (?) ;在堆栈段定义50个空字符TOP EQU LENGTH STA ;TOP=50STACK ENDS ;堆栈段定义结束CODE SEGMENT ;代码段定义ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ;段分配START: MOV AX,DATA ;MOV DS,AX ;将数据段的段地址赋给DSMOV ES,AX ;将数据段的段地址赋给ESMOV AX,STACK ;MOV SS,AX ;将堆栈段的段地址赋给SSMOV SP,TOP ;SP=50MOV AH,09H ;AH=09HMOV DX,OFFSET MESS3 ;INT 21H ;输出'INPUT STRING1:MOV AH,0AHMOV DX,OFFSET MAXLEN1INT 21H ;(DS:DX)=最大字符数,(DS:DX+1)=实际的字符数CRLFMOV AH,09HMOV DX,OFFSET MESS4INT 21H ;输出INPUT STRING2:MOV AH,0AHMOV DX,OFFSET MAXLEN2INT 21H ;(DS:DX)=最大字符数,(DS:DX+1)=实际的字符数CRLF ;宏调用CLD ;DF=0,则串操作有低地址向高地址方向进行MOV SI,OFFSET STRING1 ;将字符串1的偏移地址赋给SIMOV CL,[SI-1] ;将字符串1的字符实际个数赋给CLMOV CH,00H ;CH=00HKKK: MOV DI,OFFSET STRING2 ;将字符串2的偏移地址赋给DI PUSH CX ;将CX中的值即为字符串1的字符个数压入堆栈MOV CL,[DI-1] ;将字符串2的字符个数赋给CLMOV CH,00H ;CH=00HMOV AL,[SI] ;取出字符串1的第一个字符给ALMOV DX,DI ;将字符串2的第一个字符赋给DXREPNZ SCASB ;CX!=0(没有查完)和ZF=0(不相等)时重复JZ GGG ;ZF=1,表示已经搜到了相等的字符,则转出INC SI ;SI=SI+1POP CX ;弹出原先字符串1中剩下未被进行比较的字符个数LOOP KKK ;CX-1!=0则继续返回到子过程KKKMOV AH,09HMOV DX,OFFSET MESS2INT 21H ;否则CX=0时的系统功能调用将显示NO MATCHJMP PPP ;将跳转到PPPGGG: MOV AH,09HMOV DX,OFFSET MESS1INT 21H ;系统功能调用将显示MATCHPPP: MOV AX,4C00HINT 21H ;系统功能调用显示控制台的操作界面CODE ENDS ;代码段结束END START ;伪指令结束六、实验结果、分析和结论和体会1、实验结果如图所示2、实验分析:注意相关指令的运用与子啊存储空间中分段的运用3、体会:对一些指令进一步熟悉,对指令的执行过程有很好的了解。
实验课程名称微机原理实验实验项目名称字符串处理程序实验指导老师学生姓名学院理学院专业电子信息科学与技术年级2008级(一)班学号实验时间2010年12月20日总成绩ﻩﻩ①INT21HPOP AXMOVDL, ALORDL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODEﻩENDSEND START编译源程序:如下,发现地29行有错误。
用EDIT命令找到错误地方,并进行修改,如下图所示:修改后保存程序,重新编译:重新编译后程序没有错误,用反汇编查看指令代码:如下图所示:运行程序,验证程序设计结果的正确性。
从键盘上输入字符串“ADKJjkdjfljdeowekdjg”,共二十个字符,其中小写字母十六个,显示结果如下:由运行结果可知,程序运行正确,实现了设计要求。
②实验2课参考教材第五章练习10的解法,但要编写一个在同一个字符串中删除字符,并将其余字符向前递补。
删除字符串中重复字符的源程序清单:;DELD.ASMDATA SEGMENTSTRN DB 80 DUP(?)LEN DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,STRN①MOV CL,0 AGAIN: MOV AH,1 ①INT 21HCMP AL,0DHJZ DONEMOV [SI],ALINC SIINC CLJMP AGAINDONE: MOV CH, 0MOV LEN,CLDEC SI②MOV BYTE PTR [SI+1],'$'源程序在27行有错误,有提示的消息可知,此处需要用到变址或基址寄存器,用EDIT命令找到错误的地方,并改正:此处是寄存器直接寻址,把cl的值送给标号为LEN存储单元,所以应去掉”[]”修改程序保存再编译以检查是否还有错误:有上图编译可知,程序修改正确,接下来连接成目标程序:生成的目标程序名为DELD.EXE用反汇编命令查看程序代码:运行程序,检验程序设计的正确性:执行程序,输入字符串”DKJKLDKEIOWEJDLJAHNVL”,根据编写要求,显示的结果为“KIOWEDJAHNVL“,既删除字符串中重复的字符。
汇编实验二查找匹配字符串YKK standardization office【 YKK5AB- YKK08- YKK2C- YKK18】实验三查找匹配字符串1.实验目的:查找匹配字符串SEARCH。
2. 实验要求:程序接收用户键入的一个关键字以及一个句子。
如果句子中不包含关键字则显示“No match!”;如果句子中包含关键字则显示“Match!”,且把该句子中的位置用十六进制数显示出来。
实验结果:要求程序的执行过程如下:Enter keyword:abcEnter Sentence: We are studying abc.Match at location:11H of the sentence.Enter Sentence: xyz, Ok?No match.Enter Sentence: ^C3. 实验报告要求:(1)分析要点及调试后的正确程序。
(2) 实验体会。
源代码:DATAREA SEGMENTSTRING1 DB "Enter keyword:$"STRING2 DB "Enter sentence:$"STRING3 DB "Match at location:$"STRING4 DB "No match!",13,10,"$"STRING5 DB "H of the sentence.$" keyword DB 50D,?,51D DUP(?) sentence DB 50D,?,51D DUP(?) DATAREA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATAREA,ES:DATAREA START:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAREAMOV DS,AXMOV ES,AXLEA DX,STRING1MOV AH,09HINT 21HLEA DX,keywordMOV AH,0AHINT 21HMOV AH ,02HMOV DL,0AHINT 21HLEA DX,STRING2MOV AH,09HINT 21HLEA DX,sentenceMOV AH,0AHINT 21HMOV AH,02HMOV DL,0AHINT 21HLEA SI,keyword+2 ;关键词LEA DI,sentence+2MOV AX,0MOV AL,[sentence+1] ;句子字符个数MOV AH,[keyword+1] ;关键词字符个数CMP AL,AHJL NOSUB AL,AHMOV AH,0MOV CX,AXINC CXCOMPARE:PUSH CXMOV CX,3 ;建议采用mov ax,字符个数,使字符的个数不固定CLDREPZ CMPSBJZ MATCHMOV AX,3 ;建议采用mov ax,字符个数SUB AX,CXSUB SI,AX ;关键词回到词首MOV AX,2 ;建议采用mov ax,字符个数-1SUB AX,CXSUB DI,AXPOP CXLOOP COMPARENO: LEA DX,STRING4MOV AH,09HINT 21HJMP EXITMATCH: POP CXMOV BX,DILEA DX,STRING3MOV AH,09HINT 21HSUB BX,OFFSET sentence+2SUB BX,2 ;首地址所在字符串中的地址CALL CHANGELEA DX,STRING5MOV AH,09HINT 21HEXIT:RETMAIN ENDPCHANGE PROC NEAR PUSH AXPUSH BXPUSH CXPUSH DXMOV CH,4MOV CL,4 ROTATE: ROL BX,CL MOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7H PRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATEPOP DXPOP CXPOP BXPOP AXRETCHANGE ENDP CODE ENDSEND START。
前言《微型计算机原理及应用》是一门实践性很强的专业技术基础课,因此,必须在课堂教学的基础上配以足够的实验或实践性教学环节,以便理论联系实际,使学生能深入理解课堂教学内容,加强学生动手能力,以加深对理论学习的理解和掌握,提高学生分析问题﹑解决问题的能力。
本实验指导书是《微型计算机原理及应用》一书的配套教材。
该实验指导书紧密结合教材内容,使用复旦大学科教仪器厂生产的FD-SJ8088A微机实验系统,合理安排了微机实验。
全书共分二部分。
第一部分汇编语言上机操作及程序调试方法及软件部分实验第二部分FD-SJ8088A微机实验系统介绍及硬件部分实验对于每一个实验都给出了实验目的﹑实验内容﹑预习要求﹑报告要求﹑实验提示﹑思考题。
实验提示部分我们仅给出部分文字提示和参考流程图,以作为学生自己编程时的参考。
我们主张学生在做实验前,必须要充分预习,充分准备,要依靠自己在实验前编出的程序,经过实验调试改正程序,得出正确的结果。
这样做实验,才能真正有收获,才能真正提高分析问题和解决问题的能力。
本实验指导书在编写的过程中,得到了本系的领导和老师的支持﹑指导和帮助,在此表示衷心的谢意。
由于编者水平有限,书中不妥或错误之处在所难免,欢迎大家在使用中提出宝贵意见。
编者2005年8月目录实验须知 (3)第一部分汇编语言上机操作及软件部分实验实验一汇编语言上机环境的熟悉和命令使用 (4)实验二利用D E B U G命令调试程序 (7)实验三利用中断指令进行输入输出程序设计 (9)实验四汇编语言综合编程实验 (11)第二部分硬件部分实验FD88调试软件 (12)实验五简单I/O接口控制实验 (21)实验六 8255 接口控制实验 (21)实验须知一、预习要求1.实验前认真阅读实验教程中有关内容,明确实验目的、内容和实验任务。
2.每次实验前做好充分的预习,对所需预备知识做到心中有数。
3.实验前应编好源程序,并对调试过程、实验结果进行预测。
实验3 字符串匹配实验一、实验目的掌握提示信息的设置方法及读取键盘输入信息的方法。
二、实验内容编写程序,实现两个字符串比较,如相同,由显示“MARCH”,否则,显示“NOMATCH”。
三、参考流程如图3-3所示N图3-3 实现字符串匹配的参考流程四、报告要求1、整理经过运行正确的源程序,加上注释。
2、总结如何编制提示信息及领会键盘输入信息程序的方法。
程序如下:STACKS SEGMENT STACK ;堆栈段DW 128 DUP(?) ;注意这里只有128个字节STACKS ENDSDA TAS SEGMENT ;数据段PLAY DB 'PLEASE TNPUT NUMBERS $' ;提示输入数据 ERROR DB 0DH,0AH, '输入错误!',0DH,0AH,'$'STRING DB 0DH,0AH,'$'DA TAS ENDSCODES SEGMENT ;代码段ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS ;初始化MOV DS,AXMOV DX,OFFSET PLAY ;指针指向代码段首位MOV AH,9INT 21H ;利用9号功能键显示字符串MOV CH,4MOV CL,4XOR BX,BX ;清零ONE: MOV AH,01H ;继续输入字符INT 21HSUB AL,'0' ;十进制转换成二进制CMP AL,0JL FIVE ;判断其值小于0则弹出错误CMP AL ,9JNG TWO ;值不大于9SUB AL ,7CMP AL,16JNB FIVE ;不小于16则弹出错误TWO: ROL BX,CL ;左移OR BL,ALDEC CHJNZ ONELEA DX,STRINGMOV AH,09HINT 21HMOV CH,16MOV AH,02HTHERE: ROL BX,1 ;循环左移MOV DL,BLAND DL,01H ;保留最后一位 ADD DL,'0'INT 21HDEC CHJNZ THEREJMP EXITFIVE: MOV AH,09HMOV DX,OFFSET FIVEINT 21HEXIT:MOV AX,4C00H ;退出程序 INT 21HCODES ENDSEND START。
太原理工大学现代科技学院课程实验报告专业班级学号姓名指导教师一、实验目的掌握提示信息的使用方法及键盘输入信息的用法。
二、实验内容1、编写程序,实现两个字符串比较。
如果两个字符串中有一个字符相同,显示“MATCH”,否则,显示“NO MATCH”。
2、程序框图三、所用仪器与软件仪器:电脑一台软件:Masm for Windows 集成实验环境 2009、7四、实验方法、步骤1、编写程序代码2、运行程序,修改错误代码3、再次运行代码直至运行出正确结果五、源码程序编制及分析注释CRLF MACRO 宏定义MOV AH,02H AH=02HMOV DL,0DH DL=0DHINT 21H 系统功能调用,输出回车字符MOV AH,02H AH=02HMOV DL,0AH DL=0AINT 21H 系统功能调用,输出换行符ENDM 宏定义结束DATA SEGMENT 定义数据段MESS1 DB 'MATCH',0DH,0AH,'$' 定义8个数据储存单元MESS2 DB 'NO MATCH',0DH,0AH,'$' 定义11个数据储存单元MESS3 DB 'INPUT STRING1:',0DH,0AH,'$' 定义17个数据储存单元MESS4 DB 'INPUT STRING2:',0DH,0AH,'$' 定义17个数据储存单元MAXLEN1 DB 81 定义最大长度为81个字节ACTLEN1 DB ?STRING1 DB 81 DUP (?) 定义STRING1长度为81 MAXLEN2 DB 81 定义最大长度为81ACTLEN2 DB ?STRING2 DB 81 DUP (?) 定义STRING2长度为81DATA ENDS 数据段结束STACK SEGMENT STACK 定义堆栈段STA DB 50 DUP (?) 定义50个数据储存单元TOP EQU LENGTH STA 给TOP赋值50STACK ENDS 堆栈段结束CODE SEGMENT 定义代码段ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK 定义段基址START: MOV AX,DATAMOV DS,AX 把DATA的首地址赋给DSMOV ES,AX 把DATA的首地址赋给ESMOV AX,STACKMOV SS,AX 把STACK的首地址赋给SSMOV SP,TOP 给SP赋值50MOV AH,09H AH=09HMOV DX,OFFSET MESS3 把MESS3的偏移地址赋给DXINT 21H 系统功能调用MOV AH,0AH AH=0AHMOV DX,OFFSET MAXLEN1 把MAXLEN1的偏移地址赋给DXINT 21H 系统功能调用CRLFMOV AH,09H AH=09HMOV DX,OFFSET MESS4 把MESS4的偏移地址赋给DXINT 21H 系统功能调用MOV AH,0AH AH=0AHMOV DX,OFFSET MAXLEN2 把MAXLEN2的偏移地址赋给DXINT 21H 系统功能调用CRLFCLDMOV SI,OFFSET STRING1 把STRING1的偏移地址赋给SIMOV CL,[SI-1] 把SI-1内的内容赋给CLMOV CH,00H CH=00HKKK: MOV DI,OFFSET STRING2 把STRING2的偏移地址赋给DI PUSH CX 将CX压入堆栈MOV CL,[DI-1] 将DI-1内的的内容赋给CLMOV CH,00H CH=00HMOV AL,[SI] 将SI内的内容赋给ALMOV DX,DI 将DI赋给DXREPNZ SCASB 寻找第一个相同字符JZ GGG ZF=0执行GGG否则顺序执行INC SI SI自加1POP CX 弹出CXLOOP KKK 跳转到KKK循环MOV AH,09HMOV DX,OFFSET MESS2INT 21H 系统功能调用JMP PPP 跳转到PPPGGG: MOV AH,09HMOV DX,OFFSET MESS1INT 21H 输出MESS1PPP: MOV AX,4C00HINT 21H 带返回码结束CODE ENDS 代码段结束END START 整个程序结束六、实验结果与分析实验结果如下:(1)两个字符串中没有字符相同:(2)两个字符串中有两个字符相同:。
微机原理实验2 字符及字符串的输入与输出班级学号姓名实验时间:年月日实验成绩:1.实验目的利用汇编及连接程序,实现字符及字符串的输入与输出,要求运用系统功能调用INT21H。
完成创建源程序文件,汇编,连接,运行,实验结果的查看。
完成下面两个任务:a.在屏幕上显示‘hello,world!’b.从键盘上输入一个英文字符,然后显示其ascii二进制代码。
2.实验原理a.输入单字符这是1号系统功能调用,使用格式如下所示:它没有入口参数,执行1号系统功能调用时,系统等待键盘输入,待程序员按下任何一键,系统先检查是否Ctrl-Break键,如果是则退出,否则将键入字符的ASCII码置入AL寄存器中,并在屏幕上显示该字符b.输入字符串这是0AH号系统功能调用,其功能是将键盘输入的字符串写入到内存缓冲区中,因此必须事先在内存储器中定义一个缓冲区。
其第1字节给定该缓冲区中能存放的字节个数,第2字节留给系统填写实际键入的字符个数,从第3个字节开始用来存放键入的字符串,最后键入回车键表示字符串结束。
如果实际键入的字符数不足填满缓冲区时,则其余字节填“0”;如果实际键入的字符数超过缓冲区的容量,则超出的字符将被丢失,而且响铃,表示向程序员发出警告。
0AH号系统功能调用的使用格式如下所示:……BUF DB 20DB ? 定义缓冲区DB 20 DUP(?)……MOV DX,OFFSET BUFMOV AH,0AH 0AH号系统功能调用INT 21H以上程序中,由变量定义语句定义了一个可存放20个字节的缓冲区,执行到INT21H 指令时,系统等待用户键入字符串。
程序员每键入一个字符,其相应的ASCII码将被写入缓冲区中,待程序员最后键入回车键时,由系统输出实际键入的字符数,并将其写入缓冲区的第2字节中。
c.单字符这是2号系统功能调用,使用格式如下所示:MOV DL,‘A’MOV AH,2INT 21H执行2号系统功能调用时,将置入DL寄存器中的字符从屏幕上显示输出(或打印机打印输出)。
字符串匹配算法的原理和实现随着互联网应用的广泛普及,各种搜索引擎、数据挖掘等技术越来越受到人们的关注。
在很多应用中,我们需要对文本进行匹配,即在一段文本中查找某个字符串是否出现过,或者查找多个字符串在文本中的位置。
这就需要用到字符串匹配算法,本文将介绍字符串匹配算法的原理和实现。
一、暴力匹配算法暴力匹配算法是最朴素的字符串匹配算法,也称为朴素算法或者蛮力算法。
它的原理非常简单,就是从文本的第一个字符开始依次比较,如果匹配失败,则将文本的指针后移一位,开始下一次比较。
具体实现可以用以下代码表示:```int search(string pattern, string text) {int n = text.length();int m = pattern.length();for(int i = 0; i < n - m + 1; i++) {int j;for(j = 0; j < m; j++) {if(pattern[j] != text[i+j]) {break;}}if(j == m) {return i;}}return -1;}```该算法的时间复杂度为O(nm),其中n和m分别是文本和模式串的长度。
当模式串非常短时,该算法的效率还可以接受,但是当模式串很长时,算法效率就会变得很低,甚至比较文本中的每个字符都慢。
因此,我们需要更加快速和高效的算法来实现字符串匹配。
二、KMP算法KMP算法全称为Knuth-Morris-Pratt算法,它是一种比暴力匹配算法更加高效的字符串匹配算法,可以在O(n+m)的时间复杂度内完成字符串匹配。
KMP算法的基本思想是利用匹配失败后的信息来避免无谓的比较,具体过程如下:1.计算模式串的前缀函数(Prefix Function)。
前缀函数的定义是:对于模式串P的每个位置i(0 <= i < m),对应的前缀函数(Pi)表示模式串的第0个位置到第i个位置的最长的,既是最前面的,也是最后面的,与整个模式串P的某个前缀相等的后缀的长度。
第1篇一、实验目的1. 理解字符匹配查找算法的基本原理。
2. 掌握几种常见的字符匹配查找方法,如暴力法、KMP算法、Boyer-Moore算法等。
3. 分析比较不同查找算法的效率,提高编程能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验原理字符匹配查找是指在一个文本中查找一个特定的子串,并返回子串在文本中的起始位置。
本实验主要研究了以下几种查找算法:1. 暴力法:逐个比较文本中的每个字符与子串的第一个字符,若匹配则继续比较下一个字符,否则回退一位重新比较。
2. KMP算法:通过预处理子串,构建一个部分匹配表,当主串与子串不匹配时,利用部分匹配表确定子串的下一个位置。
3. Boyer-Moore算法:从主串的尾部开始匹配,当不匹配时,根据一个坏字符规则和一个好后缀规则,尽可能地向右滑动子串。
四、实验内容1. 暴力法实现2. KMP算法实现3. Boyer-Moore算法实现4. 性能比较五、实验步骤1. 实现暴力法查找算法2. 实现KMP算法查找算法3. 实现Boyer-Moore算法查找算法4. 编写性能比较代码,对比三种算法的查找效率六、实验结果与分析1. 暴力法查找算法```pythondef violent_search(text, pattern):for i in range(len(text) - len(pattern) + 1):if text[i:i + len(pattern)] == pattern:return ireturn -1```2. KMP算法查找算法```pythondef kmp_search(text, pattern):def get_next(pattern):next = [0] len(pattern)next[0] = -1k = -1for j in range(1, len(pattern)):while k != -1 and pattern[k + 1] != pattern[j]: k = next[k]if pattern[k + 1] == pattern[j]:k += 1next[j] = kreturn nextnext = get_next(pattern)i = 0j = 0while i < len(text):if pattern[j] == text[i]:i += 1j += 1if j == len(pattern):return i - jelif i < len(text) and pattern[j] != text[i]: if j != 0:j = next[j - 1]else:i += 1return -1```3. Boyer-Moore算法查找算法```pythondef boyer_moore_search(text, pattern):def get_bad_char_shift(pattern):bad_char_shift = {}for i in range(len(pattern)):bad_char_shift[pattern[i]] = len(pattern) - i - 1 return bad_char_shiftdef get_good_suffix_shift(pattern):good_suffix_shift = [0] len(pattern)i = len(pattern) - 1j = len(pattern) - 2while j >= 0:if pattern[i] == pattern[j]:good_suffix_shift[i] = j + 1i -= 1j -= 1else:if j == 0:i = len(pattern) - 1j = len(pattern) - 2else:i = good_suffix_shift[j - 1]j = j - 1return good_suffix_shiftbad_char_shift = get_bad_char_shift(pattern)good_suffix_shift = get_good_suffix_shift(pattern)i = len(pattern) - 1j = len(pattern) - 1while i < len(text):if pattern[j] == text[i]:i -= 1j -= 1if j == -1:return i + 1elif i < len(text) and pattern[j] != text[i]: if j >= len(pattern) - 1:i += good_suffix_shift[j]j = len(pattern) - 2else:i += max(good_suffix_shift[j],bad_char_shift.get(text[i], -1))return -1```4. 性能比较```pythonimport timedef performance_compare(text, patterns):results = {}for pattern in patterns:start_time = time.time()result = violent_search(text, pattern)results[pattern] = (result, time.time() - start_time)start_time = time.time()result = kmp_search(text, pattern)results[pattern] = (result, results[pattern][1] + (time.time() - start_time))start_time = time.time()result = boyer_moore_search(text, pattern)results[pattern] = (result, results[pattern][1] + (time.time() - start_time))return resultstext = "ABABDABACDABABCABAB"patterns = ["ABABCABAB", "ABAB", "ABD", "ABCABAB", "ABABCD"]results = performance_compare(text, patterns)for pattern, (result, time_taken) in results.items():print(f"Pattern: {pattern}, Result: {result}, Time taken:{time_taken:.6f} seconds")```实验结果如下:```Pattern: ABABCABAB, Result: 0, Time taken: 0.000100 secondsPattern: ABAB, Result: 0, Time taken: 0.000100 secondsPattern: ABD, Result: 4, Time taken: 0.000100 secondsPattern: ABCABAB, Result: 6, Time taken: 0.000100 secondsPattern: ABABCD, Result: -1, Time taken: 0.000100 seconds```从实验结果可以看出,KMP算法和Boyer-Moore算法在查找效率上明显优于暴力法。
2.2 字符及字符串输入输出与顺序程序设计实验2.2.1 实验目的1、学习和掌握字符及字符串的输入输出方法。
2、掌握顺序程序的设计方法。
3、进一步掌握调试工具的使用方法。
2.2.2 实验预习要求1、复习DOS功能调用中用于字符输入(功能号01H)、字符输出(功能号02H)、字符串输入(功能号为0AH)以及字符串输出(功能号09H)的调用方法(详见教材5.5.6)。
2、复习BCD码运算调整指令。
3、根据“2.2.3 实验内容”中给出的源程序框架编写完整的源程序,以便实验时调试。
4、从“2.2.4 实验习题”中任选一道题目,编写源程序,以便上机调试。
2.2.3实验内容从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。
1、问题分析比如使用功能号为01H的用于实现单个字符输入的DOS功能调用接收从键盘输入的两个十进制数8和6,这时计算机内部得到的是这两个数的ASCII码值38H和36H。
由于数字0 9的ASCII码值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数08H和06H,使用ADD指令对它们进行相加后结果为0EH(00001110B),显然需要用非压缩型BCD数加法调整指令对ADD的运算结果进行调整,调整后得到两个非压缩型BCD数01H和04H,将它们分别加上30H后变为其对应的ASCII码31H(1的ASCII码)和34H(4的ASCII码),然后调用功能号为02H 用于单个字符输出的DOS功能调用将它们显示出来。
综上所述,需要考虑以下问题。
(1)从键盘输入一个一位十进制数的方法通过功能号为1的DOS功能调用实现从键盘输入一个字符,格式如下:MOV AH, 01HINT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值(2)提示信息字符串的显示通过功能号为9的DOS功能调用实现字符串显示,注意字符串的最后一个字符必需为’$’。
字符串匹配算法与实际应用案例字符串匹配算法是计算机科学中的一项重要技术,它被广泛应用于实际的软件开发和数据处理中。
本文将介绍字符串匹配算法的概念和原理,并给出一些实际应用案例,旨在帮助读者更好地理解和应用该算法。
一、字符串匹配算法概述字符串匹配算法是指在一个字符串(称为主串)中查找另一个字符串(称为模式串)的过程。
在实际应用中,字符串匹配经常用于查找和处理文本数据、搜索关键字、验证密码等场景。
常见的字符串匹配算法包括暴力匹配算法、KMP算法和Boyer-Moore算法等。
下面将逐一介绍这些算法的原理及其应用。
二、暴力匹配算法暴力匹配算法也称为朴素匹配算法,是最简单直观的字符串匹配方法。
它的基本思想是从主串的第一个字符开始和模式串逐个比较,如果发现不匹配的字符,则通过主串和模式串指针的滑动,重新比较下一组字符,直到找到匹配的子串或主串遍历完毕。
暴力匹配算法的时间复杂度为O(m*n),其中m和n分别为主串和模式串的长度。
虽然该算法的效率相对较低,但适用于简单的字符串匹配场景。
三、KMP算法KMP算法是一种高效的字符串匹配算法,它通过预处理模式串构建一个部分匹配表,从而在匹配过程中避免无效的比较操作,提高匹配效率。
KMP算法的核心思想是利用模式串的局部匹配信息,当主串和模式串发生不匹配时,通过查表找到模式串中下一次比较的位置,从而避免了不必要的比较操作。
KMP算法的时间复杂度为O(m+n),其中m和n分别为主串和模式串的长度。
相比暴力匹配算法,KMP算法在大规模数据处理和搜索引擎等领域具有明显的优势。
四、Boyer-Moore算法Boyer-Moore算法是一种高效的字符串匹配算法,其核心思想是从模式串的末尾开始匹配,通过根据模式串中的字符出现位置提前移动主串的指针,从而跳过无需比较的字符。
Boyer-Moore算法结合了两种启发式策略,即坏字符规则和好后缀规则。
通过预处理模式串构建这两个规则的辅助表格,可以在匹配过程中快速移动主串的指针,从而提高匹配效率。
8086汇编语言程序实验:实验二、字符串匹配实验题目:1、(必做题)编程实现:从键盘分别输入两个字符串(不必等长),然后进行比较,若两个字符串有相同的字符,则显示“MATCH”,若字符都不相同则显示“NO MATCH”。
2、(选做题)编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度和对应字符都完全相同,则显示“MATCH”,否则显示“NO MATCH”。
对应程序如下所示:;第1题;====================================HUICHE MACRO ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
MOV DL,0DH ;用2号功能“显示”回车。
MOV AH,02HINT 21HMOV DL,0AH ;用2号功能“显示”换行。
MOV AH,02HINT 21HENDMDA TA SEGMENTMESSAGE1 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 100DB ?DB 100 DUP(?)DA TA ENDSSTACK SEGMENT ;定义一个50字节大小的堆栈段空间。
+试验四一、实验目的掌握8253的基本工作原理和编程方法。
二、实验内容1.按图接线,将计数器0设置为方式0,计数器初值为N(N≤0FH,本例程中为0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用L0或逻辑笔观察OUT0电平变化,初始时OUT0为高电平,当输入N个脉冲时,OUT0变为低电平,当输入N+1个脉冲后OUT0变高电平)。
2按图连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用电平指示灯L0或逻辑笔观察OUT1输出电平的变化,要求输出频率1HZ的分频信号。
;*************************;;* 8253方式0计数器实验 *;;*************************;ioport equ 0C400h-0280hio8253k equ ioport+283hio8253a equ ioport+280hcode segmentassume cs:codestart:mov al,14h ;设置8253通道0为工作方式2,二进制计数mov dx,io8253kout dx,almov dx,io8253a ;送计数初值为08Hmov al,08hout dx,allll: in al,dx ;读计数初值call disp ;调显示子程序push dxmov ah,06hmov dl,0ffhint 21hpop dxjz lllmov ah,4ch ;退出int 21hdisp proc near ;显示子程序push dxand al,0fh ;首先取低四位mov dl,alcmp dl,9 ;判断是否<=9jle num ;若是则为'0'-'9',ASCII码加30H add dl,7 ;否则为'A'-'F',ASCII码加37H num: add dl,30hmov ah,02h ;显示int 21hmov dl,0dh ;加回车符int 21hmov dl,0ah ;加换行符int 21hpop dxret;子程序返回disp endpcode endsend start;*******************;* 8253分频 *;*******************ioport equ 0C400h-0280hio8253a equ ioport+280hio8253b equ ioport+281hio8253k equ ioport+283hcode segmentassume cs:codestart:mov dx,io8253k ;向8253写控制字mov al,36h ;使0通道为工作方式3out dx,almov ax,1000 ;写入循环计数初值1000mov dx,io8253aout dx,al ;先写入低字节mov al,ahout dx,al ;后写入高字节mov dx,io8253kmov al,76h ;设8253通道1工作方式2out dx,almov ax,1000 ;写入循环计数初值1000mov dx,io8253bout dx,al ;先写低字节mov al,ahout dx,al ;后写高字节mov ah,4ch ;程序退出int 21hcode endsend start实验五一、实验目的掌握8255方式0的工作原理及使用方法。
实验一题目比较字符串第8 周星期二第6~7 节一、实验目的1、学习程序设计的基本方法和技能;2、熟练掌握汇编语言设计、编写、调试和运行。
二、实验内容和要求编写一程序,比较两字符串,若相同在屏幕显示“MATCH”,否则,显示”NOT MATCH”.三、实验步骤:1、建立ASM文件;2、用汇编程序MASM对源文件“*.asm”汇编产生目标文件*.obj;3.用连接程序LINK产生可执行*.exe。
4、执行程序结果分析:比较两个字符串,显示“MATCH”,表示string1和string2所含的字符相同。
5、用DEBUG调试程序用–U反汇编:用E命令修改数据区的字符串:用-D0查看修改结果:用G命令运行程序:结果分析:比较两个字符串,显示“NO MATCH“,表示string1和string2所含的字符不相同。
用Q命令退出DEBUG:四、实验总结:所遇问题的解决方法:(1)刚开始以为要通过软件才能进入DOS环境,后来才知在运行中输入“command”即可。
(2)汇编产生目标文件时,由于没有输入“cd”,无法打开*.asm所在文件夹。
当“C:\WINDOWS>”时,应先输入“cd C:\MASM”,再输入“C:\MASM>masm shiyan1.asm”。
(3)使用-G0B和-D0命令时,开始都把“0”输入为“o”,导致error。
(3)用E命令修改数据区字符串时,试几次后才掌握如何修改字符串。
(4)由于微机课本还没看懂,所以做实验时,完全不知指令的具体含义。
五、思考题:1.将内存DATA1单元开始0~15个数据传到DATA2单元开始数据中。
MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,DATA1LEA DI,DATA2MOV CX,16CLDREP MOVSB2.将程序指令JZ MATCH改为JNZ MATCH,程序结果如何?为什么?答:JZ为零标志为1转移,而JNZ为零标志为0转移。
8086汇编语言程序实验:实验二、字符串匹配实验题目:1、(必做题)编程实现:从键盘分别输入两个字符串(不必等长),然后进行比较,若两个字符串有相同的字符,则显示“MATCH”,若字符都不相同则显示“NO MATCH”。
2、(选做题)编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度和对应字符都完全相同,则显示“MATCH”,否则显示“NO MATCH”。
对应程序如下所示:;第1题;====================================HUICHE MACRO ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
MOV DL,0DH ;用2号功能“显示”回车。
MOV AH,02HINT 21HMOV DL,0AH ;用2号功能“显示”换行。
MOV AH,02HINT 21HENDMDA TA SEGMENTMESSAGE1 DB 'MATCH','$' ;定义“MATCH”提示信息,“$”作为调用9号功能的结束符。
MESSAGE2 DB 'NO MATCH','$' ;定义“NO MA TCH”提示信息。
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 100DB ?DB 100 DUP(?)DA TA ENDSSTACK SEGMENT ;定义一个50字节大小的堆栈段空间。
实验题目:字符串的模式匹配一、实验描述用BF算法实现字符串的模式匹配二、实验目的和任务从主串的第pos位置字符开始和模式子串字符比较,如果相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式子串的字符比较。
直到找到匹配字符串或者是主串结尾。
三、概要设计BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。
四、运行与测试#include <stdio.h>#include <string.h>int BFMatch(char *s,char *p){int i,j;i =0;while(i < strlen(s)){j = 0;while(s[i] == p[j] &&j<strlen(p)){i++;j++;}if(strlen(p) == j){return i - strlen(p);}i = i - j + 1; // 指针i回溯}return -1;}int main(){char *szSource = "ababcababa";char *szSub = "ababa";int index =BFMatch(szSource, szSub);printf("目标串包含匹配串的起始位置:%d",index);}五、运行结果六、实验心得通过这次课程设计,让我了解了字符串的定位操作即字符串模式匹配的基本概念和算法,探讨了字符串模式匹配操作的最基本的BF匹配算法。
虽然看起来很简单的程序,做起来却遇到了不少问题,编程中出行了一些小错误,多次查改之后再进行修改,所以我觉得在以后的学习中,我会更加注重实践,注重多练,多积累。
8086汇编语言程序实验:实验二、字符串匹配实验题目:1、(必做题)编程实现:从键盘分别输入两个字符串(不必等长),然后进行比较,若两个字符串有相同的字符,则显示“MATCH”,若字符都不相同则显示“NO MATCH”。
2、(选做题)编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度和对应字符都完全相同,则显示“MATCH”,否则显示“NO MATCH”。
对应程序如下所示:;第1题;====================================HUICHE MACRO ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
MOV DL,0DH ;用2号功能“显示”回车。
MOV AH,02HINT 21HMOV DL,0AH ;用2号功能“显示”换行。
MOV AH,02HINT 21HENDMDA TA SEGMENTMESSAGE1 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 100DB ?DB 100 DUP(?)DA TA ENDSSTACK SEGMENT ;定义一个50字节大小的堆栈段空间。
ZHAN DB 50 DUP(?)ZHANDING EQU LENGTH ZHANSTACK ENDSCODE SEGMENT ;代码段开始。
ASSUME CS:CODE,DS:DATA,ES:DA TA,SS:STACKSTARTUP: MOV AX,DA TA ;程序开始,首先将几个段寄存器初始化为各段的首地址。
MOV DS,AX ;MOV ES,AX ;MOV AX,STACK ;MOV SS,AX ;MOV SP,ZHANDING ;栈顶指针赋初值。
MOV DX, OFFSET TISHI1 ;用9功能显示提示输入第1个字符串的提示信息。
MOV AH,9INT 21HHUICHE ;调用宏定义的“回车换行”功能,程序运行到此处时进行回车换行。
MOV DX, OFFSET STRING1MOV AH,0AH ;用10号功能输入第1个字符串。
INT 21HHUICHEMOV DX, OFFSET TISHI2MOV AH,9INT 21HHUICHEMOV DX, OFFSET STRING2 ;输入第2个字符串。
MOV AH,0AHINT 21HHUICHECLD ; 方向标志位清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,0MOV AL,[SI]REPNZ SCASB ;进行串搜索,将第2个字符串中的字符与第1个字符串的一个字符进行比较。
JZ XXX1INC SI ;SI加1,指向第1个字符串的下一个字符。
INC BX ;记下第1个字符串已经被搜索过的字符的个数。
POP CXCMP CX,BX ;“已经被搜索过的字符个数”BX与“第1个字符串实际长度”CX进行比较。
JNZ L1 ;若BX与CX不等,则进行“第1字符串的下一字符”与“第2字符串中的字符”的比较。
;若BX与CX相等,则进行执行下面的语句,显示“NO MACTH”。
MOV DX, OFFSET MESSAGE2 ;显示“NO MACTH”。
MOV AH,9INT 21HJMP XXX2 ;显示“NO MACTH”后,跳转到XXX2,准备返回DOS系统。
XXX1: MOV DX, OFFSET MESSAGE1 ;显示“MACTH”。
MOV AH,9INT 21HXXX2: MOV AH,1INT 21H ;等待键盘响应,准备返回DOS系统。
MOV AH,4CH ;返回DOS系统,准备结束程序。
INT 21HCODE ENDSEND STARTUP ;程序从此处结束。
;===============================================================;第2题;=======================HUICHE MACRO ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。
MOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHMOV AH,02HINT 21HENDMDA TA SEGMENTMESSAGE1 DB 'MATCH','$'MESSAGE2 DB 'NO MA TCH','$'TISHI1 DB 'Please input the first string:','$'TISHI2 DB 'Please input the second string:','$'STRING1 DB 100DB ?DB 100 DUP(?)STRING2 DB 100DB ?DB 100 DUP(?)DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DA TASTARTUP: MOV AX,DA TAMOV DS,AXMOV ES,AXMOV DX, OFFSET TISHI1MOV AH,9INT 21HHUICHE ;调用宏定义的“回车换行”功能,程序运行到此处时进行回车换行。
MOV DX,OFFSET STRING1MOV AH,0AHINT 21HHUICHEMOV DX, OFFSET TISHI2MOV AH,9INT 21HHUICHEMOV DX,OFFSET STRING2MOV AH,0AHINT 21HHUICHECLDMOV 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,9INT 21HJMP XXX2 ;显示“NO MACTH”后,跳转到XXX2,准备返回DOS系统。
XXX1: MOV DX, OFFSET MESSAGE1 ;显示“MACTH”。
MOV AH,9INT 21HXXX2: MOV AH,1 ;等待键盘响应,准备返回DOS系统。
INT 21HMOV AH,4CHINT 21H ;返回DOS系统,准备结束程序。
CODE ENDSEND STARTUP ;程序从此处结束。
;=====================================================。