1)由条件转移指令实现程序分支 例4-9(p83):数据块传送。如果源数据区与目的数据区位置 没有重叠部分,则正向传送数据块,否则反向传送数据块。 分析: 正向传送 299 存储区无重叠 反向传送 299 存储区有重叠 tgl stg △如何判断存储区是否重叠? 存储区无重叠的判断条件 源区结束地址(stg1l+源区长度-1)<目的区起始地址(stg2) 程序及流程图见教材p83例4-9
1) 由条件转移指令实现程序分支 例4-9(p83): 数据块传送。如果源数据区与目的数据区位置 没有重叠部分,则正向传送数据块,否则反向传送数据块。 分析: stg1 stg2 299 存储区无重叠 0 0 stg2 299 存储区有重叠 stg1 正向传送 反向传送 如何判断存储区是否重叠? 存储区无重叠的判断条件: 源区结束地址(stg1+源区长度-1) < 目的区起始地址(stg2) 程序及流程图见教材p83 例4-9
2)用无条件转移指令+跳转表实现程序分支 跳转表便于实现多路分支。 设有若干段分支程序,将每段分支程序的入口地址(也称 跳转地址)组成一个连续存放在内存中的表,称为跳转表。 若有n个产品,将这n个产品的加工处理程序(分支程序)入 口地址(分别为BR0,BR1,…,BRn-1)组成跳转表,可就利 用跳转表取得BRO,BR1,…,BRn-1,转移到相应的分支程序 去处理产品 由表地址就可取得分支程序地址BRn,再将BRn送IP,实现转移。 例:根据学生成绩评定等级:90~100分的等级为“A”;80~89 分的等级为B”;70~79分的等级为“C”,60~69分的等级为 “D,<60分的等级为“E。 分析:0~5960~6970~7980~8990~100 tab dw bro. br1 br2 br3 br4(跳转表) E D B A (程序见P84例4-10)
2) 用无条件转移指令+跳转表实现程序分支 跳转表便于实现多路分支。 设有若干段分支程序,将每段分支程序的入口地址(也称 跳转地址)组成一个连续存放在内存中的表,称为跳转表。 若有n个产品,将这n个产品的加工处理程序(分支程序)入 口地址(分别为BR0,BR1,…,BRn-1)组成跳转表,可就利 用跳转表取得BR0,BR1,…,BRn-1,转移到相应的分支程序 去处理产品。 由表地址就可取得分支程序地址BRn,再将BRn送IP,实现转移。 例: 根据学生成绩评定等级:90~100分的等级为“A”;80~89 分的等级为“B”;70~79分的等级为“C”,60~69分的等级为 “D”,<60分的等级为“E” 。 分析: 0~59 60~69 70~79 80~89 90 ~100 0 1 2 3 4 tab dw br0 , br1 , br2 , br3 , br4 (跳转表) E D C B A (程序见P84 例4-10) next
表首址 表首址一 表首址 关健字0 BR0地址 JMP BRO BR0地址 R地址 匚关键字1 JMP BR1 第2个元素 BR2地址 的表地址 BR1地址 关键字n-1 BRn1地址 JMP BRr BRn-l 地址 (a)跳转表由入口地址组成(b)跳转表由转移指令组成 (c)跳转表含关键字 图49跳转表的组成 设n2,存放BR2的表地址为 表地址一表首址+BR2在表中的位置序号x表元素占用的字节数 设(BX)=存放BR2的单元表地址 JMP BXI ;((BX))→(P)=BR2,实现转移 △对于(b)中的跳转表,怎样使用JMP指令实现转移? JMP BX 返回
设n=2,存放BR2的表地址为: 表地址=表首址+ BR2在表中的位置序号 表元素占用的字节数 设(BX)=存放BR2的单元表地址 返回 JMP [BX] ;((BX)) ( IP) =BR2, 实现转移 对于(b)中的跳转表,怎样使用JMP指令实现转移?JMP BX
4.4循环程序设计 根据条件重复执行一段指令就构成了循环程序结构。 例:将 ARRAY数组中的50个数求和,并将和存入字变量S中。 MOV AX O 累加求和寄存器清0 MOV BX, OFFSET ARRAY;数组始址送BX中 MOV CX. 50 ;循环控制计数初始化 AGAIN: ADD AX, BX ADD BX. 2 ;数组地址增2,BX指向下一个元素 DECCⅩ ;循环控制计数减1 JNZ AGAIN;计数不为0时继续循环 MOV S. AX ;计数为0时循环结束,和存于S中 保证循环正常执行和结束的条件 正确地初始化循环控制计数和初始条件 ②正确地检测循环条件 ③必须保证能达到循环结束条件(例如在循环体内有修改循环 控制值的指令)
4.4 循环程序设计 根据条件重复执行一段指令就构成了循环程序结构 。 MOV AX,0 ;累加求和寄存器清0 MOV BX,OFFSET ARRAY ;数组始址送BX中 MOV CX,50 ;循环控制计数初始化 AGAIN : ADD AX,[BX] ADD BX,2 ;数组地址增2,BX指向下一个元素 DEC CX ;循环控制计数减1 JNZ AGAIN ;计数不为0时继续循环 MOV S,AX ;计数为0时循环结束,和存于S中 保证循环正常执行和结束的条件: 正确地初始化循环控制计数和初始条件 正确地检测循环条件 必须保证能达到循环结束条件 (例如在循环体内有修改循环 控制值的指令) 例:将ARRAY数组中的50个数求和,并将和存入字变量S中
指令系统提供了专门用于循环结构的循环控制指令,更加 简便的地实现循环结构。 4.1循环控制指令 循环控制指令的转移范围为:-128~+127字节(段内短转移) (1)LOOP指令 格式:LOOP标号 否 操作:如图所示 (CⅩ)≠0且ZF=0? (2)等于继续循环指令 是 格式: LOOPZ/ LOOPE标号 执行循环体退出循环 (3)不等于继续循环指令 (CX)←(CX)-1 格式: LOOPNZ/ LOOPNE标号 在前面的求和例子中,可用一条循环指令代替两条指令: LOOP AGAIN DEC CX JNZ AGAIN
指令系统提供了专门用于循环结构的循环控制指令,更加 简便的地实现循环结构。 4.4.1 循环控制指令 循环控制指令的转移范围为:-128~+127字节 (2)等于继续循环指令 格式:LOOPZ/LOOPE 标号 (3)不等于继续循环指令 格式:LOOPNZ/LOOPNE 标号 LOOP AGAIN (段内短转移) 格式:LOOP 标号 操作: 如图所示 (1)LOOP指令 (CX)≠ 0? 执行循环体 (CX) (CX) -1 是 否 退出循环 (CX)≠ ≠0 0 且且ZF =1 ? ZF=0 ? 在前面的求和例子中,可用一条循环指令代替两条指令: DEC CX JNZ AGAIN