您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 微机原理 第4章 循环与分支程序设计
第4章循环与分支程序设计循环程序的结构形式循环体NY循环控制条件循环初始状态NY循环体循环初始状态循环控制条件循环程序设计第4章循环与分支程序设计循环程序设计方法【例1】试编制一个程序把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。1.如何将二进制数转换为十六进制数?2.如何显示转换后的十六进制数?3.如何判断整个二进制数转换完毕?第4章循环与分支程序设计【例1】解题思路15121187430(BX)1234(BX)2341(BX)3412(BX)4123(BX)1234第一次:第二次:第三次:第四次:1.如何将二进制数转换为十六进制数?第4章循环与分支程序设计【例1】解题思路2.如何显示转换后的十六进制数?3.如何判断整个二进制数转换完毕?使用DOS系统功能调用(INT21H)的2号功能。调用参数:DL=输出字符返回参数:无MOVAH,2MOVDL,‘A’INT21H可在移位之前设置一计数器,其初值为4。第4章循环与分支程序设计YY【例1】流程图初始化循环计数器开始BX循环左移一个数位把最右面的数位转换为ASCII是A~F?加上7显示相应的字符结束循环计数值=0?NNrotateprintit第4章循环与分支程序设计【例1】程序清单titlebin2hexdatasegmentbinnumdw0001001010101011Bdataendscodesegmentmainprocfarassumecs:code,ds:datastart:movax,datamovds,axmovbx,binnummovch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintitaddal,7hprintit:movdl,almovah,2int21hdecchjnzrotatemovax,4c00hint21hmainendpcodeendsendstart第4章循环与分支程序设计循环程序设计方法【例2】在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。1.显然应逐位对Y进行测试,如何做?2.在测试前应考虑Y为0的情况。3.测试结束的条件?4.其他:Y的地址如何表示?如何统计1的个数?第4章循环与分支程序设计Y【例2】流程图初始化计数器C=0开始Y=0?C=C+1COUNT←C结束NY=–?Y逻辑左移1位NYrepeatshiftexit第4章循环与分支程序设计【例2】程序清单titleP163-2datasegmentYEQU1234HnumberDWYaddrDWnumberCOUNTDW?dataendsprogramsegmentmainprocfarassumecs:program,ds:datastart:movax,datamovds,axmovbx,addrmovax,[bx]movcx,0repeat:testax,0FFFFHjzexitjnsshiftinccxshift:shlax,1jmprepeatexit:movCOUNT,cxmainendpprogramendsendstart第4章循环与分支程序设计循环程序设计方法【例3】在附加段中,有一个首地址为LIST和未经排序的字数组。在数组的第一个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数,则把它从数组中删除。第4章循环与分支程序设计查找(AX)的几种情况:1.未找到,不做任何处理;2.找到,则:【例3】解题思路低…………高LIST(1)是最后一个元素,直接修改数组长度即可;(2)否则,以该元素为起点,依次移动位于其前(高地址部分)的所有元素,然后修改数组长度。(AX)(DX)元素个数第4章循环与分支程序设计【例3】流程图Y查找(AX)开始后移一个字找到(AX)?修改数组长度结束N数组结束?是末元素?NYYNexitdec_cntnext_el由于在串查找指令中需要用到DI以指示目的串的位置,因此须先将DI保存,待必要时再恢复。delete第4章循环与分支程序设计【例3】程序清单del_ulprocnearcldpushdimovcx,es:[di]adddi,2repnescaswjedeletepopdijmpshortexitdelete:jcxzdec_cntnext_el:movbx,es:[di]moves:[di–2],bxadddi,2loopnext_eldec_cnt:popdidecwordptres:[di]exit:retdel_ulendp第4章循环与分支程序设计循环程序设计方法【例4】将正数N插入一个已整序的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END,其中所有数均为正数且已按递增的次序排列。第4章循环与分支程序设计插入N时的几种情况:1.N比所有的元素都大,则插入到末尾;2.N比所有的元素都小,则插入到首部;3.N处于中间某个所有元素K之前,则将N插入到K之前。【例4】解题思路低…………高ARRAY_HEADNARRAY_ENDK第4章循环与分支程序设计【例4】流程图(ARRAY_HEAD–2)←–1开始K前移一个字插入N结束K≤N?NY初始化基址寄存器SI修改SIcompareinsert第4章循环与分支程序设计【例4】程序清单datasegmentxdw?array_headdw3,5,15,23,37,49,52array_enddw105ndw32dataendsprognamsegmentmainprocfarassumecs:prognam,ds:datastart:movax,datamovds,axmovax,nmovarray_head–2,0ffffhmovsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2jmpshortcompareinsert:movarray_end[si+2],axmainendpprognamendsendstart【思考】可以从数组首部开始比较吗?如果可以,应该如何修改流程?第4章循环与分支程序设计循环程序设计方法【例5】设有字数组X和Y。X数组中有X1,…,X10;Y数组中有Y1,…,Y10。试编制程序计算:Z1=X1+Y1Z5=X5–Y5Z8=X8–Y8Z2=X2+Y2Z6=X6+Y6Z9=X9+Y9Z3=X3–Y3Z7=X7–Y7Z10=X10+Y10Z4=X4–Y4结果存入Z数组。第4章循环与分支程序设计此题实际上是求10个型如X±Y的表达式的值,最后将存入相应的Z单元中。【例5】解题思路1.为简化操作,利用表达式的特点,可使用循环;2.关键的问题显然是如何确定加法或减法;3.同时注意到X、Y和Z的下标相同,可用同一个变量或寄存器来表示其下标的变化。10987654321表达式++––+–––++加减法0011011100逻辑尺第4章循环与分支程序设计【例5】流程图初始化循环计数值(CX)←10开始X[BX]+Y[BX]结束测试逻辑尺相应位的值=0初始化下标(BX)←0Z[BX]←结果≠0X[BX]–Y[BX](BX)←(BX)+2(CX)=0NYnextsubtractresult从最低位开始,可使用SHR指令,借助CF的值以判断加、减符号。第4章循环与分支程序设计【例5】程序清单datasegmentxdw1,3,5,7,9,11,13,15,17,19ydw2,4,6,8,10,12,14,16,18,20zdw10dup(?)logic_ruleequ0000000011011100bdataendsprognamsegmentmainprocfarassumecs:prognam,ds:datastart:movax,datamovds,axmovcx,10movbx,0movdx,logic_rulenext:movax,x[bx]shrdx,1jcsubtractaddax,y[bx]jmpshortresultsubtract:subax,y[bx]result:movz[bx],axaddbx,2loopnextmainendpprognamendsendstart【思考】如果从高位开始测试,应如何修改程序?第4章循环与分支程序设计循环程序设计方法【例6】试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区(空格符不存入),直到接收到第二个空格符时退出程序。第4章循环与分支程序设计主要解决以下两个问题:【例6】解题思路1.如何从键盘输入字符?2.如何判断两个空格符(起始和结束)是不一样的?1.使用DOS系统功能调用(21H)的1号功能,输入的字符存放在AL中。2.可设置一标志变量FLAG。在接收字符之前设置为0,当接收了第一个空格符后设置为1。第4章循环与分支程序设计【例6】流程图初始化缓冲区首地址开始结束是第一个字符吗?置标志变量FLAG←0修改地址NY置标志变量FLAG←1存入缓冲区接收一个字符空格符?空格符?NNYYnext可根据FLAG的值进行判断:若FLAG=0,则为第一个输入的字符;否则不是。followexit第4章循环与分支程序设计【例6】程序清单datasegmentbufferdb80dup(?)flagdb?dataendsprognamsegmentmainprocfarassumecs:prognam,ds:datastart:movax,datamovds,axleabx,buffermovflag,0next:movah,01int21htestflag,01hjnzfollowcmpal,20hjnzexitmovflag,1jmpnextfollow:cmpal,20hjzexitmov[bx],alincbxjmpnextexit:movax,4c00hint21hmainendpprognamendsendstart第4章循环与分支程序设计分支程序设计分支程序设计第4章循环与分支程序设计分支程序的结构形式NY判定条件BA判定条件s1s2snIF-ELSE-THEN结构CASE结构…第4章循环与分支程序设计小结Summary小结程序的三种基本结构:顺序、循环和分支。循环程序设计包括:设置循环的初始状态、循环体和循环控制部分。分支程序一般根据条件码的值来使用条件转移指令实现。循环结构实质上是分支结构的一种特例。
本文标题:微机原理 第4章 循环与分支程序设计
链接地址:https://www.777doc.com/doc-4027193 .html