本科实验报告实验名称:字符串操作实验(设计性实验)课程名称:CPU与汇编语言程序设计实验时间:2015.11.6任课教师:王耀威实验地点:10-102实验教师:苏京霞实验类型:□原理验证□综合设计□自主创新学生姓名:学号/班级:组号:学院:信息与电子学院同组搭档:专业:信息工程成绩:实验三字符串操作实验(设计性实验)一、实验目的1、了解汇编语言字符串处理基本流程;2、熟悉汇编语言字符串处理基本指令的使用方法;3、掌握利用汇编语言实现字符串处理的程序设计方法。二、软硬件环境1、硬件环境:windows系统的计算机;2、软件系统:装有MASM、DEBUG、LINK等应用程序。三、实验原理1、字符串处理基本操作的流程:(1)利用SI寄存器保存源串首地址;(2)利用DI寄存器保存目的串首地址;(3)利用CX寄存器保存字符串长度;(4)利用CLD或者STD指令设置字符串处理方向;(5)利用字符串处理指令实现相关处理。提示:字符串处理一般会涉及源串和目的串,汇编语言规定源串在数据段定义,目的串在附加段定义。2、重复前缀指令:(1)REP:无条件重复前缀直至CX=0。经常与REP配合工作的字符串处理指令有MOVS,STOS,LODS。(2)REPE/REPZ:重复前缀直至CX=0或ZF=0(即比较的两个操作数不相等)。常与该指令配合工作的有CMPS,SCAS。(3)REPNE/REPNZ:重复前缀直至CX=0或ZF=1(即比较的两个操作数相等)。常与该指令配合工作的有CMPS,SCAS。3、字符串处理基本指令:MOVS传送指令,STOS存入串指令,LODS从串取指令,CMPS串比较指令,SCAS串扫描指令。总的来说,字符串处理可以讲缓冲区中一个数据块搬至存储器的另一处,比较两个字符串是否相等,从缓冲区中一个数据块寻找某个特定的关键字,顺次从一个缓冲区取字符或顺次向一个缓冲区存字符等。四、实验内容与步骤1、比较缓冲区中两字符串是否相同,相同则AL返回0,不同则AL返回1。(字符串长度自动获取)2、编写程序,将内存中某一区域的数据传送到另一区域。3、编写程序,在已知字符串中搜素特定字符‘!’,若找到则AL返回0,找不到AL返回1。4、编写程序,统计一串字符串中字符‘.’出现的次数。五、实验结果1、比较缓冲区中两字符串是否相同,相同则AL返回0,不同则AL返回1。(1)流程图开始COUNT1=$-STRING1COUNT2=$-STRING2SI-STRING1DI-STRING2NCOUNT1=COUNT2?YCX=COUNT1REPECMPSBNCX=0?YAL=1AL=0结束(2)程序代码DATASSEGMENTSTRING1DB'THISISSTRING1$'COUNT1EQU$-STRING1DATASENDSEXTRASEGMENTSTRING2DB'THISISSTRING2$'COUNT2EQU$-STRING2EXTRAENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,ES:EXTRASTART:MOVAX,DATASMOVDS,AXMOVAX,EXTRAMOVES,AXLEASI,STRING1LEADI,STRING2MOVAX,COUNT1MOVBX,COUNT2CMPAX,BXJNEEXIT2MOVCX,AXCLDREPECMPSBCMPCX,0JNZEXIT2EXIT1:MOVAL,0JMPEXITEXIT2:MOVAL,1EXIT:MOVAH,4CHINT21HCODESENDSENDSTART(3)实验结果STRING1DB'THISISSTRING1$'STRING2DB'THISISSTRING$'STRING1DB'THISISSTRING1$'STRING2DB'THISISSTRING2$'STRING1DB'THISISSTRING1$'STRING2DB'THISISSTRING1$'2、字符串传送(1)流程图开始COUNT=$-STRING1CX=COUNTCLDREPMOVSB结束(2)程序代码DATASSEGMENTSTRING1DB'THISISSTRING1'COUNTEQU$-STRING1DATASENDSEXTRASEGMENTSTRING2DBCOUNTDUP(?)EXTRAENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,ES:EXTRASTART:MOVAX,DATASMOVDS,AXMOVAX,EXTRAMOVES,AXMOVCX,COUNTCLDREPMOVSBMOVAH,4CHINT21HCODESENDSENDSTART(3)实验结果STRING1DB'THISISSTRING1'3、寻找特定字符,找到AL返回0,找不到AL返回1(1)流程图开始COUNT=$-STRINGCX=COUNTDI-STRINGAL=’!’CLDREPESCASBNZF=0?YAL=1AL=0结束(2)程序代码DATASSEGMENTSTRINGDB'THISISSTRING!'COUNTEQU$-STRINGDATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXMOVCX,COUNTMOVAL,’!’LEADI,STRINGCLDREPNESCASBJZEXIT1MOVAL,1JMPEXITEXIT1:MOVAL,0EXIT:MOVAH,4CHINT21HCODESENDSENDSTART(3)实验结果STRINGDB'THISISSTRING!'STRINGDB'THISISSTRING'4、统计字符串中字符‘.’的出现次数。(1)流程图开始COUNT=$-STRINGBX=0DI-STRINGCX=COUNTAL=’.’CLDREPNESCASBNZF=0?YBX=BX+1CX=CX+1结束(2)程序代码DATASSEGMENTSTRINGDB'.......'COUNTEQU$-STRINGDATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXMOVBX,0MOVAL,'.'LEADI,STRINGMOVCX,COUNTCLDL:REPNESCASBJZADDITIONJMPDONEADDITION:INCBXINCCXLOOPLDONE:MOVAH,4CHINT21HCODESENDSENDSTART(3)实验结果STRINGDB'.......'BX=7STRINGDB'0.0.0.0.0.0.0.0.0'BX=8六、思考答:用mov指令和loop循环配合,同样可以达到复制字符串的目的,但其中的循环比较繁琐,不如用字符串传送函数方便。七、实验心得及体会学会使用字符串处理操作进行字符串复制,字符串比较,寻找字符以及字符统计,可以极大的简化程序中的循环结构。