第5章 循环与分支程序设计pptConvertor.docx
- 文档编号:25436215
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:27
- 大小:3.42MB
第5章 循环与分支程序设计pptConvertor.docx
《第5章 循环与分支程序设计pptConvertor.docx》由会员分享,可在线阅读,更多相关《第5章 循环与分支程序设计pptConvertor.docx(27页珍藏版)》请在冰豆网上搜索。
第5章循环与分支程序设计pptConvertor
第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的程序
DATASEGMENT
ADDRDWNUMBER
NUMBERDW12F0H;Y的值
COUNTDW?
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVCX,0
MOVBX,ADDR
MOVAX,[BX]
REPEAT:
CMPAX,0
JZEXIT
JNSSHIFT
INCCX
SHIFT:
SHLAX,1
JMPREPEAT
EXIT:
MOVCOUNT,CX
RET
MAINENDP
CODEENDS
ENDSTART
【例5.2】P161:
把BX中的二进制数以十六进制的形式显示在屏幕上
……
movch,4
rotate:
movcl,4
rolbx,cl
moval,bl
andal,0fh
addal,30h;’0’~’9’ASCII30H~39H
cmpal,3ah
jlprintit
addal,7h;’A’~’F’ASCII41H~46H
printit:
movdl,al
movah,2
int21h
decch
jnzrotate
……
例:
从键盘接收十进制数并存入BX
……
movbx,0
newchar:
movah,1;键盘输入
int21h
subal,30h
jlexit;<0退出
cmpal,9
jgexit;>9退出
cbw;?
xchgax,bx
movcx,10
mulcx
xchgax,bx
addbx,ax
jmpnewchar
exit:
……
例:
从键盘接收十六进制数并存入BX
……
movbx,0
newchar:
movah,1;键盘输入
int21h
subal,30h
jlexit;<0退出
cmpal,10
jladd_to
subal,27h;‘a’~‘f’
cmpal,0ah
jlexit;<‘a’退出
cmpal,10h
jgeexit;>’f’退出
add_to:
movcl,4
shlbx,cl
movah,0
addbx,ax
jmpnewchar
exit:
……
1af
316166
((0×16)+1)×16+0a)×16+0f
【*例5.3A】分别统计COUNT个数据中正、负数的个数。
(P139.asm)
数据定义如下:
DATASEGMENT
BUFDB-32,25,36,-18,-64,0,-3
COUNTEQU$-BUF
PLUSDB?
MINUSDB?
DATAENDS
循环程序控制方法之二---条件控制
当只知道进入或结束循环的条件,而无法知道循环次数时,可采用条件控制法。
1.精度:
对于数值求解问题,有时无法得到精确解。
通常的方法是,在迭代计算过程中,把本次迭代结果与前一次迭代结果相比,当符合精度要求时,结束迭代循环。
2.设置结束标志:
在数组和表格处理问题中,在数据表格末尾设置一结束标志,作为循环结束条件。
【*例5.3B】统计字符串STRING中空格的个数。
实验2.1在数据段中有从STRING单元开始存放的100个字节数据,编写程序要求将字符串中的大写字母转换为小写字母,并显示到屏幕上。
【例5.5】设在数据组X和Y中各存在有10个数据元素。
试编写程序计算:
(P142.asm)
Z1=X1+Y1、Z2=X2+Y2、Z3=X3-Y3、Z4=X4-T4、Z5=X5-Y5
Z6=X6+Y6、Z7=X7-Y7、Z8=X8-Y8、Z9=X9+Y9、Z10=X10+Y10
并把结果存入数组Z中。
多重循环程序设计
循环可以有多重结构。
多重循环程序设计的基本方法和单重循环程序设计的基本方法是一致的,应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。
此外,应该注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。
下面举例加以说明。
实验2.2用表格形式显示字符:
按15行×16列的表格形式显示ASCII码为10H~FFH的所有字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII码为0)分隔。
【例5-7】有一个首地址为A的N个字数组,编制程序使该数组中的数按照从大到小的次序排列。
(双循环程序设计ph1732.asmPH173.asm)这里采用起泡排序算法,从第一个数开始依次对相邻两个数进行比较。
如次序对,则不做任何操作;如次序不对,则使两个数交换位置。
表5-1表示了这种算法的例子。
从中可以看出,在做了第一遍的(N?
1)次比较后,最小的数已经放到了最后,所以第二遍只需要考虑(N?
1)个数,即只需要比较(N?
2)次。
第三遍则只需要做(N?
3)次比较……总共最多(N?
1)遍比较就可以完成排序。
图5.7表示了起泡排序算法的程序框图,并编制了起泡排序算法的程序。
表5-1起泡排序算法举例
将首地址为A的字数组从小到大排序
(气泡算法,多重循环)32,85,16,15,8
【例5-9】P177在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度,在AX中有一个无符号数,要求在数组中查找(AX)。
如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。
折半查找法先取有序数组的中间元素与查找值相比较。
如相等则查找成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比较。
如查找值小于中间元素,则再取低半部的中间元素与查找值相比较。
如此重复直到查找成功或最终未找到该数为止。
第5章作业
Page1935.55.7
5.125.18
折半查找法的效率高于顺序查找法,对于长度为N的表格,顺序查找法平均要作N/2次比较,而折半查找法的平均比较次数为log2N。
所以,如果数组长度为100,则顺序查找法平均要作50次比较,而折半查找法平均作7次比较就可以了。
在一个长度为N的有序数组R中,查找元素K的折半查找算法可描述如下:
(1)初始化被查找数组的首尾下标,LOW←L,HIGH←N。
(2)若LOW>HIGH,则查找失败,置CF=1,退出程序。
否则,计算中点:
MID←(LOW+HIGH)/2。
(3)K与中点元素R[MID]比较。
若K=R[MID]则查找成功,程序结束;若K
(4)低半部分查找(Lower),HIGH←MID-1,返回步骤
(2),继续查找。
(5)高半部分查找(Higher),LOW←MID+1,返回步骤
(2),继续查找。
图5.7表示了折半查找算法的程序框图。
给出的程序首先把查找值与数组的第一个元素和最后一个元素相比较,如果找到该数小于第一个元素或大于最后一个元素则结束查找,否则从SEARCH开始折半查找。
SEARCH以前的工作在图5.7中未表示出来。
折半查找算法的程序实现如程序清单所示。
图5.7折半查找算法的程序框图
例5-9折半查找算法程序。
DSEGSEGMENT
LOW_IDW?
HIGH_IDW?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG,ES:
DSEG
B_SRCHPROCNEAR
PUSHDS
PUSHAX
MOVAX,DSEG
MOVDS,AX
MOVES,AX
POPAX
CMPAX,ES:
[DI+2]
JACHK_LAST
LEASI,ES:
[DI+2]
JEEXIT
STC
JMPEXIT
CHK_LAST:
MOVSI,ES:
[DI]
SHLSI,1
ADDSI,DI
CMPAX,ES:
[SI]
JBSEARCH
JEEXIT
STC
JMPEXIT
SEARCH:
MOVLOW_I,1
MOVBX,ES:
[DI]
MOVHIGH_I,BX
MOVBX,DI
MID:
MOVCX,LOW_I
MOVDX,HIGH_I
CMPCX,DX
JANO_MATCH
ADDCX,DX
SHRCX,1
MOVSI,CX
SHLSI,1
COMPARE:
CMPAX,ES:
[BX+SI]
JEEXIT
JAHIGHER
DECCX
MOVHIGH_I,CX
JMPMID
HIGHER:
INCCX
MOVLOW_I,CX
JMPMID
NO_MATCH:
STC
EXIT:
POPDS
RET
B_SRCHENDP
CSEGENDS
ENDBSRCH
若数组元素如下:
LISTDW12,11,22,33,44,55,66,77,88,99,111,222,333
如果要查找的数为(AX)=55。
数组长度为12,第一次比较的是数组的第六个元素。
因55<66,所以第二次用低半部折半查找,比较的是第三个元素33;因55>33,所以第三次用高半部折半查找,比较的是第四个元素44。
因55>44,所以第四次用高半部折半查找,比较的是第五个元素55。
这样经过四次比较后,因查找成功而退出程序。
如果要查找的数为(AX)=57,则第一次比较的仍是第六个元素66。
因57<66,所以第二次用低半部折半查找,比较的是第三个元素33。
因57>33,所以第三次用高半部折半查找,比较的是第四个元素44。
因57>44,所以第四次用高半部折半查找,比较的是第五个元素55,因57>55,再用高半部折半查找时,因LOW>HIGH而以查找失败退出程序。
可以看出,在这个例子中,同样用CMP指令以及条件转移指令产生两个或多个程序分支。
当然,由于多数运算型指令置条件码,所以在条件转移指令之前并不一定要使用CMP或TEST指令,只要保证使用条件转移指令时的条件码符合要求就可以了。
以上多个例子都是既有分支结构又包括循环结构,实际上,多数程序都是各种程序结构的组合。
而且,循环结构可以看作分支结构的一种特例,它只是多次走一个分支,只在满足循环结束条件时,走另一个分支罢了。
多分支结构:
跳跃表法
分支程序的两种结构形式都可以用上面所述的方法来实现。
此外,在实现CASE结构时,还可以使用跳跃表法,使程序能根据不同的条件转移到多个程序分支中去。
下面举例说明。
【例5-10】P180试根据AL寄存器中哪一位为1(从低位到高位)就把程序转移到8个不同的程序分支中去。
下面列出了用变址寻址方式实现跳跃表法的程序,还可以使用寄存器间接和基址变址寻址方式来达到同一目的,这三种方法并无实质的区别,只是其中关键的JMP指令所用的寻址方式不同而已。
跳跃表法是一种很有用的分支程序设计方法,应当通过例子掌握要领,灵活使用。
用变址寻址方式实现跳跃表法的程序:
DATASEGMENT
DATATABDWROUTINE_1
DWROUTINE_2
DWROUTINE_3
DWROUTINE_4
DWROUTINE_5
DWROUTINE_6
DWROUTINE_7
DWROUTINE_8
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBBX,BX
PUSHBX
MOVBX,DATA
MOVDS,BX
CMPAL,0
JECONT
MOVSI,0
LP:
SHRAL,1
JNBNOT_YET
JMPDATATAB[SI]
NOT_YET:
ADDSI,TYPEDATATAB
JMPLP
CONT:
ROUTINE_1:
ROUTINE_2:
RET
MAINENDP
CODEENDS
ENDSTART
【例5-10】用间接寻址方式实现跳跃表法的程序:
CMPAL,0
JECONTINUE_MAIN_LINE
LEABX,DATATAB
LP:
SHRAL,1
JNBNOT_YET
JMPWORDPTR[BX]
NOT_YET:
ADDBX,TYPEDATATAB
JMPLP
CONTINUE_MAIN_LINE:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第5章 循环与分支程序设计pptConvertor 循环 分支 程序设计 pptConvertor