汇编语言第五章程序设计的其它方法和技术

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第五章程序设计的其它方法和技术本章内容:串处理宏指令模块化程序设计。5.1字符串操作串:存贮区连续存放的一组字节或字组成的数据。可以是字符、数字等。串的基本操作:传送MOVS、搜索SCAS、比较CMPS、存贮STOS、取LODS。目的:简化编程。使用串指令的初始条件:①源操作数用DS:[SI]寻址;②目的操作数用ES:[DI]寻址;③传送、搜索、存贮、取串的方向由DF标志决定;CLD指令:清方向标志,DF=0,使SI、DI增量修改;STD指令:置方向标志,DF=1,使SI、DI减量修改。④串指令前面可使用重复操作前缀。2重复前缀:REP无条件重复。执行操作:①如(CX)=0则退出REP,否则往下执行。②(CX)–1→CX。③执行其后的串指令(MOVS、LODS、STOS)。④重复①~③。REPE/REPZ比较相等或为0时重复,执行操作:①如(CX)=0或ZF=0(即某次比较的结果两操作数不等),则退出,否则往下执行。②(CX)–1→CX。③执行其后的串指令(CMPS、SCAS)。④重复①~③。REPNE/REPNZ当不相等或不为0时重复,执行操作:①(CX)=0或ZF=1(即某次比较的结果两操作数相等),则退出,否则往下执行。②(CX)–1→CX。③执行其后的串指令(CMPS、SCAS)。④重复①~③。1.串传送指令格式:MOVSOPD,OPSMOVSB;字节串传送3MOVSW;字串传送功能:DS:[SI]→ES:[DI]。当DF=0时,SI+1(或2)→SI,DI+1(或2)→DI;当DF=1时,SI–1(或2)→SI,DI–1(或2)→DI。例:将以STR1为首址的字节存贮区中存放的字符串送到STR2为首址的字节存贮区中。DATASEGMENTSTR1DB‘ABCD’CONEQU$–STR1STR2DBCONDUP(0)DATAENDS;-------------------------------------------------------CODESEGMENTASSUMEDS:DATA,CS:CODE,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXLEASI,STR1LEADI,STR2MOVCX,CONCLDREPMOVSBMOVAH,4CHINT21HCODEENDSENDSTART42.串比较指令格式:CMPOPD,OPSCMPSB;字节串比较CMPSW;字串比较功能:([SI])―([DI])影响标志位。当DF=0时,SI+1(或2)→SI,DI+1(或2)→DI;当DF=1时,SI–1(或2)→SI,DI–1(或2)→DI。例:从键盘输入一字符串STR1,比较STR1和STR2是否相等。如果相等,则将0→BX,否则将FFFFH→BX。语句:REPMOVSB可写为:L1:MOVAX,STR1[SI]MOVSTR2[DI],AXINCSIINCDIDECCXJNZL15DATASEGMENTSTR1DB80DB0DB80DUP(0)STR2DB‘STRING’CONEQU$–STR2DATAENDS;------------------------------------------------------------CODESEGMENTASSUMEDS:DATA,ES:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVES,AXLEADX,STR1MOVAH,10INT21HMOVAL,STR1+1;比较数组长度CMPAL,CONJNEEXITLEASI,STR1+2LEADI,STR2MOVCX,CONCLDREPZCMPSB;逐个比较是否相等JNEEXIT;不等,转EXITMOVBX,0JMPL1EXIT:MOVBX,0FFFFHL1:MOVAH,4CHINT21HCODEENDSENDSTART6注意:REPZCMPSBJNEEXIT其中:JNE判断的不是CX–1的情况,而是([SI])―([DI])的情况。3.串搜索指令格式:SCASOPDSCASB;字节SCASW;字串功能:AL(字节)或AX(字)-([DI])结果不回送,影响标志位。当DF=0时,DI+1(或2)→DI;当DF=1时,DI–1(或2)→DI。例:在字节字符串STR中搜索子串“AM”出现的次数,并将结果送入BX。分析:先在串中找到’A’,判断下一个是否为’M’。如果是,则表明找到一个’AM’,然后继续向下找。74.存取串指令DATASEGMENTSTRDB‘KFAMDAM’CONEQU$–STRDATAENDS;---------------------------------------------CODESEGMENTASSUMEDS:DATA,ES:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVES,AXLEADI,STRMOVCX,CONMOVBX,0MOVAL,‘A’CLDP:REPNESCASBJEAJMPOUT1A:CMPBYTEPTR[DI],‘M’JNEBINCBXB:CMPCX,0JNEPOUT1:MOVAH,4CHINT21HCODEENDSENDSTART8①从源串中取数格式:LODSOPSLODSB;字节LODSW;字串功能:字节串:([SI])→AL。字串:([SI])→AX。当DF=0时,SI+1(或2)→SI;当DF=1时,SI–1(或2)→SI。②向目的串中存数格式:STOSOPDSTOSB;字节STOSW;字串功能:字节串:(AL)→[DI]。字串:(AX)→[DI]。当DF=0时,DI+1(或2)→DI;当DF=1时,DI–1(或2)→DI。例:在以BLOCK为首址的字存贮区中存放有一组带符号数,将其中的正、负数分开,分别放到PLUS和MINUS单元。分析:9定义三个指针:SI指向字存贮区,DI指向正数存贮区,BX指向负数存贮区。10DATASEGMENTBLOCKDW1,2,-1,-2CONEQU($–BLOCK)/2PLUSDWCONDUP(0)MINUSDWCONDUP(0)DATAENDS;------------------------------------------------------------CODESEGMENTASSUMEDS:DATA,ES:DATA,CS:CODEBEGIN:MOVAX,DATAMOVDS,AXMOVES,AXLEASI,BLOCKLEADI,PLUSLEABX,MINUSMOVCX,CONCLDGOON:LODSW;从BLOCK中取一个数送到AXCMPAX,0JSMIN;AX为负数,则转移到MINSTOSW;正数送入PLUSJMPDECXMIN:XCHGBX,DI;串操作时,要用DI作目的指针STOSW;负数送入MINUSXCHGBX,DIDECX:DECCXJNEGOONMOVAH,4CHINT21HCODEENDSENDBEGIN115.2宏指令与宏库的使用子程序:要付出额外的时间和空间开销。如:参数传递、保护、恢复寄存器,还要执行CALL和RET指令。宏功能:可以简化编程。弥补子程序的不足。一.宏指令作用:用来定义重复使用的指令段。1.宏定义和宏展开①宏定义格式:宏指令名MACRO[<形式参数名>]宏体ENDM②宏调用格式:宏指令名[<形式参数名>]如:12③宏展开带间隔符的实参宏调用:STACK0500DUP(0)宏扩展:+STACKSEGMENTSTACK+DB500DUP(0)+STACKENDSSTACK0MACROASTACKSEGMENTSTACKDBASTACKENDSENDMWRITEMACROALEADX,AMOVAH,9INT21HENDM…DATASEGMENTBUF1DB‘ABCDEF’,‘$’BUF1DB‘STRING’,‘$’DATAENDS…WRITEBUF1…WRITEBUF2…13宏体中的变量和标号如:宏调用:SUM50,1…SUM20,10将会出现2个NEXT标号,造成重复定义NEXT的错误。因为:SUMMACROA,BMOVCX,AMOVBX,BMOVAX,0NEXT:ADDAX,BXADDBX,2LOOPNEXTENDM14出现上述问题的解决办法是:使用伪指令LOCAL。使用LOCAL之后,每次遇到NEXT,将用不同参数代替。语句格式:LOCAL形式参数;功能:让形参顺序生成符号。在上例中,重新定义宏:MOVCX,50MOVBX,1MOVAX,0NEXT:ADDAX,BXADDBX,2LOOPNEXT…MOVCX,20MOVBX,10MOVAX,0NEXT:ADDAX,BXADDBX,2LOOPNEXT…15上述宏调用时,将产生如下的宏展开语句:注意:实参可以是常数、寄存器、存贮器号、变量、操作码或操作码的一部分。2.宏指令与子程序的区别SUMMACROA,BLOCALNEXTMOVCX,AMOVBX,BMOVAX,0NEXT:ADDAX,BXADDBX,2LOOPNEXTENDM+MOVCX,50+MOVBX,1+MOVAX,0+??0000:ADDAX,BX+ADDBX,2+LOOP??0000…+MOVCX,20+MOVBX,10+MOVAX,0+??0001:ADDAX,BX+ADDBX,2+LOOP??0001…16(1)处理时间不同:宏是在编译时展开,子程序是在执行时运作。(2)处理方式不同:宏必须先定义、后调用,汇编结束,宏定义也消失。子程序调用,是CPU将控制方向由主程序转向子程序。(3)对内存空间占用的影响不同:宏调用的次数越多,占用的内存也增加。而子程序占用空间不随调用次数增加。(4)执行速度不同:子程序慢,宏调用执行速度快。(5)参数传递方式不同:宏调用可实现参数代换,参数形式不受限制,使用方便、灵活。子程序参数传递由编程时具体安排,容易出错。二.宏指令定义的位置1.放在源程序的开始位置。2.放在宏库中,用INCLUDE加入到源程序中。三.宏库的使用1.建立宏库:用编辑程序建立宏库,规定文件扩展名为LIB。(注意是一个文本文件)2.调用:用伪指令INCLUDE宏库文件名。例:教材P168。175.3模块化程序设计作用:用于大型程序系统的设计。通过模块的划分,将复杂的问题合理分配到各子模块中去解决,便于多人合作,编程的质量和效率都会提高。此外,通过模块的划分,可以针对不同模块的特性,采用不同的语言编程,有利于发挥各计算机语言的特性。模块化程序设计主要解决的问题:①如何正确地划分模块(功能模块)②如何把模块(程序)装配在一起程序模块的标记:以END语句为结束语句的一个源程序。一.模块划分的原则1.把一些公用的功能,组成一个相对独立的模块;2.各个模块力求具有通用性、功能独立性、逻辑独立性;3.模块接口简单,减少公共符号的个数,形成一个单一入口,单一出口的程序形式。二.模块装配由连接装配程序LINK完成。用户提供的信息:模块间各段的组合方式;模块间数据(入口、出口)传送。181.模块间段的组合方式各模块都有自己的段,而CPU只能访问4个段。因此,必须将各模块的段进行合并。段定义:段名SEGMENT[定位方式][组合方式][‘类别’]…段名ENDS组合方式:①“不选择”:表示本段与其它段逻辑上不发生关系,每一个段都有自己的段首址。这是默认的组合方式。②PUBLIC:将同名、同类别的段按LINK时的顺序组合成一个段,大小不超过64KB;③STACK:与PUBLIC同样处理,运行时,该段为堆栈段。④COMMON:同名、同类别的段具有相同的段首址。⑤“AT表达式”:表示将本段装在根据表达式求值得到的16位的段地址上。⑥MEMORY:表示将本段定位在被连接在一起的其它所有段之上(在最高地址上)。定位方式:连接时段首址可以不从一小段开始,从何处开始由定位方式确定。19①PARA:该段要从能被16整除的地址处开始存放;②WORD:该段要从一个偶数地址处开始存放;③BYTE:该段

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功