皖西学院汇编语言程序设计第四章第四章汇编语言程序设计2汇编语言程序设计基本步骤顺序程序的基本结构和设计方法循环程序的结构形式和程序设计分支程序的结构形式和程序设计2本章要点子程序的基本过程和设计方法34561汇编语言概述第四章汇编语言程序设计3条件成立?成立程序段不成立条件成立?成立程序段不成立(a)当型循环(b)直到型循环图4.3循环结构循环结构:由条件是否成立,确定是否重复执行某段程序。第四章汇编语言程序设计4循环程序组成:①循环初值部分:为了保证循环程序能够正常进行循环操作而必须做的准备工作;②循环体:需要重复执行的程序段;③修改部分:按照一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据;④控制部分:用来保证循环程序按照规定的次数或者特定条件正常循环。第四章汇编语言程序设计53.3.4串操作类指令串操作指令:数据传送类指令每次只能传送一个数据,若要传送大批数据就需要重复编程,这样就浪费了大量的时间和空间。为此8086提供了一组处理主存中连续存放数据串的指令,这就是串操作指令。功能:传送MOVS、比较CMPS、搜索SCAS、存STOS、取LODS。第四章汇编语言程序设计63.3.4串操作指令SI用于寻址源操作数(存于数据段),由DS提供段地址。DI用于寻址目的操作数(存于附加段),由ES提供段地址。重复执行串操作指令(由CX控制次数),可实现串操作。SI、DI中的地址减小(DF=1)SI、DI中的地址增大(DF=0)执行一次串操作指令后特点:串操作中“B”为字节操作,“W”为字操作。第四章汇编语言程序设计712相等重复前缀REPE/REPZ3不相等重复前缀REPNE/REPNZ重复操作前缀有下列三种形式:(CX)=0或ZF=0?-+1是否执行串操作指令1(SI)(SI)1(DI)(DI)+是否退出执行(CX)(CX)(CX)=0或ZF=1?-+1是否执行串操作指令1(SI)(SI)1(DI)(DI)+是否退出执行(CX)(CX)(CX)=0?-+1是否执行串操作指令1(SI)(SI)1(DI)(DI)+是否退出执行(CX)(CX)重复前缀REP第四章汇编语言程序设计81、REP(Repeat)REP前缀用在MOVS、STOS指令前,使后面的串指令重复执行功能:每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束。2、REPZ/REPE相等/为零时重复操作前缀(Repeatwhileequal/zero)该指令一般用在CMP、SCAS指令前,当(CX)不等于0且比较相等的情况下,重复执行串指令。功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。重复前缀指令REPREPZREPNZ第四章汇编语言程序设计93、REPNZ/REPNE不相等/不为零时重复操作前缀(Repeatwhilenotequal/notzero)该指令一般用在CMPS、SCAS指令前,当(CX)不等于0且比较不相等的情况下,重复执行串指令。功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。第四章汇编语言程序设计10语句格式:MOVSDST,SRCMOVSB——字节串传送MOVSW——字串传送功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。即:1)(DS:[SI])→(ES:[DI])。2)当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。4.传送指令MOVSMovstring第四章汇编语言程序设计11MOVSI,OFFSETSRCMOVDI,OFFSETDSTMOVCX,100;CX←传送次数CLD;DF=0,地址增加AGAIN:MOVSB;传送一个字节DECCX;传送次数减1JNZAGAIN;判断CX是否为0;;0,则到AGAIN位置;1,结束【例】从源地址传送100个字节数据到目标地址第四章汇编语言程序设计12语句格式:STOSDSTSTOSB——往字节串中存数STOSW——往字串中存数功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。即:①字节操作:(AL)→(DI)字操作:(AX)→(DI)。②修改指针DI,使之指向串中的下一个元素。当DF=0时,(DI)增量;当DF=1时,(DI)减量。5.串存储指令STOSStoreintostring第四章汇编语言程序设计13【例】向DI指向的存储区输入0(把某一段存储单元清0)MOVAX,0MOVDI,DI,OFFSETDST;DI为目标地址MOVCX,1000;CX←传送次数CLD;DF=0,地址增加REPSTOSW;重复传送字第四章汇编语言程序设计14语句格式:LODSDSTLODSB——从字节串中取数LODSW——从字串中取数功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。即①字节操作:((SI))→AL,字操作:((SI))→AX。②修改指针SI,使它指向串中的下一个元素。当DF=0时,(SI)增量;当DF=1时,(SI)减量。6.从源串中取字符指令LODSLoadfromstring第四章汇编语言程序设计15语句格式:CMPSDST,SRCCMPSB——字节串比较CMPSW——字串比较功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。即:①((SI))-((DI))。②修改串指针,使之指向串中的下一个元素。当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。7.串比较指令CMPSComparestring第四章汇编语言程序设计16【例4-4】:已知在内存中有两个字符串STR1和STR2,比较两个字符串是否相等,相等,将FLAG单元置为1,否则送0。DATASEGMENTSTR1DB‘ASDFGHJK’CNEQU$-STR1数据段STR2DB‘ASDFGTYU’FLAGDB?DATAENDSCODESEGMENT代码段ASSUMECS:CODE,DS:DATA,ES:DATA第四章汇编语言程序设计17START:MOVAX,DATAMOVDS,AXMOVES,AX;初始化DS,ESMOVFLAG,1MOVSI,OFFSETSTR1MOVDI,OFFSETSTR2;偏移地址送SI、DIMOVCX,CNCLD;DF=0REPZCMPSBJZNEXT;ZF=1跳转到NEXT处执行MOVFLAG,0;ZF=0,不相等,FLAG置0NEXT:MOVAH,4CHINT21H;终止当前程序并返回DOSCODEENDSENDSTART第四章汇编语言程序设计18语句格式:SCASDST,SRCSCASB——字节串搜索SCASW——字串搜索功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存。即:①字节操作:(AL)-((DI));字操作:(AX)-((DI))。②修改指针使之指向串中的下一个元素。当DF=0时,(DI)增量。当DF=1时,(DI)减量。8.串搜索指令SCAS第四章汇编语言程序设计199.CLD清除方向标志指令操作:该指令使DF=0,地址自动增量。10.STD设置方向标志指令操作:该指令使DF=1,地址自动减量。第四章汇编语言程序设计203.3.5控制转移类指令1)无条件转移指令(JMP)2)条件转移指令(简单条件转移、无符号数、有符号数条件转移)3)循环控制指令(LOOP、LOOPE、LOOPNE)4)子程序调用和返回指令(CALL、RET)第四章汇编语言程序设计213循环指令(1)循环指令LOOP(2)相等/为零循环指令LOOPE(3)不相等/不为零循环指令LOOPNE(4)CX为零转移指令JCXZ第四章汇编语言程序设计22循环程序框图:(COUNT)=循环次数循环体(COUNT)=(COUNT)-1(COUNT)=0?yesno第四章汇编语言程序设计23语句格式:LOOP短标号操作:(CX)(CX)-1功能:(CX)≠0,则程序转移;否则,顺序执行。说明:使用LOOP指令可代替两条指令:DECCXJNE/JNZ短标号(1)循环指令LOOP第四章汇编语言程序设计24解:XORAH,AH;累加器清零MOVCX,08H;设置循环次数START:ROLAL,1;AL循环左移1位,;AL的最高位送CFJNCLP;CF=0,转移到LPINCAH;CF=1,AH+1→AHLP:LOOPSTART;CX-1→CX,CX≠0,;循环到START执行HLT;程序段结束返回【例】请编写指令序列,确定AL中“1”的个数第四章汇编语言程序设计25语句格式:①LOOPE短标号②LOOPZ短标号操作::(CX)(CX)-1功能:(CX)≠0且ZF=1,则程序转移;否则,顺序执行。(2)相等/为零循环指令LOOPE第四章汇编语言程序设计26语句格式:①LOOPNE短标号②LOOPNZ短标号操作::(CX)(CX)-1功能:(CX)≠0且ZF=0,则程序转移;否则,顺序执行。(3)不相等/不为零循环指令LOOPNE第四章汇编语言程序设计273.循环程序的结构和程序设计根据条件重复执行一段指令就构成了循环程序结构。例:MOVAX,0;累加求和寄存器清0MOVBX,OFFSETARRAY;数组始址送BX中MOVCX,50;循环控制计数初始化AGAIN:ADDAX,[BX]ADDBX,2;数组地址增2,BX指向下一个元素DECCX;循环控制计数减1JNZAGAIN;计数不为0时继续循环MOVS,AX;计数为0时循环结束,和存于S中将ARRAY数组中的50个字数据求和,并将和存入字变量S中第四章汇编语言程序设计28保证循环正常执行和结束的条件:正确地初始化循环控制计数和初始条件1正确地检测循环条件2必须保证能达到循环结束条件(例如在循环体内有修改循环控制值的指令)3指令系统提供了专门用于循环结构的循环控制指令,更加简便的地实现循环结构。1)循环程序的结构和程序设计第四章汇编语言程序设计29(CX)≠0且ZF=1?(CX)≠0且ZF=1?执行循环体执行循环体(CX)(CX)-1(CX)(CX)-1是否退出循环退出循环(CX)≠0且ZF=1?(CX)≠0且ZF=1?执行循环体执行循环体(CX)(CX)-1(CX)(CX)-1是否退出循环退出循环(CX)≠0且ZF=0?(CX)≠0且ZF=0?执行循环体执行循环体(CX)(CX)-1(CX)(CX)-1是否退出循环退出循环(CX)≠0且ZF=0?(CX)≠0且ZF=0?执行循环体执行循环体(CX)(CX)-1(CX)(CX)-1是否退出循环退出循环(CX)≠0?(CX)≠0?执行循环体执行循环体(CX)(CX)-1(CX)(CX)-1是否退出循环退出循环(CX)≠0?(CX)≠0?执行循环体执行循环体(CX)(CX)-1(CX)(CX)-1是否退出循环退出循环循环控制指令的转移范围为:-128~+127字节格式:LOOP标号(段内短转移)(1)LOOP指令(2)等于继续循环指令格式:LOOPZ/LOOPE标号(3)不等于继续循环指令格式:LOOPNZ/LOOPNE标号循环控制指令第四章汇编语言程序设计30LOOPAGAIN在前面的求和例子中,可用一条循环指令代替两条指令:DECCXJNZAGAIN例:MOVCX,80MOVSI,-1MOVAL,$AGAIN:INCSICMPAL,STRS[SI]LOOPNEAGAINMOVLEN,SI设:STRSDBstring$求存放在STRS存储区中的字符串(以$结束)长度。第四章汇编语言程序设计312)循环程序设计方法计数控制法——用于循环次数已知的情况条件控制法——用于循环次数不确定的情况控制