




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
循环程序设计分支程序设计第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来计数,然后用移位的方法把各位数逐次移到最高位去。图5.1数1的程序框图TITLE 数1的程序DATA SEGMENTADDR DWNUMBERNUMBER DW12F0H;
Y的值COUNT DW?DATA ENDSCODE SEGMENTMAIN PROCFARASSUMECS:CODE,DS:DATASTART: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV CX,0 MOV BX,ADDR MOV AX,[BX]REPEAT:CMP AX,0JZ EXITJNS SHIFTINC CX
SHIFT:SHL AX,1JMP REPEATEXIT:MOVCOUNT,CXRET MAINENDPCODEENDS ENDSTART
BX1234【例5.2】P161:把BX中的二进制数以十六进制的形式显示在屏幕上
……
movch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30h;’0’~’9’ASCII30H~39Hcmpal,3ahjlprintitaddal,7h;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21hdecchjnzrotate
……
……movbx,0newchar:movah,1;键盘输入
int21hsubal,30hjlexit;<0退出
cmpal,9jgexit;>9退出
cbw;?xchgax,bxmovcx,10mulcxxchgax,bxaddbx,axjmpnewcharexit:……例:从键盘接收十进制数并存入BX((0×10)+1)×10+2)×10+5125313235
……movbx,0newchar:movah,1;键盘输入
int21hsubal,30hjlexit;<0退出
cmpal,10jladd_tosubal,27h;‘a’~‘f’cmpal,0ahjlexit;<‘a’退出
cmpal,10hjgeexit;>’f’退出add_to:movcl,4shlbx,clmovah,0addbx,axjmpnewcharexit:……例:从键盘接收十六进制数并存入BX1af316166((0×16)+1)×16+0a)×16+0f循环程序控制方法之一计数法循环次数已知1.正计数法2.负计数法计数器的初值为0,每执行一遍循环,计数器加1,然后与规定的循环次数比较,若相等,则结束循环,否则继续循环。计数器的初值为循环次数,每执行一遍循环体后,计数器减1,当减为0时,结束循环,否则继续循环。正计数法负计数法【*例5.3A】分别统计COUNT个数据中正、负数的个数。(P139.asm)DATASEGMENTBUFDB-32,25,36,-18,-64,0,-3COUNTEQU$-BUFPLUSDB?
MINUSDB?DATAENDS数据定义如下:LOP1:MOVAL,[SI]CMPAL,0JGENEXT0INCBLJMPNEXT1NEXT0:INCDLNEXT1:INCSIINCCXCMPCX,COUNTJLLOP1MOVMINUS,BLMOVPLUS,DLMOVAH,4CHINT21HCODEENDSDATASEGMENTBUFDB-32,25,36,-18,-64,0,-3COUNTEQU$-BUFPLUSDB?MINUSDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBL,0MOVDL,0MOVSI,OFFSETBUFMOVCX,0ENDSTART循环程序控制方法之二条件控制
当只知道进入或结束循环的条件,而无法知道循环次数时,可采用条件控制法。1.精度:对于数值求解问题,有时无法得到精确解。通常的方法是,在迭代计算过程中,把本次迭代结果与前一次迭代结果相比,当符合精度要求时,结束迭代循环。2.设置结束标志:在数组和表格处理问题中,在数据表格末尾设置一结束标志,作为循环结束条件。【*例5.3B】统计字符串STRING中空格的个数。数据定义为:DSEGSEGMENTSTRINGDB‘Wherethereisawill,’
DB‘thereisaway.$’
RESULTDW?DSEGENDS被统计的字符串开设结果存放单元CSEGSEGMENTASSUMEDS:DSEG,CS:CSEGSTART:MOVAX,DATAMOVDS,AX给数据段段地址附值取数空格?累计计数器加1修改地址指针结束符?MOVBX,OFFSETSTRINGMOVDX,0NEXT:MOVAL,[BX]CMPAL,‘$’
JZFINCMPAL,20HJNZCONTINCDXCONT:INCBXJMPNEXTFIN:MOVRESULT,DXMOVAH,4CH
INT21HCSEGENDSENDSTART初始化保存结果结束YNYNxdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32【例5.4】:将正数n
插入一个已整序的正数字数组……movax,nmovarray_head-2,0ffffhmovsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2jmpshortcompareinsert:movarray_end[si+2],ax……35152337495265789910532-1array_headarray_endnx
LOP1:moval,[bx]CMPAL,'A';比较判断
JBNEXT1CMPAL,'Z'JANEXT1orAL,20H;或ADDAL,20H大写转换为小写
MOV[BX],ALMOVDL,ALMOVAH,02HINT21HNEXT1:INCBXloopLOP1MOVAH,4CHINT21HCODEENDSENDSTARTDATASEGMENTSTRINGDB'ABcdtrDte355FTY'Nequ$-stringDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEABX,STRINGmovcx,N
synew21.asm实验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-Y5Z6=X6+Y6、Z7=X7-Y7、Z8=X8-Y8、Z9=X9+Y9、Z10=X10+Y10并把结果存入数组Z中。
数据定义:DSEGSEGMENTXDWX1,X2,X3,X4,X5,X6,X7,X8,X9,X10YDWY1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y10ZDW10DUP(?)LRDW0000000011011100BDSEGENDSX1+Y1X3-Y3逻辑尺MOVCX,10MOVDX,LRSUBBX,BXNEXT:MOVAX,X[BX]SHRDX,1JCSBADDAX,Y[BX]JMPSHORTRESULTSB:SUBAX,Y[BX]RESULT:MOVZ[BX],AXADDBX,2LOOPNEXTRETMAINENDPCSEGENDSENDMAINDSEGSEGMENTXDW25,47,58,15,45,65,66,32,14,27YDW10,13,65,32,47,45,69,60,9,56ZDW10DUP(?)LRDW00DCHDSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGMAINPROCFARPUSHDSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AXP142.asm多重循环程序设计循环可以有多重结构。多重循环程序设计的基本方法和单重循环程序设计的基本方法是一致的,应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。此外,应该注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。下面举例加以说明。MOVAH,4CHINT21HNEWLINEPROCPUSHAXPUSHDXMOVDL,0DHMOVAH,2INT21HMOVDL,0AHMOVAH,2INT21HPOPDXPOPAXRETNEWLINEENDPCSEGENDSENDMAINsynew22.asmCSEGSEGMENTASSUMECS:CSEGMAIN:MOVBL,10HMOVCL,0FHMOVCH,10hLOP1:MOVdl,blMOVAH,02HINT21HMOVDL,0MOVAH,02HINT21HINCBLDECCHJNZLOP1CALLNEWLINEMOVCH,10hDECClJNZLOP1
实验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起泡排序算法举例序号数比较遍数1231234585168432816841684328432163288555将首地址为A的字数组从小到大排序(气泡算法,多重循环)
32,85,16,15,8
序号地址数比较遍数12341A322A+2853A+4164A+6155A+88321615885161583285158163285815163285
图5.7起泡排序算法的程序框图movcx,5;元素个数
deccx;比较遍数loop1:movdi,cx;比较次数
movbx,0loop2:movax,A[bx];相邻两数
cmpax,A[bx+2];比较
jlecontinuexchgax,A[bx+2];交换位置
movA[bx],axcontinue:addbx,2looploop2movcx,dilooploop1
MOVcx,LEN-1movbx,cxLOP1:movsi,0movcx,bxLOP2:MOVAx,a[si]CMPAx,a[si+2]JGENEXTXCHGAx,a[si+2]MOVa[si],AxNEXT:addsi,2LOOPLOP2decbxJNZLOP1STOP:MOVAH,4CHINT21HCODEENDSENDSTARTDATASEGMENTaDW12,87,-51,68,0,15LENEQU($-a)/2
DATAENDS
CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
DATASEGMENTaDW12,87,-51,68,0,15nEQU($-a)/2
DATAENDS
CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXPH173.asmMOVcx,n-1LOP1:movDI,cxmovbx,0LOP2:MOVAx,a[bx]CMPAx,a[bx+2]JGENEXTXCHGAx,a[bx+2]MOVa[bx],AxNEXT:addbx,2LOOPLOP2movcx,diloopLOP1STOP:MOVAH,4CHINT21HCODEENDSENDSTART5.2分支程序设计判定条件分支程序1判定条件分支程序1分支程序1a.双分支情况之一b.双分支情况之二分支程序结构:不论哪一种形式,它们的共同特点是:运行方向是向前的,在某一种特定条件下,只能执行多个分支中的一个分支。条件1分支程序1分支程序n分支程序2条件2条件n判定条件分支程序1分支程序n分支程序2c.多分支情况之一d.多分支情况之二条件1条件2条件nYYYNNS1:…………;程序段1,产生条件
……
JccBRANCH;条件测试,并定向
…………;分支程序段1……
JMPS2;顺序控制BRANCH:…………;分支程序段2……S2:……程序段1条件测试分支1分支2YNS2BRANCH图4.11双分支程序组成分支结构一般通过条件转移指令来实现。如Jcc,JMP【例5.8】比较两个无符号数,把大数存入MAX单元。取第一个数X1MAX←X1MAX←X2开始结束X1-X2≥0?YNCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEG;给数据段地址附值
MOVDS,AXMOVAL,NUMBER;取第一个数X1CMPAL,NUMBER+1;与第二个数X2JNCBRANCH;若X1>X2,转BRANCHMOVAL,NUMBER+1;否则,第二个数BRANCH:MOVMAX,AL;保存较大数
MOVAH,4CHINT21HCSEGENDSDSEGSEGMENTNUMBERDB23H,55H;X1=23H和X2=55H为二个无符号数
MAXDB?DSEGENDS数据定义码段ENDSTART;汇编结束【例5-9】P177在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度,在AX中有一个无符号数,要求在数组中查找(AX)。如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。
;统计
movcx,09leabx,buffnext2:moval,[bx]cmpal,8JAEp1incminusjmpp2p1:incplusp2:incbxloopnext2movah,4chint21hCSEGENDSendstartsynew31.asmDATASEGMENTBUFFDB9dup(?)PLUSDB0MINUSDB0DATAENDSCSEGSEGMENTASSUMECS:CSEG,ds:dataSTART:movax,datamovds,axmovcx,09;输入9个数leabx,buffnext1:MOVAH,01INT21HSUBAL,30Hcmpal,0AHjBnext3subal,7next3:mov[bx],alincbxloopnext1实验3.1通过键盘输入9个16进制的个位数,数据存入BUFF缓冲区中,编写程序分别统计BUFF中大于等于8和小于8的个数,并分别存放到PLUS和MINUS单元中。。datasegmentarraydw12,11,22,33,44,55,66 dw77,88,99,111,222,333numberdw55low_idxdw?high_idxdw?dataends例:折半查找算法121122334455667788991112223330123456789101112(ax)=55low_idx1145high_idx
12555(si)=0ahCf=0(ax)=90low_idx17789high_idx
1212888(si)=10hCf=1折半算法1……leadi,arraymovax,number;要查找数
cmpax,[di+2];(ax)与第一个元素比较
jachk_lastleasi,[di+2]jeexit;(ax)=第一个元素,找到退出
stcjmpexit;(ax)<第一个元素,未找到退出chk_last:movsi,[di];元素个数
shlsi,1;计算最后一个元素
addsi,di;的地址
cmpax,[si];(ax)与最后一个元素比较
jbsearchjeexit;(ax)=最后一个元素,找到退出
stcjmpexit;(ax)>最后一个元素,未找到退出算法1compare:cmpax,[bx+si]jeexitjahigher
deccxmovhigh_idx,cxjmpmidhigher:
inccxmovlow_idx,cxjmpmidno_match:stcexit:……search:movlow_idx,1movbx,[di];个数
movhigh_idx,bxmovbx,dimid:movcx,low_idxmovdx,high_idxcmpcx,dxjano_matchaddcx,dxshrcx,1movsi,cxshlsi,1
折半查找法先取有序数组的中间元素与查找值相比较。如相等则查找成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比较。如查找值小于中间元素,则再取低半部的中间元素与查找值相比较。如此重复直到查找成功或最终未找到该数为止。datasegmentarraydw12,11,22,33,44,55,66,77,88,99,111,222,333numberdw55low_idxdw?high_idxdw?dataends例:折半查找算法121122334455667788991112223330123456789101112(ax)=55low_idx1145high_idx
12555(si)=0ahCf=0(ax)=90low_idx17789high_idx
1212888(si)=10hCf=1折半算法1……leadi,arraymovax,number;要查找数
cmpax,[di+2];(ax)与第一个元素比较
jachk_lastleasi,[di+2]jeexit;(ax)=第一个元素,找到退出
stcjmpexit;(ax)<第一个元素,未找到退出chk_last:movsi,[di];元素个数
shlsi,1;计算最后一个元素的地址
addsi,di;
cmpax,[si];(ax)与最后一个元素比较
jbsearchjeexit;(ax)=最后一个元素,找到退出
stcjmpexit;(ax)>最后一个元素,未找到退出算法1compare:cmpax,[bx+si]jeexitjahigher
deccxmovhigh_idx,cxjmpmidhigher:
inccxmovlow_idx,cxjmpmidno_match:stcexit:……search:movlow_idx,1movbx,[di];个数
movhigh_idx,bxmovbx,dimid:movcx,low_idxmovdx,high_idxcmpcx,dxjano_matchaddcx,dxshrcx,1movsi,cxshlsi,1例:根据AL寄存器中哪一位为1(从低位到高位),把程序转移到8个不同的程序分支branch_tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine8
……
cmpal,0;AL为逻辑尺
jecontinueleabx,branch_tableL:shral,1;逻辑右移
jncadd1jmpwordptr[bx]
;段内间接转移add1:addbx,typebranch_table;addbx,2jmpLcontinue:……routine1:……routine2:……
(寄存器间接寻址)(寄存器相对寻址)……cmpal,0jecontinuemovsi,0L:shral,1;逻辑右移
jncadd1jmpbranch_table[si];段内间接转移add1:addsi,typebranch_tablejmpLcontinue:……routine1:……routine2:……(基址变址寻址)
……
cmpal,0jecontinueleabx,branch_tablemovsi,7*typebranch_tablemovcx,8L:shlal,1;逻辑左移
jncsub1jmpwordptr[bx][si]
;段内间接转移sub1:subsi,typebranch_table;(si)-2loopLcontinue:……routine1:……routine2:……第5章作业Page1935.55.75.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<R[MID],则转步骤(4);若K>R[MID],则转步骤(5)。
(4)低半部分查找(Lower),HIGH←MID-1,返回步骤(2),继续查找。
(5)高半部分查找(Higher),LOW←MID+1,返回步骤(2),继续查找。图5.7表示了折半查找算法的程序框图。给出的程序首先把查找值与数组的第一个元素和最后一个元素相比较,如果找到该数小于第一个元素或大于最后一个元素则结束查找,否则从SEARCH开始折半查找。SEARCH以前的工作在图5.7中未表示出来。折半查找算法的程序实现如程序清单所示。图5.7折半查找算法的程序框图例5-9折半查找算法程序。DSEG SEGMENTLOW_I DW ?HIGH_I DW ?DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,ES:DSEGB_SRCH PROC NEARPUSH DSPUSH AXMOV AX,DSEG MOV DS,AXMOV ES,AXPOP AXCMP AX,ES:[DI+2]JA CHK_LAST
LEA SI,ES:[DI+2]JE EXITSTC JMP EXIT CHK_LAST:MOV SI,ES:[DI]SHL SI,1ADD SI,DICMP AX,ES:[SI] JB SEARCH JE EXIT
STC JMP EXITSEARCH:MOV LOW_I,1 MOV BX,ES:[DI]MOV HIGH_I,BXMOV BX,DIMID: MOV CX,LOW_IMOV DX,HIGH_ICMP CX,DXJA NO_MATCH
ADD CX,DXSHR CX,1MOV SI,CXSHL SI,1 COMPARE:CMP AX,ES:[BX+SI] JE EXIT JA HIGHER DEC CXMOV HIGH_I,CXJMP MIDHIGHER: INC CX MOV LOW_I,CX JMP MIDNO_MATCH:STC EXIT: POP DS RET B_SRCH ENDPCSEG ENDS END
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子商务平台与社交电商模式创新考核试卷
- 皇帝蕉种植与养护考核试卷
- 游乐设施施工安全管理规范实施考核试卷
- 油气储运安全与环保措施考核试卷
- 玻璃仪器在投影仪与幻灯机制造中的应用考核试卷
- 新能源汽车电控系统软件架构设计考核试卷
- 2025标准员工与公司间的借款协议合同
- 花样游泳课件
- 2025商业办公房屋转让合同协议书范本
- 2025北京市实习学生劳动合同协议书
- 2025年张家界航空工业职业技术学院单招职业技能测试题库及参考答案
- 财政投资评审咨询服务预算和结算评审项目投标文件(技术方案)
- 2025年济源职业技术学院单招职业技能测试题库完整
- 农村自建房施工合同范本(包工包料)
- 污水处理设施运维服务投标方案(技术标)
- 极端天气安全教育主题班会
- 大模型应用培训
- 【道法】做自信的人课件 2024-2025学年统编版道德与法治七年级下册
- 2024政府与华为签订的旅游产业合作协议3篇
- 教师团队建设与质量提升的策略与路径
- 口腔咨询师接诊技巧培训
评论
0/150
提交评论