第五章 分支与循环程序设计
- 格式:ppt
- 大小:129.50 KB
- 文档页数:30
第5章循环与分支程序设计编制汇编语言程序的步骤:(1) 分析题意,确定算法(2) 根据算法画出程序框图(3) 根据框图编写程序(4) 上机调试程序5.1循环结构程序设计(1)初始化部分:设置循环的初始状态这是循环的准备部分,为程序操作、地址指针、循环计数、结束条件等设置初始值。
(2)循环体:循环的工作部分及修改部分,包括以下3个部分:循环工作部分------这是循环程序的主体,完成程序的基本操作,循环多少次,这部分语句就执行多少次。
循环修改部分-----修改循环工作部分的变量地址等,这保证每次重复时,参加执行的数据能发生有规律的变化。
循环控制部分-----保证循环条件满足时进入循环;循环结束条件不满足时,退出循环,执行循环体外的后续语句。
(3)循环结束部分完成循环结束后的处理,如数据分析、结果的存放等。
循环程序典型结构【例5.1】P163 在ADDR单元中存放着数Y的地址,试编制一程序把Y中(指数Y所有二进制位中包含)1的个数存入COUNT单元中。
(PH163.asm)要测出Y中1的个数就应逐位测试。
一个比较简单的办法是可以根据最高有效位是否为1来计数,然后用移位的方法把各位数逐次移到最高位去。
TITLE 数1的程序DA TA SEGMENTADDR DW NUMBERNUMBER DW 12F0H ; Y的值COUNT D W ?DA TA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DA TASTART:PUSH DSSUB AX,AXPUSH AXMOV AX,DA TAMOV DS,AXMOV CX,0MOV BX,ADDRMOV AX,[BX]REPEAT: CMP AX,0JZ EXITJNS SHIFTINC CXSHIFT:SHL AX,1JMP REPEATEXIT:MOV COUNT,CXRETMAIN ENDPCODE ENDSEND START【例5.2】P161 :把BX 中的二进制数以十六进制的形式显示在屏幕上……mov ch, 4rotate: mov cl, 4rol bx, clmov al, bland al, 0fhadd al, 30h ; ’0’~’9’ AS CII 30H~39Hcmp al, 3ahjl printitadd al, 7h ; ’A’~’F’ ASCII 41H~46Hprintit: mov dl, almov ah, 2int 21hdec chjnz rotate……例:从键盘接收十进制数并存入BX……mov bx, 0newchar: mov ah, 1 ;键盘输入int 21hsub al, 30hjl exit ; <0退出cmp al, 9jg exit ; >9退出cbw;?xchg ax, bxmov cx, 10mul cxxchg ax, bxadd bx, axjmp newcharexit: ……例:从键盘接收十六进制数并存入BX……mov bx, 0newchar: mov ah, 1 ;键盘输入int 21hsub 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: ……1 a f31 61 66((0×16)+1) × 16+0a) × 16+0f【*例5.3A 】分别统计COUNT个数据中正、负数的个数。
第5章 分支与循环程序设计5.1. 概述设计步骤:描述问题→确定算法→绘制流程图→分配存储空间和工作单元→编写程序→上机调试5.2. 分支程序设计5.2.1 分支程序结构二路分支结构 多路分支结构5.2.2 二路分支程序设计方法例5.2.1⎪⎩⎪⎨⎧<-=>=)0(1)0(0)0(1x x x Y -128≤x ≤127DATASEGMENTXX1 DB 10; X=给定一个值YY1 DB ? ; Y DATAENDS CODESEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DSMOV DS, AXMOV AL,XX1CMP AL, 0JZ AA1; =0JNS AA2MOV AL,0FFH; =-1JMP AA1AA2: MOV AL,1; =1AA1: MOV YY1,AL;MOV AH,4CHINT 21HCODE ENDSEND START5.2.3多路分支程序设计方法逻辑分解法;地址表法;段内转移表法;1.逻辑分解法CODE SEGMENTASSUME CS:CODESTART: MOV AH,1INT 21H ;键入值CMP AL,31HJZ WORK1CMP AL,32HJZ WORK2CMP AL,33HJZ WORK3CMP AL,34HJZ WORK4CMP AL,35HJZ WORK5JMP WORK0WORK1: …(jmp work0)WORK2: …(jmp work0)WORK3: …(jmp work0)WORK4: …(jmp work0)WORK5: …(jmp work0)WORK0: MOV AH,4CHINT 21HCODE ENDSEND START2.地址表法把模块的地址保存在一个表中,通过查表跳到相应模块。
表地址= 表首地址+ (键号-1)*2DATA SEGMENTTABLE DW WORK1,WORK2,WORK3,WORK4,WORK5 DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATASTART: MOV AX,DATAMOV DS,AXLEA BX,TABLE ;表首地址MOV AH,1INT 21HAND AL,0FHDEC AL ;键号-1ADD AL,AL ;(键号-1)*2SUB AH,AHADD BX,AX ;表地址= 表首地址+ (键号-1)*2JMP WORD PTR[BX]WORK1: …(jmp work0)WORK2: …(jmp work0)WORK3: …(jmp work0)WORK4: …(jmp work0)WORK5: …(jmp work0)WORK0:MOV AH,4CHINT 21HCODE ENDSEND START3.段内转移表法段内短转移:(jmp disp8为2字节指令)转移表地址=转移表首地址+(键号-1)*2段内近转移:(jmp disp16为3字节指令)转移表地址=转移表首地址+(键号-1)*3段间远转移:(jmp disp32为4字节指令)转移表地址=转移表首地址+(键号-1)*4 CODE SEGMENTASSUME CS:CODESTART: LEA BX,WORKMOV AH,1INT 21HAND 0FHDEC ALMOV AH,ALADD AL,ALADD AL,AH ;x3SUB AH,AHADD BX,AXJMP BX;转移表WORK: JMP NEAR PTR WORK1JMP NEAR PTR WORK2JMP NEAR PTR WORK3JMP NEAR PTR WORK4JMP NEAR PTR WORK5;工作模块WORK1: …(jmp work0)WORK2: …(jmp work0)WORK3: …(jmp work0)WORK4: …(jmp work0)WORK5: …(jmp work0)WORK0:MOV AH,4CHINT 21HCODE ENDSEND START5.3.循环程序设计5.3.1循环程序的结构形式5.3.2循环程序的设计方法方法:计数控制循环;条件控制循环;变量控制循环1.计数控制循环(循环次数已知)例:5.3.1, 把1,2,3 …255加起来。
第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个表达式组成:初始化表达式、循环条件和更新表达式。
在每次循环开始时,先执行初始化表达式;然后再判断循环条件,如果条件为真,执行循环体;执行完循环体后,再执行更新表达式。