150 likes | 322 Views
第 5 章 程序设计基本技术 (2). 循环结构程序设计. 教学重点. 综合应用第 3 章硬指令和第 4 章伪指令,第 5 章从程序结构角度展开程序设计,重点掌握: 循环结构程序设计. 5.4 循环程序设计. 循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体 循环指令和转移指令可以实现循环控制;还可以采用 MASM 6.x 提供的循环控制伪指令实现. 循环指令 LOOP :例 5.5 等. 循环指令 LOOPE :例 5.6. 转移指令:例 5.7. 多重循环:例 5.8 等. 一 循环指令 (loop ).
E N D
第5章 程序设计基本技术(2) • 循环结构程序设计 教学重点 综合应用第3章硬指令和第4章伪指令,第5章从程序结构角度展开程序设计,重点掌握: 循环结构程序设计
5.4 循环程序设计 • 循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体 • 循环指令和转移指令可以实现循环控制;还可以采用MASM 6.x提供的循环控制伪指令实现 循环指令LOOP:例5.5等 循环指令LOOPE:例5.6 转移指令:例5.7 多重循环:例5.8等
一 循环指令(loop) JCXZ label ;CX=0,转移到标号label LOOP label ;CX←CX-1, ;CX≠0,循环到标号label LOOPZ label ;CX←CX-1, ;CX≠0且ZF=1,循环到标号label LOOPNZ label ;CX←CX-1, ;CX≠0且ZF=0,循环到标号label • 循环指令默认利用CX计数器,方便实现计数循环的程序结构 • label操作数采用相对寻址方式
cmp cx,0 jz next dec cx jnz again 例5.44:记录空格个数 mov cx,count;设置循环次数 mov si,offset string xor bx,bx ;bx=0,记录空格数 jcxz done ;如果长度为0,退出 mov al,20h again: cmp al,es:[si] jnz next ;ZF=0非空格,转移 inc bx ;ZF=1是空格,个数加1 next: inc si loop again ;字符个数减1,不为0继续循环
初始化 循环的初始状态 循环体 循环的工作部分 及修改部分 修改部分 Y 计数控制循环 条件控制循环 控制条件 N 结束 二 循环结构
例5.5 求和 Code segment assume cs:code,ds:code org 100h Start: jmp begin sum dw ? Begin: mov ax,cs mov ds,ax sor ax,ax ;被加数AX清0 mov cx,100 again: add ax,cx ;从100,99,...,2,1倒序累加 loop again mov sum,ax ;将累加和送入指定单元 mov ah,4ch int 21h Code ends end start • 计数控制循环 • 循环次数固定
例5.6 …… mov ax,wordX ;测试目标送AX mov cx,16;循环计数器置初值 mov dl,-1 ;计位器置初值 again: inc dl test ax,1 ror ax,1 ;循环指令不影响ZF loope again ;CX≠0且ZF=1(测试位为0),继续循环 je notfound mov byteY,dl jmp done notfound: mov byteY,-1 ;ZF=1,16个位均为0 done: • 计数控制循环 • 最大循环次数固定,满足条件退出
大小写字母仅 D5位不同 例5.7 大小写 mov bx,offset string again: mov al,[bx] ;取一个字符 or al,al ;是否为结尾符0 jz done ;是,退出循环 cmp al,'A' ;是否为大写A~Z jb next cmp al,'Z' ja next or al,20h ;是,转换为小写字母(使D5=1) mov [bx],al ;仍保存在原位置 next: inc bx jmp again ;继续循环 done: • 条件控制循环 • 利用标志退出
冒泡法 图示 • “冒泡法”是一种排序算法,不是最优的算法,但它易于理解和实现 • 冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次大的元素排在后面;如此重复,直至完成就实现元素从小到大的排序 • 这需要一个双重循环程序结构
例5.8 movcx,count ;CX←数组元素个数 dec cx ;元素个数减1为外循环次数 outlp: movdx,cx ;DX←内循环次数 mov bx,offset array inlp:mov al,[bx] ;取前一个元素 cmp al,[bx+1] ;与后一个元素比较 jna next ;前一个不大于后一个元素,则不进行交换 xchg al,[bx+1] ;否则,进行交换 mov [bx],al next: inc bx ;下一对元素 dec dx jnz inlp ;内循环尾 loop outlp ;外循环尾 • 计数控制双重循环
例5.9 剔除空格-1/3 ;现有一个以$结尾的字符串,要求剔除其中的空格 Data segment string db ’Let us have a try !’,’$’ Data ends Code segment assume cs:code,ds:data Start: mov ax,data mov ds,ax mov si,offset string
例5.9 剔除空格-2/3 outlp: cmp byte ptr [di],’$’ ;外循环,先判断后循环 jz done ;为$结束 cmp byte ptr [si],’’ ;检测是否是空格 jnz next ;不是空格继续循环 mov di,si ;是空格,进入剔除空格分支 ;该分支是循环程序段 inlp: inc di mov al,[di] ;前移一个位置
例5.9 剔除空格-3/3 • 条件控制双重循环 mov [di-1],al cmp byte ptr [di],’$’ ;内循环,先循环后判断 jnz inlp jmp outlp next: inc si ;继续对后续字符进行处理 jmp outlp done: mov ah,4ch ;结束 int 21h Code ends end start