1、第第5 5章章 控制转移和程序结构控制转移和程序结构5.3 循环程序结构循环程序结构第第5章章 控制转移和程序结构控制转移和程序结构5.1 目标地址寻址方式目标地址寻址方式5.1.1 转移范围转移范围5.1.2 寻址方式寻址方式5.1.3 无条件转移指令无条件转移指令5.2 分支程序结构分支程序结构5.2.1 条件转移指令条件转移指令5.2.2 单分支结构单分支结构5.2.3 双分支结构双分支结构5.2.4 多分支结构多分支结构5.3 循环程序结构循环程序结构5.3.1 循环指令循环指令5.3.2 计数控制循环计数控制循环5.3.3 条件控制循环条件控制循环5.4 子程序结构子程序结构5.4.
2、1 子程序指令子程序指令5.4.2 子程序设计子程序设计5.4.3 参数传递参数传递5.4.4 程序模块程序模块5.3 循环程序结构循环程序结构p5.3.1 循环指令循环指令p5.3.2 计数控制循环计数控制循环p5.3.3 条件控制循环条件控制循环循环控制方法循环控制方法循环程序结构循环程序结构p当型循环当型循环n先判断,后循环先判断,后循环p直到型循环直到型循环n先循环,后判断先循环,后判断循环程序的组成循环程序的组成p参数初始化部分参数初始化部分n循环次数、各变量的初值等循环次数、各变量的初值等p工作部分工作部分n为完成程序功能而设计的主要程序段为完成程序功能而设计的主要程序段p参数修改
3、部分参数修改部分n修改循环计数据及操作数地址等修改循环计数据及操作数地址等p循环控制部分循环控制部分n判断是否结束循环判断是否结束循环5.3.1 循环指令循环指令pLOOPlabeln;ECXECX1n若若ECX0,循环到,循环到LABEL;否则,顺序执行否则,顺序执行pJECXZlabeln;ECX0,转移,转移;否则顺序执行否则顺序执行pJCXZlabeln;CX0,转移,转移;否则顺序执行否则顺序执行p注意注意n跳转范围跳转范围均为均为相对短转移相对短转移:-128+127n32位段使用位段使用ECX(16位段使用位段使用CX)作为计数器)作为计数器DECECXJNZlabel;计数控制
4、循环计数控制循环常用循环控制方法常用循环控制方法p计数控制计数控制n循环次数循环次数已知已知,每循环一次加,每循环一次加/减减1n实现:常用实现:常用LOOP指令指令p条件控制条件控制n循环次数循环次数未知未知,须根据条件控制循环,须根据条件控制循环n实现:用条件转移指令实现:用条件转移指令p状态控制状态控制n根据事先设置或实时检测的根据事先设置或实时检测的状态状态来控制循环来控制循环例题例题5-11数组求和程序数组求和程序-1mov ecx,lengthof arrayxor eax,eax;求和初值为求和初值为0mov ebx,eax;数组指针为数组指针为0again:movzx edx,
5、arrayebx*(type array)add eax,edx;求和求和 inc ebxloop againmov sum,eax;保存结果保存结果循环初始循环初始循环体循环体循环控制循环控制计数控制计数控制例题例题5-11数组求和程序数组求和程序-2mov ecx,lengthof arrayxor eax,eax;求和初值为求和初值为0jecxz done;数组元素为数组元素为0个个,不求和,不求和mov ebx,eax;数组指针为数组指针为0again:movzx edx,arrayebx*(type array)add eax,edx;求和求和 inc ebxloop againdo
6、ne:mov sum,eax;保存结果保存结果计数控制计数控制0A号号DOS功能调用功能调用字符串输入字符串输入功能编号功能编号AH0AH入口参数入口参数DS DX键盘输入缓冲区逻辑地址键盘输入缓冲区逻辑地址(段地址(段地址 偏移地址)偏移地址)功能说明功能说明读取从键盘输入的一个字符串(读取从键盘输入的一个字符串(有回显有回显),直到),直到按下回车键。按下回车键。键盘输入缓冲区的键盘输入缓冲区的第第1个字节个字节是缓冲区字节大小是缓冲区字节大小(最大为(最大为255),),第第2个字节个字节在调用结束时被功能在调用结束时被功能调用填进输入的字符个数,调用填进输入的字符个数,第第3个字节开始
7、个字节开始存放输存放输入字符的入字符的ASCII码,码,最后最后是回车字符(是回车字符(0DH)。)。例题例题5-12输入字符串大小写转换程序输入字符串大小写转换程序-1;数据段数据段keynum=255keybufdb keynum;键盘输入缓冲区键盘输入缓冲区db 0db keynum dup(0);代码段代码段mov dx,offset keybuf;设置入口参数设置入口参数DXmov ah,0ahint 21h;用户用回车键结束用户用回车键结束mov dl,0ah;回车后再进行换行回车后再进行换行mov ah,2int 21h输入输入“Hi”,回车,缓冲区:,回车,缓冲区:FF 02
8、48 69 0D 00 例题例题5-12输入字符串大小写转换程序输入字符串大小写转换程序-2mov bx,offset keybuf+1;输入字符个数输入字符个数mov cl,bx;作为循环的次数作为循环的次数mov ch,0again:inc bx;BX指向输入字符指向输入字符mov dl,bx;取出一个字符取出一个字符cmp dl,a;小于小写字母小于小写字母“a”jb dispcmp dl,z;大于小写字母大于小写字母“z”ja disp;直接去显示直接去显示sub dl,20h;小写字母转换为大写字母小写字母转换为大写字母disp:mov ah,2;显示一个字符显示一个字符int 21
9、hloop again;循环循环计数控制计数控制例题例题5-13记录字符串特定字符个数程序记录字符串特定字符个数程序mov esi,offset stringxor ebx,ebx;EBX用于记录空格数用于记录空格数again:mov al,esicmp al,0;判断字符串是否结束判断字符串是否结束jz done cmp al,20h;空格的空格的ASCII码是码是20Hjne next;不相等、不是空格,转移不相等、不是空格,转移inc bx;相等、是空格,个数加相等、是空格,个数加1next:inc esijmp again;继续循环继续循环done:mov space,ebx;保存结果
10、保存结果条件控制条件控制p例例1.统计字节数据块:统计字节数据块:-1-1,-3-3,5 5,6 6,9 9,中中负元素负元素的个数的个数数据段定义如下:数据段定义如下:DATA SEGMENTBUFDB-1,-3,5,6,9,;定义若干字节带符号数定义若干字节带符号数CUNTEQU$BUF;计算数据块长度计算数据块长度RESULTDW?;定义存放结果单元定义存放结果单元DATA ENDS;代码段程序:代码段程序:MOV BX,OFFSET BUF;建立数据指针建立数据指针MOV CX,CUNT;设置循环次数设置循环次数MOV DX,0;置结果初值置结果初值LP1:MOV AL,BX;取数据取
11、数据ANDAL,AL;设置标志位设置标志位JNSPLUS;是正数,转去是正数,转去PLUSINCDX;是负数,负数个数是负数,负数个数1PLUS:INCBX;调整数据指针调整数据指针LOOPLP1;(CX1)0,继续循环,继续循环MOV RESULT,DX;存入负数个数存入负数个数计数控制计数控制参数初始化参数初始化循环控制循环控制参数修改参数修改p例例2.设:设:AX寄存器中有一个寄存器中有一个16位的二进制数位的二进制数要求:编程统计要求:编程统计AX中中1(bit)的个数并存入的个数并存入CX;方法方法1:当当AX内容为全内容为全0,不必再继续统计,不必再继续统计MOV CX,0;置置结
12、果计数器结果计数器初值初值LP:ANDAX,AX;AX=0否否?JZEXIT;是,退出循环是,退出循环SALAX,1;否,否,AX的最高位移至的最高位移至CF中中JNCZERO;CF0,转,转ZERO继续循环继续循环INCCX;CF1,结果计数器加,结果计数器加1ZEO:JMPLPEXIT:条件控制条件控制循环次数未知循环次数未知先判断,后执行先判断,后执行;方法方法2:每位:每位和和1“与与”,不等为,不等为0,否则为,否则为1MOV CX,16 ;AX中二进制数的位数中二进制数的位数MOV DX,0001HAA:TEST AX,DXJZLOP ;该位为该位为0,则跳转则跳转INCBX LO
13、P:SHRAX,1LOOPAAMOV CX,BX状态控制状态控制多重循环多重循环程序设计程序设计p注意注意n循环可以嵌套循环可以嵌套(多重循环多重循环)p多个循环体之间不能交叉多个循环体之间不能交叉p控制条件不能混淆控制条件不能混淆n内循环内循环外循环:可以外循环:可以n外外循环循环内内循环:不可以循环:不可以n千万不能:千万不能:循环回到初始化部分循环回到初始化部分p否则会出现死循环否则会出现死循环p例:软件延时程序例:软件延时程序SOFTDLYPROC;指令执行时间指令执行时间MOVBL,10;4TDELAY:MOVCX,2801;内循环延时内循环延时10ms 4TWAIT:LOOP WA
14、IT;17T OR 5TDECBL;3TJNZDELAY;16T OR 4TRET;20TSOFTDLYENDPt=410(4(28011712)316)1220TT T:CPUCPU的时钟周期,设的时钟周期,设T T210S210S例例.冒泡排序算法冒泡排序算法程序程序(1)p数组排序问题通常采用数组排序问题通常采用冒泡排序算法冒泡排序算法p例例.n设:有一个字数组,设:有一个字数组,p首地址:首地址:ARRAY p长度:长度:COUNT n要求:编程按照从大到小的次序排列数组中的数要求:编程按照从大到小的次序排列数组中的数冒泡排序算法的程序框图冒泡排序算法的程序框图 COUNT1COUNT
15、1:外循环次数外循环次数COUNT2COUNT2:内循环次数内循环次数i i:数组下标数组下标若初始数据是反序的若初始数据是反序的(1)需要进行)需要进行n-1趟排序;趟排序;(2)每趟排序要进行)每趟排序要进行n-i次次比较比较(1in-1);(3)在这种情况下,比较)在这种情况下,比较达到最大值:达到最大值:(n-1)/2。程序清单如下:程序清单如下:DSEG SEGMENT DSEG SEGMENT ARRAY ARRAY D DW W d1 d1,d2d2,d3d3,dndn COUNT COUNT COUNT COUNTEQUEQUEQUEQU($($($($ARRAY)/2ARRA
16、Y)/2ARRAY)/2ARRAY)/2;数据个数数据个数数据个数数据个数 DSEG ENDS DSEG ENDS CSEG SEGMENT CSEG SEGMENTASSUME CS:CSEG,DS:DSEGASSUME CS:CSEG,DS:DSEG START:START:MOV AX,DSEG MOV AX,DSEG MOV DS,AX MOV DS,AX MOVCX,COUNTCOUNT;内循环变量存于内循环变量存于CX中,中,DECCX;初值为初值为N-1LOP1:MOVDI,CX;外循环变量存外循环变量存DI中中,初值为初值为N-1MOVBX,0 ;地址指针预置为地址指针预置为 0LOP2:MOVAX,ARRAYBX;取相邻两数比较取相邻两数比较CMPAX,ARRAYBX+2JGECTIN;若符合排列次序若符合排列次序,转移转移XCHG AX,ARRAYBX+2;若不符合排列次序若不符合排列次序,二数交换二数交换MOVARRAYBX,AX ;存大数存大数CTIN:ADD BX,2 2;修改地址指针修改地址指针LOOP LOP2 ;若一遍未比较完若一遍未比较完,继续继续MO
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1