您好,欢迎访问三七文档
第5章程序设计的其它方法和技术5.1字符串操作5.2宏功能程序设计5.3模块化程序设计5.4源程序综合举例5.1字符串操作5.1.1串操作指令简介5.1.2串操作指令5.1.1串操作指令简介为了方便地实现字符串的操作,简化程序设计,8086提供了字符串操作指令。字符串操作指令共有5条:传送字(节)串MOVS搜索字(节)串SCAS比较字(节)串CMPS取字(节)串LODS存储字(节)串STOS5.1.1串操作指令简介可使用的前缀有:REP无条件重复寄存器CX中指定的次数REPE/REPZ相等/为0时重复,即ZF=1且CX0时重复;否则,终止重复REPNE/REPNZ不相等/不为0时重复,即ZF=0且CX0时重复;否则,终止重复。5.1.1串操作指令简介字符串操作指令在使用格式和使用方法上相互有许多类似的地方,它们隐含地使用相同的寄存器、标志位、符号,情况如下:源串指示器DS:SI,可加段超越前缀;目的串指示器ES:DI,不能加段超越前缀重复次数计数器CXSCAS指令的搜索值在AL/AXLODS指令的目的地址为AL/AXSTOS指令的源地址为AL/AX传送方向:DF=0(用CLD实现)时,SI、DI自动增量DF=1(用STD实现)时,SI、DI自动减量……SB不带操作数的字节串操作指令……SW不带操作数的字串操作指令5.1.1串操作指令简介串操作指令的执行过程示意图源串DS:EA→SI,目的串ES:EA→DI循环次数→CX,0或1→DFCX=0?完成一次串操作SI±1或2,DI±1或2,CX-1重复前缀类型?结束串操作ZF=1?ZF=0?YNYNYNREPREPZREPNZ5.1.1串操作指令简介如有重复前缀REP,必须用(E)CX作计数器;有重复前缀REP时,执行步骤为:第一步:若(E)CX=0,退出重复串操作指令;第二步:执行一次串操作;第三步:根据DF标志修改地址指针;第四步:(E)CX减1(不影响标志位);第五步:转第一步,重复循环。若串操作指令的基本操作影响标志ZF,则可加重复前缀REPE/REPZ或REPNE/REPNZ,此时重复条件除CX不为0外,还要满足结果为0/不为0的条件。5.1.2串操作指令一、串传送指令格式:MOVSOPD,OPSMOVSBMOVSW功能:1)DS:[SI]→ES:[DI]2)DF=0时,SI、DI加1(字节)或2(字操作)DF=1时,SI、DI减1(字节)或2(字操作)可带重复前缀REP,用于数据串的成块传送。5.1.2串操作指令一、串传送指令例1将以STR1为首的字节存储区中存放的字符串传送到以STR2为首址的字节存储区中,试编程。DATASEGMENTSTR1DB‘ABCDEFGHIJKLMN’COUNTEQU$-STR1STR2DBCOUNTDUP(0)DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDS5.1.2串操作指令一、串传送指令例1CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;DS为DATA段首址MOVES,AX;ES也为DATA段首址LEASI,STR1;SI指向源串STR1的串首LEADI,STR2;DI指向目的串STR2的串首MOVCX,COUNT;CX为重复次数CLD;清方向标志位,DF=0REPMOVSB;重复字节串传送CX次MOVAX,4C00H;AX=4C00HINT21H;DOS功能调用,返回DOSCODEENDSENDSTART5.1.2串操作指令一、串传送指令串操作指令的功能完全可以用以前的指令来实现,带重复前缀的串操作也可以用一个循环程序来代替,但使用串操作指令编写的程序简单、精炼,方便阅读,程序代码短、编程效率高、占用存储空间小,运行速度快。特别是在多字符串操作时,更能显示出它的优点。5.1.2串操作指令一、串传送指令使用串操作指令应注意以下两点;(1)由于目的串一定要放在当前附加数据段中,一定要定义附加数据段。最简单而又不容易出错的方法是使当前数据段与当前附加数据段重合。(2)在使用串操作指令之前,一定要先设置方向标志位DF。DF一旦设置好,一般就不会再改变,除非使用了改变DF的指令或改变标志寄存器的指令。串传送指令不影响标志位,因此不带REPZ/REPE和REPNZ/REPNE两种重复前缀。5.1.2串操作指令二、串比较指令格式:CMPSOPD,OPSCMPSBCMPSW功能:1)(DS:[SI])-(ES:[DI]),根据结果设置标志位,结果不保存2)DF=0时,SI、DI加1(字节)或2(字操作)DF=1时,SI、DI减1(字节)或2(字操作)可带重复前缀REPE/REPZ或REPNE/REPNZ。5.1.2串操作指令二、串比较指令例2从键盘上输入一字符串到以STR1为首址的字节缓冲区中,试比较该串与字节字符串STR2是否相等。若相等,使BX=0;否则,使BX=0FFFFH。比较两个字符串是否相等的首要条件是两个字符串的长度相等,如不相等,则无必要比较。使BX=0FFFFH,比较结束。若两字串长度相等,则可用串比较指令CMPSB并带REPZ重复前缀,使两串元素逐一对应比较。如有一个元素不等,则无必要再比较,使BX=0FFFFH,比较结束。如两字串一直比较完,都相等,使BX=0。5.1.2串操作指令二、串比较指令例2DATASEGMENTSTR1DB80;准备输入79个字节DB0;实际输入字节数存放处DB80DUP(0);实际输入字节串存放处STR2DB‘WANL.ASM’;字串2COUNTEQU$-STR2;字串2的字节数DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDS5.1.2串操作指令二、串比较指令例2CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;DS为DATA段首址…………RETU:MOVAX,4C00HINT21HCODEENDSENDSTART5.1.2串操作指令二、串比较指令例2MOVES,AX;ES也为DATA段首址LEADX,STR1;DX指向STR1MOVAH,10;AH=10INT21H;10号DOS功能调用,输入字串MOVAL,STR1+1;AL=实际输入的字节数CMPAL,COUNT;与串2的长度相比较JNEEXIT;不等长,(两字串不相同)转EXIT5.1.2串操作指令二、串比较指令例2LEASI,STR1+2;等长,SI指向串1的首址LEADI,STR2;DI指向串2的首址MOVCX,COUNT;CX=重复次数(串长)CLD;清方向标志位,DF=0REPZCMPSB;相等且CX不为0、继续重复比较JNEEXIT;停止比较时,不相同,转EXITMOVBX,0;相同,BX=0JMPRETU;转RETUEXIT:MOVBX,0FFFFH;(不相同时)BX=0FFFFHRETU:5.1.2串操作指令三、串搜索指令格式:SCASOPD,OPSSCASBSCASW功能:1)AL(字节)或AX(字)—[DI],据结果设置标志位,结果不保存2)DF=0时,DI加1(字节操作)或2(字操作)DF=1时,DI减1(字节操作)或2(字操作)可带重复前缀REPE/REPZ或REPNE/REPNZ。5.1.2串操作指令三、串搜索指令例3在字节字符串STR中搜索子串“AM”出现的次数,并送BX。搜索“AM”,应先找“A”,找到后,则检查下一个字符是否是“M”,若是,BX加1;若此时CX不为0,说明STR串未搜索完,应继续搜索“A”。如果不是“M”,在未搜索完时,也要再继续搜索“A”。5.1.2串操作指令三、串搜索指令例3DATASEGMENTSTRDB‘KFAMAMNAAMAMAMAMA’;字串COUNTEQU$-STR;字串的字节数DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDS5.1.2串操作指令三、串搜索指令例3CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;DS为DATA段首址MOVES,AX;ES也为DATA段首址…………out1:MOVAX,4C00HINT21HCODEENDSENDSTART5.1.2串操作指令三、串搜索指令例3LEADI,STR;DI指向STRMOVCX,COUNT;CX=计数值(字节个数)MOVBX,0;BX=‘AM’的个数,初值为0MOVAL,‘A’;AL=‘A’,准备串搜索CLD;DF=0P:REPNESCASB;不相等且CX不为0,重复搜索JEA;(相等或CX为0时的)相等,转AJMPOUT1;(相等或CX为0时的)CX为0,转OUT1A:CMPBYTEPTR[DI],‘M’;(相等时)下一字节是‘M’?JNEB;不是,转BINCBX;是‘M’,BX=BX+1B:CMPCX,0;CX为0?JNEP;不为0,转P(继续搜索)OUT1:;(CX为0,结束)程序执行结果,BX为字串STR中‘AM’的个数,即BX=6。5.1.2串操作指令四、从源串中取数指令格式:LODSOPSLODSBLODSW功能:1)[SI]→AL(字节)或AX(字)2)DF=0时,SI加1(字节操作)或2(字操作)DF=1时,SI减1(字节操作)或2(字操作)注:该指令一般不带重复前缀。5.1.2串操作指令五、往目的串中存数指令格式:STOSOPDSTOSBSTOSW功能:1)AL(字节)或AX(字)→[DI]2)DF=0时,DI加1(字节操作)或2(字操作)DF=1时,DI减1(字节操作)或2(字操作)注:该指令一般带重复前缀,可将一片连续的存储字节(或字)单元置相同的值。5.1.2串操作指令五、往目的串中存数指令例4在以BLOCK为首址的存储区中存放着一组带符号数,请将其中的正、负数分开分别送到PLUS和MINUS两个存储区中。用串操作指令编程。三个存储区,需要三个指针:SI:BLOCK区的指针DI:PLUS区的指针BX:MINUS区的指针使用串操作指令送数,应使用指针DI。为达到这一目的,可使用XCHGDI,BX指令,使指向MINUS的指针临时转换为DI。5.1.2串操作指令五、往目的串中存数指令例4DATASEGMENTBLOCKDW1,2,-1,-2,-3;有符号的数字串COUNTEQU($-STR)/2;数字的个数PLUSDWCOUNTDUP(0);正数存储区MINUSDWCOUNTDUP(0);负数存储区DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDS5.1.2串操作指令五、往目的串中存数指令例4CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;DS为DATA段首址……MOVAX,4C00H;INT21HCODEENDSENDSTART5.1.2串操作指令五、往目的串中存数指令例4MOVES,AX;ES也为DATA段首址LEASI,BLOCK;SI指向BLOCKLEADI,PLUS;DI指向PLUSLEABX,MINUS;BX指向MINUSMOVCX,COUNT;CX=计数值(数字的个数)CLD;DF=05.1.2串操作指令五、往目的串中存数指令例4GOON:LODSW;CMPAX,0;与0比较JSMIN;为负,转MINSTOSW;为正,存数JMPDECX;转DECXMIN:XCHGBX,DI;(为负时)BX与DI交换STOSW;存数XCHGBX,DI;BX与DI交换DECX:DECCX;CX减1JNEGOON;不为0,转GOON继续循环;(为0)退出程序执行后,PLUS区存放有数据1,2MINUS区存放有数据-1,-2,-35.1.2串操作指
本文标题:宏汇编第5章
链接地址:https://www.777doc.com/doc-3455530 .html