h3-23 分支与循环2_第1页
h3-23 分支与循环2_第2页
h3-23 分支与循环2_第3页
h3-23 分支与循环2_第4页
h3-23 分支与循环2_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、132 分支程序设计分支程序设计 321 简单分支程序简单分支程序 (判断条件在两个以内) 对两个操作数进行算术或逻辑运算,然后根据运算后结果对标志位的影响来产生分支。2 (1)用比较指令实现用比较指令实现。 CMP DEST,SRC ;比较两个操作数 JE EQUL EQUL: (2) 用测试指令实现用测试指令实现。 TEST DEST,SRC ;逻辑与测试 JNZ ONE ONE: 3 (3) 用逻辑指令实现用逻辑指令实现。 SHR DEST,CL ;对DEST进行逻辑右移 JC NEXT ;CF=1,转移到NEXT NEXT: 4 例3.26 编程实现将键盘输入的小写字母转换成大写后输出

2、,程序流程如图3.2所示。 MODEL SMALL (az的ASC 码61H 7AH,A Z的ASC 码41 H 5AH) DATA BLOCK DB ERROR!,0DH,0AH,$ CODE STARTUP MOV AH,1 ;读键入字符 INT 21H CMP AL,a ;判字符小于a JB NEXT CMP AL,z ;判字符大于z? JA NEXT AND AL,11011111B ;将小写字母转换 MOV DL,AL ; 成大写字母 MOV AH,02 ;显示输出 INT 21H JMP DONE NEXT:LEA DX,BLOCK ;非小写字母处理 MOV AH,9 INT 21

3、H 图3.2 例3.26 程序流程 DONE :EXIT END5DATE1 SEGMENT A DW ? B DW ? C DW ?DATE1 ENDSCODE1 SEGM MOV AX, A ADD AX, B JLE _ELSE ;小于等于0 TEST C, 1;C%2=0?即看C的最低位是否为0 JNZ _ELSE MOV A, 62 JMP NEXT_ELSE:MOV A, 21NEXT:CODE1 ENDS 例 把下列C语言的语句改写成等价的汇编语言程序段(不考虑运算过程中的溢出),其中:变量a、b和c 都是有符号的整型(int)变量。if (a+b0 &c%2= =0)

4、a=62;else a=21; 6322 复杂分支程序复杂分支程序 在满足一定条件的前提下,可以采用跳转表法,方便且高效的实现多向分支。图3.4 多路条件判断程序流程 7 跳转表算法:在存储器设置一地址表,将多个分支程序的地址顺序存放在表中,以供程序在条件选择某一分支程序时使用。 存储器中地址表设置如下: TAB DW SUB1 ;或者DD SUB2 SUB3 SUBn 8 在变量名为TAB作为首地址的表中,SUBi 为第i路分支程序的标号。 如果TAB定义为字类型时,存放在表中的是每一路分支程序标号的16位偏移地址; 如果TAB定义为双字类型,可以表示为32位模式下的偏移地址或16位模式下的

5、偏移地址和段基址。 根据分支条件确定对应分支程序的入口地址在地址表中的位置(序号),转去执行分支程序。 9例3.28 接收单键命令AG,根据命令进行相应的处理,否则不作处理。程序流程如图3.5所示。 MODEL SMALL 586 DATA TAB DD LAB0 ;命令A处理程序地址 LAB1 ;命令B处理程序地址 LAB6 ;命令G处理程序地址 CODE STARTUP MOV AH,1 ;接收键入字符 INT 21H CMP AL,A ;字符A? JB DONE CMP AL,G ;字符G? JA DONE SUB AL,A ;将字符AG转变成序号06 AND EAX,0000000FH

6、 JMP TABEAX4 ;转不同分支程序 LAB0: ;命令A处理程序 JMP DONE LAB1: ;命令B处理程序 JMP DONE LAB6: ;命令G处理程序 DONE: EXIT END10例 用地址转移表实现下列C语言语句,其中变量a和b是有符号的整型(int)变量: switch (a%8) case0: b=32; break; case1: case2: b=a+43; break; case3: b=2*a; break; case4: b-; break; case5: case6: case7: printf(Function 5_6_7); break;11 .MO

7、DEL SMALL .DATA A DW ? B DW ?Table DW case0, case12, case12,case3, case4, case567, case567, case567MSG DB Function 5_6_7$.CODE.STARTUP MOV AX, A MOV BX, AX AND BX, 7 ;得到BX的低3位二进制数, 实现a%8的计算 SHL BX, 1 ;地址表是字类型,其下标要乘2JMP TableBX ;利用地址表实现多路转移12case0:MOV B,32JMP nextCase12:ADD AX,43MOV B,AXJMP nextCase3

8、:SHL AX,1MOV B,AXJMP nextCase4:DEC BJMP nextCase567:LEA DX,MSGMOV AH,9INT21H JMP next next: .EXIT.END13用地址表实现多路转移的关键在于: 转移入口的地址表和转移情况可整数化。 如果这两个要求有一个不满足或很难构造,则无法使用该方法。 1433 循环程序设计循环程序设计 331 单重循环程序单重循环程序 单重循环程序按照判断循环条件的流程不同可分为两类结构。 一REPEATUNTIL结构:先执行程序再判断循环条件(至少执行一次)。 二WHILEDO结构:先判断循环条件,满足循环条件才进入循环体。

9、 图3.6 REPEATUNTIL循环程序结构 图3.7 WHILEDO循环程序结构15 例3.29 REPEATUNTIL循环结构程序实现举例。 1 MOV CX,COUNT ;设置循环初值 AGAIN: ;循环程序入口 LOOP AGAIN ;循环控制 2 MOV CL,COUNT ;设置循环初值 AGAIN: DEC CL ;计数器减1 JNZ AGAIN ;循环控制 16 例3.30 WHILEDO循环结构程序实现举例。 MOV CX,COUNT ;设置循环初值 AGAIN: JCXZ NEXT DEC CX JMP AGAIN NEXT: 17 例3.31 从键盘输入21个字符,按键

10、入次序寻找字典顺序最大的字符,并显示输出(不区分大小写)。 分析:分析:判断 ASCII码值大小时,小写字符 ASCII码减去20H参与比较(41H 5AH和61H7AH)。 18 MODELSMALL DATA BUF DB 21,?,21DUP(?) BLOCK DB 0AH,0DH,?,$ CODE STARTUP MOV DX,OFFSET BUF ;键入字符串 MOV AH,0AH INT 21H LEA BX,BUF+2 ;BX第一个字符地址 MOV CX,BUF+1 ;CX字符串长度 DEC CX MOV AL,BX ;缓冲区第一个字符送 AL AND AL,11011111B

11、;小写字符 ASCII码减20H MOV SI,BX ;缓冲区第一个字符地址送 SI19AGAIN:INC BX MOV DL,BX ;缓冲区字符送 DL AND DL,11011111B CMP AL,DL ;比较两字符大小 JAE NEXT XCHG AL,DL ;大数存 AL中 MOV SI,BX ;大数地址送 SI NEXT:LOOP AGAIN MOV DL,SI ;最大字符送 DL MOV BLOCK+2,DL MOV DX,OFFSET BLOCK;显示输出 MOV AH,9 INT 21H EXIT END 20例:把数组score的平均值平均值(取整)存入字变量Average

12、中,数组以负数为结束标志。.model small.data score dw 90,95,54,65,36,78,66,0,66,22,-1Average dw 0.code.startupXOR AX,AXXOR DX,DX ;用(DX:AX)保存数组元素之和XOR CX,CX ;用CX保存数组元素个数LEA SI,score ;用指针SI访问整个数组21again: MOV BX,SICMP BX,0JL overADD AX,BXADC DX,0 ;求和INC CX ;计数ADD SI,2 ;地址增量JMP againover:JCXZ exit;防止零作除数(空数组)DIV CX ;

13、求平均值MOV Average,AX exit: .EXITEND22 例3.32 在BLOCK缓冲区中存放着未经排序的字数组,在数组的第一个字中存放着该数组的长度。在KEYWORD单元中存放着一个数。试编制一程序,在数组中查找该数,如果找到该数则把它从数组中删除。 算法:算法:未排序的数组,只能用顺序查找法(用串扫描指令)。要找的元素要找的元素 : 无,结束程序。 有, 在末尾,仅修改数组长度。 不在末尾,高地址元素向 低地址元素移动一个字, 并修改数组长度。23 例3.32程序如下: MODEL SMALL DATA BLOCK DW 08H,22H,55H,99H,44H, 20H,56

14、H,78H, 52H KEYWORD DW ? CODE STARTUP MOV AX,DATA MOV ES,AX LEA DI,BLOCK MOV AX,KEYWORD ;欲查找的关键字 CLD MOV CX,DI ;取数组长度 ADD DI, 2 ;指向数组第一个元素 24 REPNE SCASW ;查找数组中是否有删除元素 (AX -ES:DI,DIDI+2,CXCX-1) JE DELETE JMP DONE ;未找到删除字则结束 DELETE: JCXZ DELLAST ;找到要删除的元素为末尾 元素,直接删除 LP: MOV BX,DI ;找到要删除的元素为中间 元素,高位元素依

15、次低移 SUB DI,2 MOV DI,BX ADD DI,4 LOOP LP DELLAST: DEC BLOCK ;删除该元素,数组长度减1 DONE:EXIT END25 例3.33 将正数正数N插入插入一个按递增排列递增排列的正数的字数组的正确位置。该数组的首地址和末地址分别为HEAD和REAR。 算法:算法:1. 因为数组长度是确定的,因此找到插入位置作为循环的结束条件。 2. 从数组的尾部向头部查找,逐字取出数组中的一个数与插入元素作比较。三种可能性:三种可能性: 如果插入元素大于数组中所有数,则插入到最后。 如果插入元素小于本次比较的数组元素,则把本次比较的数组元素向地址增大的方

16、向移动一个字,然后继续查找。 如果插入元素小于数组中的所有数,通过在STOP单元中存放“1”这个数来结束循环,因为插入元素为正数。26 从数组的尾部向头部查找,有三种可能性有三种可能性: 如果插入元素大于数组中所有数,则第一次比较就可以结束循环。 如果插入元素小于本次比较的数组元素,则把本次比较的数组元素向地址增大的方向移动一个字,然后继续查找;直到插入元素大于数组中本次比较的元素,则把元素插入其地址高位,结束程序。为了空出要插入元素的位置,其地址高位的全部元素,都应向地址增大的方向移动一个字。 如果插入元素小于数组中的所有数,通过在STOP单元中存放“1”这个数来结束循环,因为插入元素为正数

17、,那它必然大于1。 2728例3.33程序如下: MODEL SMALL DATA STOP DW 0FFFFH ;-1的补码,作为插入元素 小于数组中所有元素时 循环结束的条件 HEAD DW 1,3, 5,35,56,65, 88 REAR DW 108,? ;108是最尾部的元素 NUM DW 35 ;欲插入元素 CODE STARTUP 29 MOV AX,NUM MOV DI,0 COMPARE: CMP AX ,REAR DI ;插入元素和高地址元素 开始比较 JGE INSERTWORD ;大于等于 MOV BX,REAR DI ;插入元素高地址元素, 则向地址 增大方向移动一个

18、字 MOV REAR DI+2,BX SUB DI,2 JMP COMPARE INSERTWORD: MOV REAR DI+2,AX ;在数组中插入元素 EXIT END30 例3.34 设有数组X和Y,X数组中有X1,X10;Y数组中有Y1,Y10。试编制程序计算: Z1=X1Y1 Z5=X5Y5 Z8=X8Y8 Z2=X2Y2 Z6=X6Y6 Z9=X9Y9 Z3=X3Y3 Z7=X7Y7 Z10=X10Y10 Z4=X4Y4结果存入Z数组。 这类问题,也可用循环程序结构来完成。 已知循环计数值为10, 每次循环有两种操作:加法和减法, 可以设立标志位,如标志位为0做加法,为1则做减法; 做10次操作设立10个标志位, 放在一个存储单元LOGIC-RULE中,这种存储单元一般称为逻辑尺,本例设定的逻辑尺为: 0000000011011100 标志位从低位开始顺序反映了每次 的操作,最高的6位没有意义把它们设为0。 31例3.34程序如下: MODEL SMALL DATA X DW X1,X2,X3,X4,X5, X6,X7,X8,X9,X10 Y DW Y1,Y2,Y3,Y4,Y5, Y6,Y7,Y8,Y9,Y10 Z DW 10DUP(?) LOGIC-R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论