1、第五章第五章汇编语言程序设计汇编语言程序设计第一节第一节循环结构程序设计循环结构程序设计 一、循环结构程序概述一、循环结构程序概述 在程序中,在程序中,凡能有规则重复执行的程序段凡能有规则重复执行的程序段称作循环称作循环。包含循环程序段的程序称为循环结构程序。包含循环程序段的程序称为循环结构程序。1、循环程序的组成、循环程序的组成循环的初始状态:循环的初始状态:设置一些初值,如设寄存器、设置一些初值,如设寄存器、计数器的初值等。计数器的初值等。循环体:循环体:由工作部分和修改部分构成。工作部由工作部分和修改部分构成。工作部分是循环程序具体要完成的功能,是循环的主分是循环程序具体要完成的功能,是
2、循环的主要部分,修改部分是控制循环的一些参数有规要部分,修改部分是控制循环的一些参数有规律的变化。律的变化。循环控制部分:循环控制部分:控制循环的结束。控制循环的结束。2 2、循环程序的结构形式:、循环程序的结构形式:循环初始化循环初始化 循环控制条件循环控制条件循环体循环体循环初始化循环初始化循环体循环体循环控制条件循环控制条件二、循环程序设计方法二、循环程序设计方法(95页页)1.循环指令循环指令说明说明:这些指令对状态标志位都没影响这些指令对状态标志位都没影响.LOOPE/LOOPZ和和LOOPNE/LOOPNZ两两类类指指令令有有条条件件地地形形成成循循环环,前前者者当当规规定定的的循
3、循环环次次数数未未完完成成时时,还还必必须须满满足足“相相等等”或或“等于零等于零”的条件,才能继续循环。后者类似,条件相反。的条件,才能继续循环。后者类似,条件相反。两个条件必须同时成立,两个条件必须同时成立,才继续循环才继续循环动画动画(CX)-1 CX循环次数循环次数CX循环体循环体(CX)=0?YNLOOPE/LOOPZZF=1?YN(CX)-1 CX循环次数循环次数CX循环体循环体(CX)=0?YNLOOP操作图操作图ZF=0?LOOPNE/LOOPNZ例例1 1:在屏幕上显示:在屏幕上显示1010行行 “how do you dohow do you do”,程序名程序名:exa.
4、asm:exa.asm(2 2)求)求1N1N自然数的和,结果存在自然数的和,结果存在RESULTRESULT单单元。元。程序如下:程序如下:MOV AXMOV AX,0 0 MOV CX MOV CX,N NDONEDONE:ADD AXADD AX,CXCX LOOP DONE;LOOP DONE;和它等价的指令是?和它等价的指令是?MOV RESULTMOV RESULT,AXAX(2)在一首址为在一首址为ARRAY1长度为长度为20的字符串查找字符的字符串查找字符“*”,如果找到,则将结果单元,如果找到,则将结果单元RESULT清清0,否则,否则结果单元为全结果单元为全1。LEASI,
5、ARRAY1DECSI;为后面循环从第为后面循环从第1个字符作准备个字符作准备.MOVRESULT,0FFH;先假设没找到先假设没找到,送全送全1MOVCX,20MOVAL,*;*的的ASCII为为42D=2AHDONE:INCSICMPAL,SI;与第一个字符比较;与第一个字符比较LOOPNEDONE;不相等且;不相等且CX0,ZF=0继续循环继续循环JcxzEND1;退出循环时退出循环时CX为为0或没找到或没找到MOVRESULT,0;找到找到END1:HLT2 2 串操作指令串操作指令(75(75页页)包括包括串传送、存取、比较、扫描串传送、存取、比较、扫描等等操作操作.利利用用串串操操
6、作作指指令令可可以以直直接接处处理理两两个个存存储储器操作数,方便地处理字符串或数据块。器操作数,方便地处理字符串或数据块。串指令的特点串指令的特点(1 1)指令格式)指令格式串指令可以显式地带有操作数,也可以使串指令可以显式地带有操作数,也可以使用隐含格式。例如串传送指令用隐含格式。例如串传送指令MOVSMOVS,可以有以,可以有以下几种格式:下几种格式:显式:显式:MOVS DST,SRCMOVS DST,SRC隐式:隐式:MOVSBMOVSB;字节传送字节传送 MOVSWMOVSW;字传送字传送 MOVSDMOVSD;双字传送双字传送(2 2)操作数)操作数串指令可以处理串指令可以处理寄
7、存器操作数寄存器操作数和和存储器操作存储器操作数数。若为寄存器操作数则只能放在累加器中,对。若为寄存器操作数则只能放在累加器中,对于字节操作数应放在于字节操作数应放在ALAL中,字操作数放在中,字操作数放在AXAX中。中。对于存储器操作数应先建立地址指针:对于存储器操作数应先建立地址指针:若为若为源操作数源操作数,则必须把,则必须把源串首地址放入源串首地址放入SISI寄存器寄存器,缺省情况寻址,缺省情况寻址DSDS所指向的段。所指向的段。若为若为目标操作数目标操作数,则必须把,则必须把目标串首地址放目标串首地址放入入ES:DIES:DI寄存器寄存器,不允许使用段超越前缀。,不允许使用段超越前缀
8、3 3)地址指针的修改)地址指针的修改串指令执行后系统自动修改地址串指令执行后系统自动修改地址指针指针SISI、DIDI。若为字节型操作其修改。若为字节型操作其修改量为量为1 1,若为字型操作其修改量为,若为字型操作其修改量为2 2。(4 4)方向标志)方向标志方向标志方向标志DFDF决定地址指针的增减决定地址指针的增减方向方向。若若DFDF0 0,则地址指针增量;若,则地址指针增量;若DFDF1 1,则地址指针减量。,则地址指针减量。(5 5)重复前缀)重复前缀串指令前可以加重复前缀串指令前可以加重复前缀REPEREPEREPZREPZ、REPREP或或REPNEREPNEREPNZ,R
9、EPNZ,使后跟的串指令重使后跟的串指令重复执行。复执行。重复次数应事先初始化在计数器重复次数应事先初始化在计数器CXCX。二、串指令二、串指令1 1串传送指令串传送指令 MOVS(76MOVS(76页页)显式格式:显式格式:MOVS DST,SRCMOVS DST,SRC隐含格式:隐含格式:MOVSBMOVSB MOVSW MOVSD MOVSW MOVSD功能功能:源源目标目标,即即(SI)ES:DI,(SI)ES:DI,且自且自动修改动修改SISI、DIDI指针。指针。标志:不影响标志位。标志:不影响标志位。串传送指令允许目的串和源串都是串传送指令允许目的串和源串都是存储器操作数,在这一
10、点上有别于存储器操作数,在这一点上有别于M0VM0V指令。指令。动画演示动画演示 把自把自buffer1buffer1开始的开始的200200个字节数据传送到个字节数据传送到buffer2buffer2开开始的区域中。始的区域中。MOV MOVAX,SEG buffer1AX,SEG buffer1MOVMOVDS,AXDS,AXMOV MOV AX,SEG buffer2AX,SEG buffer2MOV MOV ES,AXES,AXLEALEASI,buffer1SI,buffer1LEALEADI,buffer2DI,buffer2MOVMOVCX,200CX,200CLDCLDREPR
11、EPMOVSBMOVSB 和它等价的程序段是什么?和它等价的程序段是什么?;200;200个字节数据传送完毕后执行下一条指令个字节数据传送完毕后执行下一条指令前面的例子中语句前面的例子中语句REPREP MOVSBMOVSB和它等价的程序段是什么?和它等价的程序段是什么?LAST:MOV AL,SILAST:MOV AL,SI MOV ES:DI,AL MOV ES:DI,AL INC SI INC SI INC DI INC DI LOOP LAST LOOP LASTLast:movsbLast:movsb Loop last Loop last2 2取串指令取串指令 LODS显式格式:显
12、式格式:LODS SRCLODS SRC隐含格式:隐含格式:LODSBLODSB LODSW LODSD LODSW LODSD功能:源功能:源累加器,即累加器,即(SI)AL(SI)AL(或(或AXAX、EAXEAX),且自动修改),且自动修改SISI指针。指针。说明:若说明:若DFDF0,0,则则LODSB(LODSB(或或LODSW)LODSW)使使SISI加加1 1(或(或2 2);若);若DFDF1 1,则,则LODSBLODSB(或(或LODSWLODSW)使)使SISI减减1 1(或(或2 2)。)。标志:不影响标志位。标志:不影响标志位。自自buffer1buffer1开始的开
13、始的1010个非压缩个非压缩BCDBCD码形式存放的十进码形式存放的十进制数转换成制数转换成ASCIIASCII码,按顺序显示在屏幕上。设码,按顺序显示在屏幕上。设DSDS、ESES已已按要求设置按要求设置 LEA LEA SI,buffer1 SI,buffer1MOVMOV CX,10 CX,10CLDCLD MOV AH,02H MOV AH,02H GET GET:LODSBLODSBOROR AL,30H AL,30HMOV DL,ALMOV DL,AL INT 21H INT 21H LOOPLOOP GET GET HLT HLT 3 3存串指令存串指令 STOS显式格式:显式格
14、式:STOS DSTSTOS DST隐含格式:隐含格式:STOSBSTOSB STOSW STOSW STOSD STOSD功能:累加器功能:累加器目标,即目标,即(AL(AL(或或AXAX、EAX)EAX)ES:DI ES:DI,且自动修改,且自动修改DIDI指针。指针。说明:若说明:若DFDF0,0,则则STOSBSTOSB使使DIDI加加1 1;若若DFDF1 1,则,则STOSBSTOSB使使DIDI减减1 1标志:不影响标志位。标志:不影响标志位。把自把自buffer1buffer1开始的非压缩开始的非压缩BCDBCD码存放码存放的十进的十进制数制数转换成转换成ASCIIASCII码
15、码,并放到并放到buufer2buufer2中中,字符串字符串长度为长度为1010字节。设字节。设DSDS、ESES已按要求设置已按要求设置 LEA LEA SI,buffer1 SI,buffer1LEALEA DI,buffer2 DI,buffer2MOVMOV CX,10 CX,10CLDCLD LOP LOP:LODSBLODSBOROR AL,30H AL,30HSTOSBSTOSBLOOP LOPLOOP LOP例例.用用4 4到到5 5种方法编写实现以下功能的程序片断。种方法编写实现以下功能的程序片断。把自把自buffer1buffer1开始的开始的200200个字节数据传送到
16、个字节数据传送到buffer2buffer2开开始的区域中。始的区域中。MOV MOVAX,SEG buffer1AX,SEG buffer1MOVMOVDS,AXDS,AXMOV MOV AX,SEG buffer2AX,SEG buffer2MOV MOV ES,AXES,AXLEALEASI,buffer1SI,buffer1LEALEADI,buffer2DI,buffer2MOVMOVCX,200CX,200CLDCLDREPREPMOVSBMOVSB 和它等价的程序段是什么?和它等价的程序段是什么?;200;200个字节数据传送完毕后执行下一条指令个字节数据传送完毕后执行下一条指令
17、前面的例子中语句前面的例子中语句REPREPMOVSBMOVSB和它等价的程序段是什么?和它等价的程序段是什么?Last:Mov al,siLast:Mov al,si Mov ES:di,al Mov ES:di,al Inc si Inc si Inc di Inc di Loop last Loop lastLast:movsbLast:movsb Loop last Loop lastLast:LodsbLast:Lodsb stosb stosb Loop last Loop lastMOV CX,100MOV CX,100CLDCLDREP MOVSWREP MOVSW6 6串比较
18、指令串比较指令 CMPS显式格式:显式格式:CMPS DST,SRCCMPS DST,SRC隐含格式:隐含格式:CMPSBCMPSB CMPSW CMPSWCMPSDCMPSD功能:源目标功能:源目标,即即(SI)(SI)(ES:DI)(ES:DI),并且根,并且根据指令执行结果设置标志位,然后自动修改据指令执行结果设置标志位,然后自动修改SISI、DIDI指针。指针。说明:若说明:若DFDF0,0,则则CMPSB(CMPSB(或或CMPSW)CMPSW)使使SISI、DIDI各加各加1 1(或(或2 2)。若)。若DFDF1,1,则则CMPSBCMPSB(或或CMPSWCMPSW)使使SIS
19、I、DIDI各减各减1 1(或或2 2)。标志:影响标志:影响ZFZF、SFSF、CFCF、OFOF、AFAF和和PFPF。REPE/REPZ cmps:REPE/REPZ cmps:指令结束后如果指令结束后如果ZfZf为为1 1,表明两串数,表明两串数据相等,据相等,ZfZf为为0 0,表明至少有一个元素不相等。,表明至少有一个元素不相等。或或REPNE/REPNZREPNE/REPNZCMPSCMPS上机作业:字符串比较上机作业:字符串比较(5-18.asm)设数据区有两个字节串,串设数据区有两个字节串,串1 1的长度为的长度为5 5,串串2 2的长度为的长度为10.10.请判断:请判断:
20、若串若串2 2的最后的最后5 5个字符和串个字符和串1 1相同,相同,则置则置FLAGFLAG单元为单元为“Y Y”,否则置为,否则置为“N N”STRING1DB.STRING2DB.FLAGDBYMOVSI,OFFSETSTRING1+4MOVDI,OFFSETSTRING2+9MOVCX,5STDREPECMPSBJZEXITMOVFLAGNEXIT:MOVAH,4CHINT21H7 7串扫描指令串扫描指令 SCAS(搜索关键字)(搜索关键字)(82页页)显式格式:显式格式:SCAS DST SCAS DST 隐含格式:隐含格式:SCASB SCASWSCASB SCASW 功能:功能:
21、累加器目标累加器目标,即即(AL(AL(或或AX)AX)(ES:DIES:DI),并且),并且根据指令执行结果设置标志,然后自动修改根据指令执行结果设置标志,然后自动修改DIDI指针。指针。指令执行后,指令执行后,DIDI自动指向下一个元素,若自动指向下一个元素,若ZfZf1 1,说,说明相等,明相等,如果用如果用REPEREPESCASBSCASB,指令执行后,指令执行后,DIDI自动指向下自动指向下一个元素,若一个元素,若ZfZf1 1,说明串中每一个都与目标相等,说明串中每一个都与目标相等,REPNE/REPNZREPNE/REPNZSCASB SCASB 在一首址为在一首址为ARRAY
22、1长度为长度为20的字符串查找字符的字符串查找字符“*”,如果找到,则将结果单元,如果找到,则将结果单元RESULT清清0,否则,否则结果单元为全结果单元为全1。LEASI,ARRAY1MOVRESULT,0FFH;先假设没找到先假设没找到,送全送全1MOVCX,20MOVAL,*;*的的ASCII为为42D=2AHCLDREPNESCASBJNZEND1;退出循环时退出循环时CX为为0或或没找到没找到MOVRESULT,0;找到找到END1:HLT(三)循环结构的基本模式:(三)循环结构的基本模式:单重循环结构和多重循环结构单重循环结构和多重循环结构(四)常用循环控制方法:(四)常用循环控制
23、方法:1.计数器控制法:适用于循环次数已知情况。计数器控制法:适用于循环次数已知情况。2 2.条件控制法条件控制法 :循环次数未知的情况。循环次数未知的情况。3.3.逻辑尺控制法:适用于作特殊的处理。逻辑尺控制法:适用于作特殊的处理。例例2:求:求1N的自然数的和。设的自然数的和。设N为为50以内的数。以内的数。DATASEGMENTSJDB31,?,?RESULTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVCL,SJDONE:ADDAL,CLADCAH,0DECCLJNZDONEMO
24、VRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART作业作业从从自自然然数数1开开始始累累加加,直直到到累累加加和和大大于于500为为止止,统统计计被被累累加加的的自自然然数数的的个个数数,并并把把统统计计的的个个数数送送入入单单元元N中中,把把累累加加和和送送入入单单元元SUM中中。(sum1.asm)分分析析:用用两两个个寄寄存存器器,一一个个放放累累加加的的次次数数,一一个放累加的和,条件控制法个放累加的和,条件控制法.上机作业:上机作业:1把把x单元开始存放的单元开始存放的20个无符号数个无符号数中的最大数送中的最大数送z单元,并显示出最大数。单元,并显示
25、出最大数。要求从键盘动态输入要求从键盘动态输入20个数,并且个数,并且都是两位数。都是两位数。(bj1.asm)BXBX1234例例5.1:把把BX BX 中中的的二二进进制制数数以以十十六六进进制制的的形式显示在屏幕上形式显示在屏幕上.MOV CH,4MOV CH,4ROTATE:MOV CL,4ROTATE:MOV CL,4 ROL BX,CLROL BX,CL MOV AL,BL MOV AL,BL AND AL,0FH AND AL,0FH ADD AL,30HADD AL,30H ;09 ASCII 30H39H ;09 ASCII 30H39H CMP AL,3AH ;CMP AL
26、3AH ;是否大于是否大于9 9 JL PRINTITJL PRINTIT ADD AL,7HADD AL,7H ;AF ASCII 41H46H ;AF ASCII 41H46HPRINTIT:MOV DL,ALPRINTIT:MOV DL,AL MOV AH,2 MOV AH,2 INT 21H INT 21H DEC CHDEC CH JNZ ROTATE JNZ ROTATE MOV BX,0 MOV BX,0NEWCHAR:MOV AH,1 NEWCHAR:MOV AH,1 ;键盘输入;键盘输入 INT 21HINT 21H SUB AL,30H SUB AL,30H JL EXI
27、T ;JL EXIT ;099退出退出 CBWCBW XCHG AX,BX XCHG AX,BX MOV CX,10 MOV CX,10 MUL CX MUL CX XCHG AX,BX XCHG AX,BX ADD BX,AX ADD BX,AX JMP NEWCHAR JMP NEWCHAREXIT:EXIT:例:从键盘接收十进制数并存入例:从键盘接收十进制数并存入BXBX(010)+1)10+2)10+5 1 2 531 32 35BxBx始终放转换始终放转换后用的数后用的数xdw110,120,130,140,150,160,170,180,190,200ydw?.MOVAX,XMOV
28、BX,OFFSETXMOVCX,9L1:INCBXINCBXCMPAX,BXJAEL2XCHGAX,BXL2:LOOPL1MOVY,AX此程序段完成什么功能此程序段完成什么功能复习复习在一首址为在一首址为ARRAY1长度为长度为20的字符串查找字符的字符串查找字符“*”,如果找到,则将结果单元,如果找到,则将结果单元RESULT清清0,否则,否则结果单元为全结果单元为全1。请填空。请填空LEADI,MOVRESULT,0FFH;先假设没找到先假设没找到,送全送全1MOVCX,MOVAL,2AH;*的的ASCII为为42D=2AHCLDREPNE;退出循环时退出循环时CX为为0或或没找到没找到M
29、OVRESULT,0;找到找到END1:HLT程序段如下:程序段如下:MOVAX,0MOVCX,NDONE:ADDAX,CXLOOPDONEMOVRESULT,AX该程序段完成什么功能该程序段完成什么功能?X DW?X DW?HEAD DW 3,5,15,23,37,49,52,65,78,99HEAD DW 3,5,15,23,37,49,52,65,78,99END1 DW 105END1 DW 105N DW 32 N DW 32 例例5-4(166页页):将正数:将正数N N插入一个已整序的正数插入一个已整序的正数字数组字数组(按递增按递增顺序)顺序)MOV AX,N MOV AX,N
30、 MOV HEAD-2,0FFFFH MOV HEAD-2,0FFFFH MOV SI,0 MOV SI,0COMPARE:COMPARE:CMP END1 SI,AX;CMP END1 SI,AX;相对寻址相对寻址 JLE INSERTJLE INSERT ;小于;小于N,N,直接插入最后直接插入最后 MOV BX,END1 SIMOV BX,END1 SI MOV END1 SI+2,BX MOV END1 SI+2,BX SUB SI,2 SUB SI,2 JMP SHORT COMPAREJMP SHORT COMPAREINSERT:INSERT:MOV END1 SI+2,AX M
31、OV END1 SI+2,AX 3 35 5151523233737494952526565787899991051053232-1-1HEADHEADEND1END1N N X X 例例5.55.5:有数组:有数组 x(x1,x(x1,x2,x2,x10),x10)和和 y(y1,y2,y10)y(y1,y2,y10),编程计算编程计算 z z(z1,(z1,z2,z2,z10),z10)z1=x1 +y1z1=x1 +y1z2=x2 +y2z2=x2 +y2z3=x3 -y3z3=x3 -y3z4=x4 -y4z4=x4 -y4z5=x5 -y5z5=x5 -y5z6=x6 +y6z6=x
32、6 +y6z7=x7 -y7z7=x7 -y7z8=x8 -y8z8=x8 -y8z9=x9 +y9z9=x9 +y9z10=x10+y10z10=x10+y10 逻辑尺:逻辑尺:0 0 1 1 0 1 1 1 0 00 0 1 1 0 1 1 1 0 01 1 减法减法0 0 加法加法把标志位放入存储单元把标志位放入存储单元,存存储单元就称为逻辑尺储单元就称为逻辑尺 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 y dw y
33、1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dch ;0000,0000,1101,1100logic_rule dw 00dch ;0000,0000,1101,1100 mov bx,0mov bx,0 mov cx,10 mov cx,10 mov dx,logic_rule mov dx,logic_rulenext:mov ax,xbxnext:mov ax,xbx shr dx,1 shr dx
34、1 jc subtract jc subtract add ax,ybx add ax,ybx jmp short result jmp short result ;向前引用向前引用subtract:subtract:sub ax,ybx sub ax,ybxresult:mov zbx,axresult:mov zbx,ax add bx,2 add bx,2 loop next loop next 5.1.3 多重循环程序设计【例例5.75.7】在在以以BUFBUF为为首首址址的的字字存存储储区区中中存存放放有有N N个个有有符符号号数数,现现需需将将它它们们按按大大到到小小的的顺顺序序
35、排排列列在在BUFBUF存储区中,试编写其程序。存储区中,试编写其程序。采采用用冒冒泡泡排排序序算算法法从从第第一一个个数数开开始始依依次次对对相相邻邻两两个个数数进进行行比比较较,如如次次序序对对,则则不不交交换换两两数数位位置置;如如次次序序不不对对则则使使这这两两个个数数交交换位置,则第一遍比较后最小值排到最后。换位置,则第一遍比较后最小值排到最后。数数 108169032第一遍第一遍 101690328第二遍第二遍 169032108第三遍第三遍 903216108程序流程图如书本图程序流程图如书本图5-8所示。所示。程序如下:程序如下:DATASEGMENTBUFDW3,-4,6,7
36、9,2,0,-8,-9,-10DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVCX,10;元素个数;元素个数DEC CX;比较遍数比较遍数LOOP1:MOVDX,CX;保保存存外外循循环环的的循循环环次次数数也可以做内循环计数(比较也可以做内循环计数(比较次数)次数)MOVBX,0LOOP2:MOVAX,BUFBX;相邻两数比较;相邻两数比较CMP AX,BUFBX+2JGE LXCHGAX,BUFBX+2;大数放大数放AXMOVBUFBX,AX;并并将将大大数数送送相应单元相应单元L:ADDBX,2;进下一个单元,准备取下一个数进下一个单元,准备取下一个数Looploop2MOVCX,DX;恢复外循环次数,;恢复外循环次数,LOOP LOOP1MOVAH,4CHINT21HCODEENDSEND START思考:外循环次数还可用什么指令处理?思考:外循环次数还可用什么指令处理?上机:上机:编写打印如下图形程序编写打印如下图形程序(yhsj)0102103210432105432106543210765432108765432109876543210






