第五章 循环与分支程序设计
第5讲 循环与分支程序设计
; ’0’~’9’ ASCII 30H~39H
; ’A’~’F’数 n 插入一个已整序的正数字数组
loop和[bx]的联合应用
• 计算ffff:0~ffff:b单元中的数据的和,结 果存储在dx中。 • 分析: 怎样解决这两个看似矛盾的问题? 目前的方法(在后面的课程中我们还有 别的方法)就是我们得用一个16位寄 存器来做中介。
loop和[bx]的联合应用
• 我们将内存单元中的 8 位数据赋值到 一个16位寄存器ax中,再将ax中的数据 加到dx上,从而使两个运算对象的类 型匹配并且结果不会超界。
一段安全的空间
• 在8086模式中,随意向一段内存空间写 入内容是很危险的 ,因为这段空间中 可能存放着重要的系统数据或代码。 • 比如下面的指令: mov ax,1000h mov ds,ax mov al,0 mov ds:[0],al
一段安全的空间
• 我们以前在Debug中,为了讲解上的方便, 写过类似的指令。 • 但这种做法是不合理的 ,因为之前我们并 没有论证过 1000:0中是否存放着重要的系统 数据或代码。 • 如果1000:0中存放着重要的系统数据或代码, “mov ds:[0],al” 将其改写,将引发错误。 •
在循环开始前设(bx)=0,每次循环,将bx中 的内容加1即可。
loop和[bx]的联合应用
• 分析: (续)更详细的算法描述初 始化
(ds)=0ffffh (bx)=0 (dx)=0 (cx)=12 循环12 次: s:(al)=((ds)*16+(bx)) (ah)=0 (dx)=(dx)+(ax) (bx)=(bx)+1 loops
Loop指令
• 任务3:编程计算2∧12。 分析: 2∧12=2*2*2*2*2*2*2*2*2*2*2*2,若设 (ax)=2,可计算: (ax)= (ax)*2*2*2*2*2*2*2*2*2*2*2,最 后(ax)中为2∧12的值。N*2可用N+N 实现。
C语言 第五章-循环结构程序设计
执行过程如图所示。其中i为外循环的控制变 量,j为内循环的控制变量。
i =0 当 i <=10
j=0 当 j<=10
printf(“%d ”, i*j ) j++ i++
例4 编程打印“九九乘法表”。
分析:九九乘法表 1×1=1 1×2=2 1×3=3 … 2×1=2 2×2=4 2×3=6 … 3×1=3 3×2=6 3×3=9 … …… 9×1=9 9×2=18 9×3=27 …
i ++ ; } while ( i <= 100 ) ; printf ( " %d " , sum ) ; }
结果相同
同样是下列程序,但如果while后面的表达式结果一开始就是 假时,两种循环结果会不一样。
main ( ) /*程序1*/
{ int i , sum = 0 ; i = 101 ;
所以程序需要设计成二重循环。由于题目只 要求找到一组解,所以在循环过程中只要找到一组 满足条件的x, y, z就可以跳出循环。
跳出循环的方法可以采用break语句,但是, 因为是二重循环,所以要考虑使用break是否方便。
程序 百钱买百鸡问题。 void main ( ) { int x , y , z ;
打印第2行 ( i = 2 ) for (j=1;j<=9;j++) printf(“%5d”,i*j) ; printf ( “ \n ” ) ; /*换行打印*/
…… 打印第9行 ( i = 9 )
for (j=1;j<=9;j++) printf(“%5d”,i*j) ; printf ( “ \n ” ) ; /*换行打印*/
循环与分支程序设计
printit: mov mov int dec jnz mov int prognam end
dl,al ah,2 21h ch rotate ah,4ch 21h ends start
开始 1的个数计数器←0 循环次数计数器CX←16
例5.2 在ADDR单
元存放着数Y的 地址,试编制一 程序把Y中1的 个数存入 COUNT单元中
Y左移一次 CF=1 N
Y
1的个数计数器+1 CX ←CX-1=0 N
Y
COUNT ← 1的个数计数器 结束
循环次数固定,完全由循环计数器控制
例5.2
DATA SEGMENT Y DW 1234H ADDR DW Y COUNT DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DL,0 MOV BX,ADDR MOV AX,[BX] MOV CX,16 REPEAT: SHL AX,1 JNC NEXT INC DL LOOP REPEAT MOV COUNT,DL MOV AH,4CH INT 21H ENDS END START
例5址分别为ARRAY_ HEAD 和 ARRAY_ END,其中所有的数均为正数。
例5.4 mov ax,n mov array_head-2,-1 mov si,0 Comp:cmp movarray_end[si],ax bx,array_end[si] jle insert cmp bx,ax mov bx,array_end[si] jle insert mov array_end[si+2],bx sub si,2 jmp comp Insert: mov array_end[si+2],ax mov ah,4ch int 21h Program ends end start
[工学]第05章 循环结构程序设计 (2)
22
i=i+c
2019/2/17
例:#include<stdio.h> 例:#include<stdio.h> main( ) main( ) { int i=0; { int i=0; for(;i<10;i++) for(i=0;i<10;i++) putchar(‘a’+i); putchar(‘a’+i); } } 运行结果:abcdefghij
2019/2/17
21
(7)表达式2一般是关系表达式(如 for语句说明4 i<=100)或逻辑 表达式(如a<b&&x<y),但也可以是数值表达式 或字符表达式,只要其值为非零,就执行循环体。分 析下面两个例子: ①for ( i=0;(c=getchar( ))!=‘\n’;i+ =c); i=0 此 for语句的执行过程见图 ,它的作 用是不断输入字符,将它们的ASCII 取一个字 码相加,直到输入一个“换行”符为 符=>c 止。 F ② for( ;(c=getchar( ))!=‘ \ n’;) C≠换行符 printf(“%c”,c);
15
思考:该程序是什么功能?
2019/2/17
5.3 for语句
for循环语句是C语言中功能最强的循环语句,它有
多个变化形式,并且可以很方便的代替其它的循环语
16
句。 for语句的一般形式
for(表达式1;表达式2;表达式3)循环体语句
2019/2/17
17
for执行流程
①先计算初值表达式1,它主要 用于循环开始前设置变量初值; ②接着计算循环控制逻辑表达式 2,它控制循环条件,决定循环 次数; ③如果表达式2为真,则执行循 环体语句,否则结束for循环; ④求解表达式3,它主要是对循 环控制变量进行修改。 ⑤转步骤②执行。
C语言程序设计:第5章 循环结构
12
do...while语句(cont...)
课堂练习: 1.输出1---n之间的数,其中n从键盘输入。
int main(void) {
//1.定义变量i和n //2.输入n的值 //3.思考循环的开始条件:i从1开始 //4.思考循环的结束条件:i++,i > n //5.循环的条件:i<=n //6.循环要做的事情:输出i的值 return 0; }
} 相当于 while(1) {
}
26
小结
❖for(i=m;i<n;i++)//循环次数:n-m次 ❖for(i=m;i<=n;i++)//循环次数:n-m+1次
27
循环语句的练习
课堂练习: 1.输出n---1之间的数,其中n>1且n从键盘输入。 2.计算1*2*3*...*n的值(n的阶乘n!), 其中n从键盘输入。 3.计算10- 1/2 - 1/3 -....1/n的值 以上练习分别以while、do...while、for语句实现
int main(void) {
//1.定义变量i,n,sum //2.输入n的值 //3.思考循环的开始条件:i从1开始 //4.思考循环的结束条件:i++,i > n //5.循环的条件:i<=n //6.循环要做的事情:累加i的值 //7.输出计算结果 return 0; }
24
for语句(cont...)
{
sum = sum + i;
if(sum > 100)break;
第5章 循环与分支程序设计
CH5
5.1 循环程序设计
循环结构一般是根据某一条件判断为真
或假来确定是否重复执行循环体
循环指令和转移指令可以实现循环控制
2018/11/8
CH5
● 循环程序结构形式
初始化
初始化
控制条件
Y
N N
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
2018/11/8
2018/11/8
CH5
(3)循环控制条件 循环次数已知,可以使用: ●LOOP指令实现,但是必须注意: 循环移位指令中使用CL寄存器作为 移位次数寄存器,LOOP 指令的循 环次数隐含在CX寄存器中,避免这 两者之间的冲突。
● 条件跳转指令实现。
LOOP AGAIN DEC 计数器 JNZ AGAIN
xor ax,ax push ax X dw 5 1.简单的加减法运算,直接用加减法指令实现 mov ax,data Y dw 6 mov ds,ax 2. 数据存储方式 : 字节、字、双字、四字等 W dw 7 mov ax,Y Z dw ? 3.寻址方式:直接寻址 sub ax,X data ends add ax,W mov Z,ax code segment ret
2018/11/8
CH5
开始 初始化CX=0 Y
N
Y=0? N
Y=-? Y
CX←CX+1 Y逻辑左移1位
;移位
; ’0’~’9’ ASCII 30H~39H
; ’A’~’F’ ASCII 41H~46H
2018/11/8
CH5
方法2 (条件跳转指令)
rotate:
第五章 循环与分支程序设计
continue: add loop mov loop ……
2. 分支程序设计
? ? … case 1 case 2 case n case 1 case 2 case n
CASE 结构
(1) 逻辑尺控制 (2) 条件控制
IF-THEN-ELSE 结构
(3) 地址跳跃表(值与地址有对应关系的表) 地址跳跃表(值与地址有对应关系的表)
13
x(x1,x2,…… x2,……,x10) 例:有数组 x(x1,x2,……,x10) 和 y(y1,y2,……,y10), (z1,z2,…… z2,……,z10) 编程计算 z(z1,z2,……,z10) z1 = x1 z2 = x2 z3 = x3 z4 = x4 z5 = x5 z6 = x6 z7 = x7 z8 = x8 z9 = x9 + y1 + y2 - y3 - y4 - y5 + y6 - y7 - y8 + y9
3
1. 循环程序设计
初始化
初始化
N N
控制条件
Y
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
4
初始化:设置循环的初始状态 循环体:循环的工作部分及修改部分 控制条件:计数控制
特征值控制 地址边界控制
5
例:把 BX 中的二进制数以十六进制的形式显示在屏幕上
BX
1
2 3
4je lea L: shr jnb jmp add1: add jmp continue: …… routine1: …… routine2: …… al, 0
(寄存器间接寻址) 寄存器间接寻址)
continue bx, branch_table ;逻辑右移 al, 1 逻辑右移 ;jnb=jnc add1 ;段内间接转移 word ptr[bx] bx, type branch_table L
循环与分支程序设计
注意循环与分支的执行效率
循环与分支的执行效率
在编写循环和分支语句时,应注意程序的执行效率。过多的循环和分支语句会 导致程序运行缓慢,影响用户体验。
提高执行效率的方法
尽量减少不必要的循环和分支语句,使用合适的数据结构和算法,以及优化代 码逻辑。同时,可以使用性能分析工具来检测程序的性能瓶颈,并进行针对性 的优化。
05
CATALOGUE
循环与分支的编程实践
使用循环结构实现数组的遍历
循环结构
在编程中,循环结构是一种重复执行一段代码块的控制结构,可以根据条件来决定循环的次数。常见的循环结构有 for循环、while循环和do-while循环。
数组遍历
数组是一种数据结构,用于存储相同类型的元素。使用循环结构可以实现数组的遍历,即将数组中的每个元素执行相 同的操作。
注意循环与分支的逻辑正确性
循环与分支的逻辑正确性
在编写循环和分支语句时,应注意逻辑的正确性。错误的逻辑可能导致程序出现意外的结果或错误。
保证逻辑正确性的方法
在编写代码之前,应先进行详细的需求分析和设计,明确循环和分支的逻辑关系。同时,应进行充分 的测试,确保程序的逻辑正确性。在代码编写过程中,可以使用注释、文档和代码审查等方式来提高 代码的可读性和可维护性。
示例
在Python中,可以使用if语句来 实现条件判断,根据条件的结果 执行不同的代码块。
结合循环与分支实现算法设计
算法设计
算法是一系列解决问题的步骤,通过算 法可以将复杂的问题分解为简单的操作 。结合循环和分支结构可以实现复杂的 算法设计。
VS
示例
冒泡排序算法是一种常见的排序算法,通 过结合循环和分支结构,可以实现将一个 数组按照从小到大的顺序排列。
循环与分支程序设计
第5章循环与分支程序设计(一)例:把BX中的二进制数以十六进制的形式显示在屏幕上程序如下:data segmentmessage db"Hello World!",'$'data endscode segmentassume cs:code,ds:databegin:mov ax,datamov ds,axMOV AX,1234Hmov ch,4rotate:mov cl,4rol bx,clmov al,bland al,0fhadd al,30h;’0’~’9’ASCII 30H~39Hcmp al,3ahjl printitadd al,7h;’A’~’F’ASCII 41H~46Hprintit:mov dl,almov ah,2int21hdec chjnz rotatemov ah,4chint21hcode endsend begin实验观察如下:(二)例:从键盘接收十进制数并存入BX 程序如下:code segmentassume cs:code,ds:data begin:mov ax,datamov ds,axmov dx,offset messagemov bx,0 newchar:mov ah,1int21hsub al,30hjl exit;<0退出cmp al,9jg exit;>9退出cbwxchg ax,bxmov cx,10mul cxxchg ax,bxadd bx,axjmp newchar exit:mov ah,4chint21hcode endsend begin实验观察如下:(三)例:从键盘接收十六进制数并存入BX 程序如下:message db"Hello World!",'$' data endscode segmentassume cs:code,ds:data begin:mov ax,datamov ds,axmov dx,offset messagemov bx,0mov bx,0newchar:mov ah,1;键盘输入int21hsub al,30hjl exit;<0退出cmp al,10jl add_tosub al,27h;‘a’~‘f’cmp al,0ahjl exit;<‘a’退出cmp al,10hjge exit;>’f’退出add_to:mov cl,4shl bx,clmov ah,0add bx,axjmp newcharexit:mov ah,4chint21hcode endsend begin实验观察如下:(四)例:将正数n插入一个已整序的正数字数组程序如下:x dw?array_head dw3,5,15,23,37,49,52,65,78,99array_end dw105n dw32data endscode segmentassume cs:code,ds:databegin:mov ax,datamov ds,axmov ax,nmov array_head-2,0ffffhmov si,0compare:cmp array_end[si],axjle insert;<=则转移mov bx,array_end[si]mov array_end[si+2],bxsub si,2jmp short compareinsert:mov array_end[si+2],axmov ah,4chint21hcode endsend begin实验观察如下:(五)例:将首地址为A的字数组从小到大排序程序如下:a dw18,16,84,32,5data endscode segmentassume cs:code,ds:databegin:mov ax,datamov ds,axmov cx,5;元素个数dec cx;比较遍数loop1:mov di,cx;比较次数mov bx,0loop2:mov ax,A[bx];相邻两数cmp ax,A[bx+2];比较jle continuexchg ax,A[bx+2];交换位置mov A[bx],axcontinue:add bx,2loop loop2mov cx,diloop loop1`mov ah,4chint21hcode endsend begin实验观察如下:(六)例:有数组x(x1,x(x1,……,x10)和y(y1,y(y1,……,y10),编程计算z(z1,z(z1,……,z10)程序如下:x dw 1,2,3,4,5,6,7,8,9,10y dw 1,2,3,4,5,6,7,8,9,10z dw 10dup(?)logic_rule dw00dch ;0000,0000,1101,1100data ends code segment assume cs:code,ds:data begin:mov ax,data mov ds,ax mov bx,0mov cx,10mov dx,logic_rule next:mov ax,x[bx]shr dx,1jc subtract add ax,y[bx]jmp short result ;向前引用subtract:sub ax,y[bx]result:mov z[bx],ax add bx,2loop next mov ah,4ch int 21hcode endsend begin实验观察如下:。
第5章 循环与分支程序设计PPT课件
END START
例5.3 在附加段中,有一个首地址为LIST和未经排序的字数组.在数组的第一 个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器 中存放着一个数,要求编制程序,在数组中查找该数,如果找到此数,则把它从 数组中删除.
…
DS
X
ARRAY_HEAD
45
46
54
57
61
66
68
71
ARRAY_END
90
N
60
DATAREA SEGMENT
X
DW ?
ARRAY_HEAD DW 45,46,54,57,61,66,68,71
ARRAY_END DW 90
N
DW 60
DARAREA ENDS
PROGNAM SEGMENT MAIN PROC FAR
第五章 循环与分支程序设计
5.1 循环程序设计 5.2 分支程序设计 5.3 如何在实模式下发挥80386及其后继机型的优势
5.1 循环程序设计
一、循环程序的结构形式
循环初始状态
Y 循环控制条件
N 循环体
(1)设置循环的初始状态 (2)循环体 (3)循环控制部分
循环初始状态 循环体 N
循环控制条件 Y
Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10
…
DATA SEGMENT
X
23
45
90
…
X DW 23,45,90,12,48,72,95,83,75,29 Y DW 36,53,27,89,51,28,46,94,27,65 Z DW 10 DUP(?) LOGIC DW 00DCH
循环与分支程序设计.
5.2 分支程序设计
一、分支程序的结构形式 分支程序的结构形式: 二分支 多分支
Y 判定条件 N
判定条件 …
IF_THEN_LESE结构
CASE结构
二、分支程序设计方法 1、折半查找算法 例3:在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址 存放在 DI寄存器中,数组中的第一个单元存放着数组长度。在AX中 有一个无符号数,要求在数组中查找(AX),如找到,则使CF=0,并 在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。 (1)确定算法: 由于已经排序,因此可以采用折半查找算法。折半查 找法先取有序数组的中间元素与查找值相比较,如相 等则查找成功;如查找值大于中间元素,则再取高半 部的中间元素与查找值相比较;如查找值小于中间元 素,则再取低半部的中间元素与查找值相比较;如此 重复直到查找成功或未找到该数(查找不成功)为止。 在一个长度为 n的有序数组r中,查找元素k的折半查 找算法可描述如下: ①初始化被查找数组的首尾下标,low←1,high←n; ②若low>high,则查找失败,置CF=1,退出程序。 否则,计算中点:mid←(low+high)/2; ③ k与中点元素r[mid]比较。若k=r[mid],则 查找成功,程序结束;若k<r[mid],则转步骤④; 若k>r[mid],则转步骤⑤;
该注意在每次通过外层循环再次进入内层循环时,内层的初始条件必须重
新设置。如:最典型的就是起泡排序算法。
排序算法:从第一个数开始依次对相邻两个数进行比较。如次序对,则不
其它略。
做任何操作,如次序不对,则使两个数交换位置。如果有 N个 数要进行排序,则第一遍做了 (N-1)次比较后,最小的数已经 放到了最后,所以第二遍比较只需要考 (N-1)个数,即只需要 比较(N-2)次。第三遍则只需要做(N-3)次比较 … …总共最多 (N-1)遍比较就可以完成排序。
第五章 循环与分支程序设计
第五章:循环与分支程序设计 第五章:
在实际应用的程序中,通常碰到根据某一条件是否成立来进行逻辑判断, 以便确定程序的下一步执行,这就形成了分支结构程序.在汇编语言程序设 计中,分支结构程序设计是一种很重要的程序设计方法.循环结构是控制重 复执行某一程序段的基本程序结构.在高级语言中,普遍设置有专用的循环 语句作为实现循环程序的手段.在汇编语言程序设计中,循环程序的地位也 是极其重要的.从本质上看,循环程序结构是分支程序结构的一种特殊形式, 编程时,都是使用条件转移指令来控制循环的.
本章重点: 本章重点
1)掌握使用比较指令和其他有关指令产生的相应标志位,继而通过条 件转移指令来形成分支程序的设计方法. 2)掌握多路分支程序的结构形式以及多路分支程序的设计方法. 3)掌握循环程序的结构形式和程序设计方法. 课件具体内容请看:第五章
分支循环程序设计
分支循环程序设计分支循环程序设计是计算机编程中非常重要的概念,它涉及到程序在执行过程中根据条件选择不同的执行路径,以及重复执行某些操作直到满足特定条件。
下面将详细介绍分支和循环程序设计的基本概念、类型以及如何实现。
分支程序设计分支程序设计主要依赖于条件语句,根据条件的真假来决定程序的执行流程。
常见的分支结构有两种:单分支和多分支。
1. 单分支结构:这是最简单的分支结构,通常使用`if`语句实现。
当条件为真时,执行`if`块内的代码,否则跳过。
```cif (条件) {// 条件为真时执行的代码}```2. 多分支结构:当需要根据多个条件执行不同的代码块时,可以使用`if-else`或`switch-case`语句。
- `if-else`语句允许根据多个条件进行选择:```cif (条件1) {// 条件1为真时执行的代码} else if (条件2) {// 条件2为真时执行的代码} else {// 以上条件都不为真时执行的代码}```- `switch-case`语句适用于条件值有限的情况,如枚举类型或整数:```cswitch (变量) {case 值1:// 值1时执行的代码break;case 值2:// 值2时执行的代码break;// ...default:// 没有匹配的值时执行的代码}```循环程序设计循环程序设计允许程序重复执行一段代码,直到满足某个条件。
主要有两种类型的循环:计数循环和条件循环。
1. 计数循环:通常使用`for`或`while`语句实现,适用于已知循环次数的情况。
- `for`循环:初始化变量,设定循环条件,更新变量。
```cfor (初始化; 条件; 更新) {// 循环体}```- `while`循环:先设定条件,然后执行循环体,条件为真时继续循环。
```cint i = 0;while (i < 10) {// 循环体i++;}```2. 条件循环:使用`do-while`语句实现,至少执行一次循环体,然后检查条件。
《循环与分支程序》课件
循环条件:满足一定条件时,循环体才 会被执行
循环控制:通过循环变量、循环条件等 控制循环的执行次数和结束条件
循环的分类(while、do-while、for)
while循环:先判 断条件,再执行循 环体
do-while循环: 先执行循环体,再 判断条件
for循环:先初始化 变量,再判断条件 ,最后执行循环体
感谢您的观看
汇报人:
分支结构:用于处 理条件判断,如根 据条件选择不同的 处理方式
循环与分支的结合 :可以处理更复杂 的数据处理任务, 如排序、查找等
实际应用:在数据 分析、机器学习等 领域有广泛应用
循环与分支在算法优化中的作用
循环与分支是算法优化的重要手段 循环可以减少重复代码,提高代码效率 分支可以提高算法的灵活性,适应不同的情况 循环与分支的合理使用可以提高算法的执行效率和稳定性
循环与分支程序PPT课 件
汇报人:
目录
添加目录标题 循环结构 分支结构
01 循环与分支的综合应用 04
02 循环与分支的注意事项 05
03
添加章节标题
循环结构
循环的定义和作用
循环结构:一种重复执行同一段代码的 程序结构
循环的作用:减少代码重复,提高代码 效率
循环类型:for循环、while循环、dowhile循环等
循环结构的特点: 重复执行一段代码 ,直到满足某个条 件为止
循环的执行流程
初始化:设置循环变量和循环条件 循环体:执行循环内的语句 更新循环变量:改变循环变量的值 判断循环条件:检查循环条件是否满足,决定是否继续执行循环 结束循环:当循环条件不满足时,跳出循环,结束循环执行
循环的嵌套
概念:在一个 循环体中再嵌 套一个或多个
第5章循环与分支程序设计
编程方法-举例2
Data segment mess db 'Your Hex number is:$' bb db 00110100b, 00010010b Data ends Prognam segment assume cs: prognam, ds:data start: mov ax, data mov ds,ax lea dx, mess mov ah,9 int 21h
例5.7
• 有一个首地址为A的N字数组,请编制程 序使该数组中的数按照从大到小的次序 整序。
采用起泡排序算法 方法: 从第一个数开始依次对相邻两个数进行比 较。如次序对,则不做任何操作;如次序不 对,则将这两个数交换位置。
数据段
datarea segment n equ 12 ;此处修改 a dw n dup (?) datarea ends • 程序:例5.7
mov di, offset len ;此处修改} mov start_addr,di ;首地址存放在内存中 mov cx, es:[di] ;根据首地址取元素个数N mov save_cnt, cx ;个数N保存在内存 init: mov bx, 1 ;初始化设置 ;设BX = 1(即假设未作过交换数据) dec save_cnt ;做 count-l 次比较 jz sorted ;如save_cnt=O,退出 mov cx,save_cnt ;否则 比较次数放cx mov di,start_addr ;将开始地址放 DI
续 mov cx, es:[di] ;取长度
add di, 2 Repne scasw je delete Pop di jmp short exit delete: jcxz dec_cnt Next_el: ;移动 mov bx, es: [di] mov es:[di-2], bx add di, 2 loop next_el
第5章循环与分支程序设计
第5章循环与分支程序设计【课前思考】1. 编制一个汇编语言程序分哪几步?2. 循环程序有哪两种基本结构?由几部分组成?3. 设计算法时对可能出现的边界情况如何考虑?4. 如何设置逻辑尺?5. 什么是起泡排序算法?6. 如何理解数组排序算法中采用的折半查找法?7. 如何使用跳跃表法实现CASE结构?【学习目标】了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。
掌握起泡排序算法这种多重循环程序设计中的常用方法。
交换标志位的设置在此算法中更能提高效率。
学会在数组排序算法中采用折半查找法来提高查找效率。
学会使用跳跃表法实现CASE结构。
【学习指南】掌握编程的四个步骤至关重要。
通过多看举例,学会正确分析理解题意、选择合适的数据结构及算法、坚持先画框图、选取有效指令编程、最后应当掌握运用调试手段进行调试。
学习多重循环程序设计前应熟练掌握单层循环程序设计的各种实现方法及实现细节,如对可能出现的边界情况的处理等。
学习起泡排序算法、折半查找法、跳跃表法之前,应首先理解传统实现方法。
【难重点】循环控制条件的选择。
考虑循环算法时注意可能出现的边界情况。
静态地预置逻辑尺。
动态地修改标志位。
多重循环程序设计时应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。
另外,应该注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。
起泡排序算法是多重循环程序设计中的一种常用方法。
数组排序算法中可以采用折半查找法来提高查找效率。
CASE结构可以使用跳跃表法实现。
【知识点】编制一个汇编语言程序的一般步骤5.1 循环程序设计5.1.1 循环程序的基本结构5.1.2 循环程序设计方法举例循环控制条件边界情况的处理逻辑尺5.1.3 多重循环程序设计举例起泡排序算法交换标志位5.2 分支程序设计5.2.1 分支程序的基本结构5.2.2 分支程序设计方法举例——折半查找法5.2.3 跳跃表法一般说来,编制一个汇编语言程序的步骤如下:1)分析题意,确定算法。
分支与循环程序设计
分支与循环程序设计一、分支程序设计分支程序设计是指根据条件的不同,执行不同的代码块。
在程序中,我们经常需要根据一定条件来选择执行不同的操作,这就需要使用分支结构来实现。
常见的分支结构有if语句和switch语句。
1. if语句:if语句是最基本也是最常用的分支结构之一、它的语法形式如下:```if (条件表达式)//如果条件为真,执行这里的代码块} else//如果条件为假,执行这里的代码块```if语句的条件表达式可以是逻辑表达式、比较表达式或其他具有确定值的表达式。
当条件表达式为真时,执行if后面的代码块;当条件表达式为假时,执行else后面的代码块。
2. switch语句:switch语句是一种多分支选择结构,它根据一些变量的值来决定执行哪个代码块。
它的语法形式如下:```switch (变量)case 值1://如果变量的值等于值1,执行这里的代码块break;case 值2://如果变量的值等于值2,执行这里的代码块break;default:// 如果变量的值不等于任何一个case,执行这里的代码块```switch语句根据变量的值与每个case的值进行比较,当找到匹配的case时,执行对应的代码块。
如果没有找到匹配的case,执行default后面的代码块。
循环程序设计是指重复执行一些代码块,直到满足一些条件为止。
在实际应用中,我们常常需要重复执行一些操作,这就需要使用循环结构来实现。
常见的循环结构有for循环、while循环和do-while循环。
1. for循环:for循环是最常用的循环结构之一,它的语法形式如下:```for (初始化表达式; 循环条件; 更新表达式)//循环体,执行这里的代码块```for循环由3个表达式组成:初始化表达式、循环条件和更新表达式。
在每次循环开始时,先执行初始化表达式;然后再判断循环条件,如果条件为真,执行循环体;执行完循环体后,再执行更新表达式。
循环与分支程序设计
标志位
CF=0且ZF=0 CF=0或ZF=1 CF=1且ZF=0 CF=1或ZF=1 SF=OF且ZF=0 SF=OF或ZF=1
JP/JPE
JNP/JPO JO JNO
PF =1
PF =0 OF =1 OF =0
JL/JNGE
JLE/JNG JCXZ
SF≠OF且ZF=0
SF≠OF或ZF=1
CX=0
实际虽然指令只有19条,但却有31个助记符 采用多个助记符,只是为了方便记忆和使用
⑴ 段内转移、直接寻址 ⑵ 段内转移、间接寻址 ⑶ 段间转移、直接寻址 ⑷ 段间转移、间接寻址 目的地址与JMP属同一逻辑段, 只修改IP值 从一个代码段转移到另一个代码段,CS 和IP都会被修改
8
1. 无条件转移指令 —目标地址的寻址方式
直接寻址方式
用标号表达
间接寻址方式
转移地址象立即数一样,直接在指令的机器代码中,就 是直接寻址方式 用寄存器或存储
转移范围可以用一个字节表达,在段内 -128~+127范围的转移
代 码 段
10
1.无条件转移指令 —目标地址的范围:段间
段间转移——远转移(far)
从当前代码段跳转到另一个代码段,可以 在1MB范围
需要更改CS段基值和IP偏移地址
代 码 段
目标地址必须用一个32位数表达,叫做 32位远指针,它就是逻辑地址
19
判断单个标志位状态
这组指令单独判断5个状态标志之一 ⑴JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零 (或相等) ⑵JS和JNS:利用符号标志SF,判断结果是正是负 ⑶JO和JNO:利用溢出标志OF,判断结果是否产生溢出 ⑷JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中 “1”的个数是偶是奇
分支与循环程序设计PPT
案例分析:计算1到100的和
• sum += i;
案例分析:计算1到100的和
• i;
案例分析:计算1到100的和
01
}
02
```
03
使用do-while循环计算1到100的和
案例分析:计算1到100的和
```
int i = 1;
空间优化
在满足功能需求的前提下,尽量减少程序中变量的存储空间,以降 低内存消耗。
数据结构与算法
数组操作
使用分支和循环实现对数组的遍历、查找、插入 和删除等操作。
链表操作
通过分支和循环实现对链表的遍历、插入和删除 等操作,解决常见的数据结构问题。
二叉树操作
利用分支和循环实现二叉树的遍历、查找、插入 和删除等操作,解决树形结构相关问题。
案例分析:排序算法中的分支与循环应用
01
02
03
选择排序
使用分支结构实现选择排 序算法,通过循环结构实 现数组元素的比较和交换 。
冒泡排序
利用循环结构实现冒泡排 序算法,通过分支结构控 制排序过程中的比较和交 换操作。
快速排序
结合分支和循环结构实现 快速排序算法,利用递归 实现分治策略,提高排序 效率。
PART 04
分支与循环程序设计的注 意事项
避免死循环
死循环是指程序中没有退出条件的循环,会导致程序无法正 常结束。为了避免死循环,程序员需要确保循环体中有一个 明确的退出条件,并且该条件在循环执行过程中一定会被满 足。
在编写循环时,要特别注意循环变量的初始化和更新,确保 循环能够正常结束。同时,也要注意循环条件的正确性,避 免因为逻辑错误导致死循环。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
也可用LOOP指令
通过堆栈保存信息解决CX冲突问题
19/62
例:编制一个数据块移动程序 (已知 循环次数)
1)任务1:用程序设置数据
给内存数据段(DATA)中偏移 地址为n1开始的连续32个字节单 元,置入数据00H,01H, 02H,¨¨¨,1FH
……
……
00 n1
1F
n2
程序源代码请自己编写
23/62
OFFSET n1 SI
: 00 AL
: 32 CX
AL [SI]
AL+1 AL
SI+1 SI
CX-1 CX
N
CX=0?
Y
置入数据程序流程图
data1 n1 data1
segment db 32 dup (?) ends
00 n1
……
data2 n2 data2
第五章 循环与分支程序
5.1 循环程序设计 5.2 分支程序设计 5.3 如何在实模式下发挥 80386
及其后继机型的优势
1/62
本章目标
•掌握汇编语言程序设计的基本步骤 •熟练掌握顺序、分支和循环程序设计方法 •掌握汇编语言程序常用的几种退出方法 •掌握DOS系统功能调用
2/62
汇编语言程序设计的基本步骤
(3)DO_WHILE 结构
Y本身为0的可能性
开始 初始化C=0
Y Y=0?
N N
Y= - ? Y
C → COUNT 结束
C=C+1
Y逻辑左移1位
25/62
datarea
segment
开始
addr dw number
number dw y
初始化C=0
count datarea
dw ? segment
对有规律(连续)的内存单元操作,地址 有规律变化采用变址寻址方式
多次同样功能的处理,数据处理有规律, 采用循环程序结构
1、初始设置:
循环次数:连续32个字节单元,循环次数=32 数据初值:数据有规律变化,程序中可以自动
生成数据,数据初值=00H 变址指针初始化:内存数据段中偏移地址为n1
end start 26/62
例子5.3 删除在未经排序的数组中找到 的数(待找的数存放在AX中)P179
分析题意: (1)如果没有找到,则不对数组作任何处理 (2)如果找到这一元素,则应把数组中位于高
14/62
例5.1、试编制一个程序把BX寄存器内的二进 制数用十六进制数的形式在屏幕上显示出来
分析问题:把BX寄存器中16位的二进制数 用4位十六进制数的形式在屏幕上显示
1、初始设置
循环次数:每次显示1个十六进制数(送显示 器相应的ASCII),循环次数=4,CH=4
2、循环体
根据任务,选择算法
5.1 循环程序设计
5.1.1 循环程序的结构形式 5.1.2 循环程序的设计方法 5.1.3 多重循环程序设计
11/62
5.1.1 循环程序的基本结构
•两种基本结构
•三个基本组成部分: 循环初始化
1、初始设置
2、循环体 3、循环控制转移
条件 满足
不满足
循环体
DO-WHILE结构
循环初始化
循环体
endp
prognam ends
end start
熟记程序框架结构 和系统调用约定
17/62
rotate: printit:
mov mov rol mov and add cmp jl add mov mov int dec jnz
ch, 4 cl, 4 bx, cl al, bl al, 0fh al, 30h al, 3ah printit al, 7h dl, al ah, 2 21h ch rotate
mov si, offset n1 mov al, 0 mov cx, 32 mov [si], al inc si inc al dec cx jnz rotate
mov si, offset n1 mov di, offset n2 cld mov cx, 32 rep movsb
ret
main
程序结构:这个问题是数据块移动问题,可选择循环结构 或串传送指令来处理
选择串传送指令MOVSB,或REP MOVSB
数据定义:要定义源串和目的串
源串是任务(1)中所设置的数据 目的串要保留相应长度的空间
处理方法:MOVSB指令是字节传送指令, 它要求事先设置约定寄存器:
① 将源串的首偏移地址送SI,段地址为DS ② 目的串的首偏移地址送DI,段地址为ES ③ 串长度送CX寄存器中 ④ 并设置方向标志DF
2、循环体
根据任务,选择算法:一次设置一个字节 修改指针:变址指针修改 修改数据,生成新的数据 设置循环控制转移其他条件:无
3、循环控制转移
根据计数控制循环次数
21/62
选择寄存器 进一步细化程序流程 OFFSETn1 SI
循环的初始化部分完成
(1)将n1的偏移地址置入变址寄存器SI,这里的变址寄 存器作为地址指针用
y
5/62
程序结构
顺序结构
循环结构
分支结构
子程序结构
…
复合结构:多种程序结构的组合
6/62
顺序程序设计方法
程序的执行顺序是从程序的第一条可执 行指令开始执行,按照程序编写安排的 顺序逐条执行指令直到最后一条指令为 止
顺序程序结构所能解决的问题一般属于 简单的顺序性处理问题 如求:Y=(2*X+4*Y)*Z
AL,0 X,AL BIG SAV AL,0FFH ;小于0 SHORT SAV AL,1 ;大于0 Y,AL ;保存结果
9/62
循环程序设计方法
有一段指令被重复多次执行
被循环多次执行的指令段称为循环体
适应于处理算法相同,每次处理时需要有规 律地改变数据或数据地址的问题
例如,求内存数据段中存放的N个字节
Y Y=0?
prognam segment
N
C → COUNT
mian proc far
N Y= - ?
assume cs:prognam, ds:datarea
结束 Y
start: push ds
C=C+1
sub ax, ax push ax
Y逻辑左移1位
mov ax, datarea
mov ds, ax
……
00 n1
1F
2)任务2:移动数据
将内存数据段(DATA)中偏移 地址为n1的数据传送到偏移地址 为n2开始的连续的内存单元中去
……
n2
20/62
1)任务1:用程序设置数据 给内存数据段(DATA)中偏移地址为n1开始的连续32个字 节单元,置入数据00H,01H,02H,¨¨¨,1FH
程序设计中最基本的结构
7/62
分支程序设计方法
分支程序是根据判断条件转向不同的处 理,则要采用分支程序结构。当执行到 条件判断指令时,程序必定存在两个以 上分支
两分支:条件转移,标志寄存器,直接寻址
满足条件(条件成立) 不满足条件(条件不成立)
多分支:无条件转移,变址寄存器,存储器
间接寻址
程序每次只能执行其中一个分支
1 C1
条件
2
n
C2
...
Cn
多分支结构 8/62
例1.实现符号函数Y的功能。 其中:-128≤X≤+127
1当X>0时 Y= 0当X=0时
-1当X<0时
X DB Y DB
? ;被测数据 ? ;函数值单元
MOV CMP JG JZ MOV JMP BIG: MOV SAV: MOV
每4位二进制数转换成1位十六进制数的ASCII 调用DOS系统功能在屏幕上显示
3、循环控制转移
根据计数控制循环次数
流程图 15/62
BX
1 2 3 4
16/62
没有数据分配问题,直接编写程序代码段
流程图
prognam segment main proc far
Assume cs:prognam start:
满足 条件 不满足
DO-UNTIL结构
12/62
5.1.2 循环程序的设计方法
分析任务,实现三要素:
1、初始设置
循环次数,数据和变址指针初始化等
2、循环体
根据任务,选择算法 修改指针等 设置循环控制转移其他条件
3、循环控制转移
正确选择条件转移指令,2要素
循环次数 其他条件,如FLAGS
1.分析问题 根据实际任务(问题)确定任务的数据结构、处理的数 学模型或逻辑模型;
2.确定算法 确定所要解决问题的适当算法,既处理步骤,如何解决 问题,完成任务;
3.绘制流程图 设计整个程序处理的逻辑结构,从粗流程到细流程; 4.存储空间分配 分配数据段、堆栈段和代码段的存储空间,分配工
作单元,借助数据段、堆栈段和代码段定义的伪操作实现; 5.编写汇编语言源程序 正确运用80X86CPU提供的指令、伪操作、宏
数据(或字数据)的某种运算(加、减、 循
乘、除,移动等等)
环
体
循环体是加、减、乘、除,移动等运算指令
设置一个地址指针指向这N个数据的首地址, 再设置一个计数器
每次运算之后,修改地址指针使其指向下一 个数据,依次执行N次
初始化
处理指令序列
控制指令序列
任务完成否 N Y
结束处理
循环程序结构