1.实验目的1)熟悉串操作指令的功能与应用;2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序;3)了解汇编语言字符串处理基本流程;2.实验基本原理1)字符串操作流程SI寄存器保存源串首地址;DI寄存器保存目的串首地址;CX寄存器保存字符串长度;CLD或STD指令设置字符串处理方向;当CLD指令使DF=0,在执行串处理指令时可使地址自动增量;STD使DF=1,在执行串处理指令时可使地址自动减量。2)重复前缀指令重复次数由计数寄存器CX中存放的值决定,指令每重复执行一次,计数器CX中值减1,当CX中值减至0时,停止重复执行,继续执行下一条指令。当REP无条件重复前缀,重复串操作直到计数寄存器的内容CX为0为止。经常与REP配合工作的字符串处理指令有MOVS、STOS和LODS。当REPE/REPZ判断计数寄存器的内容CX是否为0或ZF=0(即比较的两个操作数不等),只要满足一个则重复执行结束,否则继续执行。可以与REPE/REPZ配合工作的串指令有CMPS和SCAS。当REPNE/REPNZ判断计数寄存器的内容是否为0或ZF=1(即比较的两个操作数相等),只要满足一个则重复执行结束,否则继续执行。可以与REPE/REPZ配合工作的串指令有CMPS和SCAS。3)字符串操作指令lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI;stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI;movsb、movsw:把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI;scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI;cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI;rep:重复其后的串操作指令。重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在LODS前。上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX涉及的标志位:DF、AF、CF、OF、PF、SF、ZF。3.实验内容1)编写程序,比较两个字符串BUF1和BUF所含的字符是否相同,相同则AL返回0,不同AL返回1,字符串长度要求自动获取,要求用字符串处理方法。提示:输入两个字符串之后,将串操作所必须的寄存器等参数设置好,然后使用串操作指令进行从头到尾的比较,两个字符串相等的条件是串长度相等且对应的字符相同。流程图:DATASSEGMENTSTR1DB'Helloworld'CNT1EQU$-STR1STR2DB'Helloworld'CNT2EQU$-STR2DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AX开始输入字符串str1和str2并计算长度cnt1和cnt2cnt1=cnt2??SI和DI分别取str1和str2的偏移地址,SI-DI=0||CX=0?SI和DI自增1ZF=0?将0h移入AL结束将cnt1移入CX中,将1h移入ALNYYNNMOVES,AXMOVCX,CNT1MOVBX,CNT2MOVAH,0MOVAL,1SUBBX,CXJNZNEXTLEASI,STR1LEADI,STR2CLDREPZCMPSBJNZNEXTMOVAL,0NEXT:MOVAH,4CHINT21HCODESENDSENDSTART实验结果字符串1和字符串2都为”HelloWorld”,字符串1为“HelloWorld”,字符串2为“HelloWorld33”2)编写程序,设有一字符串存放在以BUF为首址的数据区中,其最后一字符‘$’作为结束标志,计算该字符串的长度并输出。提示:从串的第一个字符开始统计,直到遇到定义的字符串结束符为止,看看在这个过程中总共有多少个字符,即求得串的长度。DATASSEGMENTBUFDB'Itsurprisesme$'DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXXORAX,AXXORBX,BXLEASI,BUFCLDL:LODSBINCBXCMPAL,'$'JNZLMOVAX,BXMOVAH,4CHINT21HCODESENDSENDSTART实验结果为11H,与字符串长度17一致,证明了程序的正确性3)编写程序,将内存中BUF1某一区域的数据传送到另一区域BUF2中,要求用字符串处理方法。DATASSEGMENTBUF1DB‘Itsurprisesme’CNTEQU$-BUF1DATASENDSEXTRASEGMENTBUF2DBCNTDUP(?)EXTRAENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVAX,EXTRAMOVES,AXMOVCX,CNTLEASI,BUF1LEADI,BUF2CLDREPMOVSBMOVAH,4CHINT21HCODESENDSENDSTART4)编写程序,在已知字符串中搜索特定字符’#’,若找到则AL返回0,找不到AL返回1,要求用字符串处理方法。DATASSEGMENTSTR1DB'Herecomesthe#'CNTEQU$-STR1DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXXORAX,AXMOVCX,CNTLEADI,STR1MOVAL,'#'CLDREPNZSCASBMOVAL,1JNZNEXTMOVAL,0NEXT:MOVAH,4CHINT21HCODESENDSENDSTART“Herecomesthe#”“Herecomesthebus”5)编写程序,统计一串字符串中字符&出现的次数,要求用字符串处理方法。DATASSEGMENTSTR1DB'R&&&&ZE&&RP'CNTEQU$-STR1DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXXORBX,BXMOVCX,CNTLEASI,STR1CLDL:LODSBCMPAL,'&'JNZNEXTINCBXNEXT:LOOPLMOVAH,4CHINT21HCODESENDSENDSTARTBX中数值6与符号’&’重复次数相同,结果正确6)编写程序,设有一字符串已存放在STRBUF为首址的数据区中,编一程序找出其中的‘#’字符,如果字符串中不存在‘#’字符则应该输出“Notfound”。DATASSEGMENTSTRBUFDB'R&&&&ZE&RP'CNTEQU$-STRBUFSTR1DB'Notfound$'DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXXORBX,BXMOVCX,CNTLEASI,STRBUFCLDL:LODSBCMPAL,'#'JZNEXTLOOPLMOVDX,OFFSETSTR1MOVAH,09HINT21HNEXT:MOVAX,01HMOVAH,4CHINT21HCODESENDSENDSTART实验结果:'R&&&&ZE&&RP'不存在‘#’,输出‘notfound’'R&&&&ZE&RP'存在‘#’,AL返回1