您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 北京理工大学汇编语言实验报告实验三字符串操作实验
实验三字符串操作实验一、实验目的1)熟悉串操作指令的功能与应用;2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序;3)了解汇编语言字符串处理基本流程;二、实验软硬件环境1)硬件环境:惠普64位一体化计算机及局域网;2)软件环境:windows8,红蜘蛛管理系统,MASMforWindows。三、实验相关知识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。四、实验内容1)编写程序,比较两个字符串BUF1和BUF所含的字符是否相同,相同则AL返回0,不同AL返回1,字符串长度要求自动获取,要求用字符串处理方法。提示:输入两个字符串之后,将串操作所必须的寄存器等参数设置好,然后使用串操作指令进行从头到尾的比较,两个字符串相等的条件是串长度相等且对应的字符相同。(I)实验框图(II)实验代码DATASSEGMENTBUF1DB'ABCDEFGH'COUNT1EQU$-BUF1;利用EQU指令,自动获取字符串长度DATASENDSEXTRASEGMENT;定义附加段,即ES段BUF2DB'ABCDEFGH'COUNT2EQU$-BUF2;功能同BUF1EXTRAENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,ES:EXTRASTART:MOVAX,DATASMOVDS,AXMOVAX,EXTRAMOVES,AXLEASI,BUF1;把源操作串的地址放在SI中LEADI,BUF2;把目的操作串的地址放在DI中MOVCX,COUNT1CMPCX,COUNT2;先比较BUF1、BUF2的长度JNZEXIT1;长度不一样,字符串不同,跳转到EXIT1CLD;设置字符串操作方向REPECMPSB;逐个字符比较JNZEXIT1;一旦有不同的字符,跳转到EXIT1MOVAL,0;若全部相同,则字符串相同,返回AL=0JMPEXIT2EXIT1:MOVAL,1;当字符串不同时,返回AL=1EXIT2:MOVAH,4CHINT21HCODESENDSENDSTART(III)实验结果序号BUF1BUF2AL1ABCDEFGHABCDEFGH02ABCABCDE13ABCABD1(IV)实验结果分析序号1中,程序先经过比较字符串长度,相等后再逐一判断每个字符,确定都相等后,返回AL=0;序号2中,比较字符串长度已经发现不相等,所以返回AL=1;序号3中,比较了字符串长度,发现相等,进一步比较字符,循环到最后一个字符时,不相等,所以AL=1.2)编写程序,设有一字符串存放在以BUF为首址的数据区中,其最后一字符‘$’作为结束标志,计算该字符串的长度并输出。提示:从串的第一个字符开始统计,直到遇到定义的字符串结束符为止,看看在这个过程中总共有多少个字符,即求得串的长度。(I)实验框图(II)实验代码DATASSEGMENTBUFDB'TBE123000000$'DATASENDSEXTRASEGMENTCHARDB'$';ES段设置待比较的字符‘$’EXTRAENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,ES:EXTRASTART:MOVAX,DATASMOVDS,AXMOVAX,EXTRAMOVES,AXLEASI,BUF;获取BUF的地址L:MOVAL,[SI]SCASBCHARJNZEXIT1JZEXIT2EXIT1:INCSI;不是‘$’,计数器加1,同时字符串后移一位JMPLEXIT2:DECSI;SI多加了一个1MOVAX,SIMOVBL,10DIVBL;考虑SI是两位数的情况MOVDX,AXADDDX,3030H;把数字转化为ASCII码MOVAH,02HINT21H;打印低位MOVDL,DHMOVAH,02HINT21H;打印高位MOVAH,4CHINT21HCODESENDSENDSTART(III)实验结果序号字符串屏幕输出结果1'123456$'062'0123456789$'10(IV)实验结果分析序号1:L循环了6次,查找到‘$’,故SI等于6,直接用DOS的2号功能打印出字符2,注意DL里的数字2转化为“字符2的ASCII码”,加上30H即可;序号2:循环十次,主要是逻辑上的两位数,要分离处理,因为2号功能只能打印一个字符;考虑除以10,得到商作为十位,余数作为个位。此时还是二进制,加上3030H,在打印即可。3)编写程序,将内存中BUF1某一区域的数据传送到另一区域BUF2中,要求用字符串处方法。(I)实验框图(II)实验代码DATASSEGMENTBUF1DB'TBE123000000'COUNTEQU($-BUF1)DATASENDSEXTRASEGMENTBUF2DBCOUNTDUP(?);定义了BUF1长度COUNT的字符串EXTRAENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,ES:EXTRASTART:MOVAX,DATASMOVDS,AXMOVAX,EXTRAMOVES,AXLEASI,BUF1LEADI,BUF2MOVCX,COUNT;设置CX的值CLD;设置DF=0,[SI]增加的方向进行串操作REPMOVSB;进行数据段DS到附加段ES的搬移MOVAH,4CHINT21HCODESENDSENDSTART(III)实验结果字符串BUF1结果'TBE123000000'见下图(IV)实验分析本题难度较小,只要一个重复前缀REP,再用MOVSB就可以实现“搬移”。4)编写程序,在已知字符串中搜索特定字符’#’,若找到则AL返回0,找不到AL返回1,要求用字符串处理方法。(I)实验框图(II)实验代码DATASSEGMENTBUF1DB'TBE123000000'COUNTEQU($-BUF1)DATASENDSEXTRASEGMENTCHARDB'#'EXTRAENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,ES:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXLEADI,BUF1MOVAL,'#';‘#’放在AL中,准备使用SCASB指令MOVCX,COUNT;设置循环次数CLD;设置DF=0,正向操作REPNESCASB;不相等时继续循环,相等时顺序执行下面指令JZFOUND;若ZF=0,说明找到‘#’,赋值AL=0MOVAL,1;否则,没找到‘#’,赋值AL=1JMPEXITFOUND:MOVAL,0EXIT:MOVAH,4CHINT21HCODESENDSENDSTART(III)实验结果序号字符串AL1'TBE123000000'12'TBE12300#'0BUF为'TBE123000000'的结果:BUF为'TBE12300#'的结果:(IV)实验分析本次实验较为简单,设置好CX和DF后,将‘#’放入AL,利用重复前缀REPNE以及字符串比较指令SCASB,进行逐个比较,一旦发现ZF=0,跳转到FOUND,对AL进行赋0;否则,比较结束后,没找到‘#’,AL=1。5)编写程序,统计一串字符串中字符&出现的次数,要求用字符串处理方法。(I)实验框图(II)实验代码DATASSEGMENTBUF1db'&&&adc&'countequ$-stringDATASENDSSTACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AXmovbx,0;将计数器BX清零leasi,BUF1movcx,count;设置循环次数Cld;DF=0,正向操作L1:lodsbcmpal,'&'jnzL2;不是'&'就继续循环incbx;是'&',BX就加1L2:loopL1MOVAH,4CHINT21HCODESENDSENDSTART(III)实验结果序号字符串‘&’个数(BX)1'&&&adc&'42'159*%¥@#'0(IV)实验分析将CX和DF设置好以后,就可以从第一个字符开始比较,这里用到CMP,而不是SCASB,因为前者可以用于比较并计数,后者只能扫描字符。找到一个’&’,就让BX加1,否则跳到LOOPL1,继续循环。6)编写程序,设有一字符串已存放在STRBUF为首址的数据区中,编一程序找出其中的‘#’字符,如果字符串中不存在‘#’字符则应该输出“Notfound”。(I)实验框图(II)实验代码DATASSEGMENTstrbufdb'&&AB#&'countequ$-strbufstring1db'Notfound$'string2db'Found$';可能会输出的字符串DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXmovbx,0leasi,strbuf;获取字符串地址movcx,count;设置循环次数Cld;设置DF=0L1:lodsbcmpal,'#'jzL2loopL1movah,9h;未找到’#’,打印’Notfound’leadx,string1int21hL2:movah,9hleadx,string2int21h;找到’#’,打印’Found’MOVAH,4CHINT21HCODESENDSENDSTART(III)实验结果序号字符串结果1'&&ABCD&'Notfound2'&&AB#&'Found(IV)实验分析本题与与第(4)题思路一样,只是最后结果的处理不一样,题目要求没找到‘#’,输出’Notfound’,需要调用DOS的9号功能来打印字符串;在此基础上,没找到时,输出’Found’,更加直观。五、实验心得本次实验主要是要求熟练掌握字符串操作,在此基础上,
本文标题:北京理工大学汇编语言实验报告实验三字符串操作实验
链接地址:https://www.777doc.com/doc-1728508 .html