版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第五章循环与分支程序设计编制一个汇编语言程序的步骤如下:分析题意,确定算法。根据算法画出程序框图。根据框图编写程序。上机调试程序。1〕2〕3〕4〕5.1循环程序设计循环程序可由以下三局部组成:1〕设置循环的初始状态:循环次数、指针设置、初值。2〕循环体。3〕循环控制:修改指针、改变次数、判断条件。2根据题意,把BX中的内容从左到右每四位为一组,用循环的方法在屏幕上显示出来,循环记数值为4。循环体中:1〕从二进制到十六进制之间的转化,2〕每个十六进字符的显示,用DOS功能2 调用来实现。框图如以下图所示连接至框图循环程序设计举例例5.1:试编制一个程序把BX存放器内的二进制数用十六进制数的形式在屏幕上显示出来。BX=1100010101110010C5723循环程序设计过程框图:取一个十六进数显示次数-1=0?次数:4结束初值循环体循环控制4取一个十六进制数BX1011010101110100B574574B74B54B57B574B5745显示十六进数字符利用DOS功能调用(#2功能):DL←ASCII码十六进数字符:0┅9,A┅F.ASCII码:30H┅39H,41H┅46H算法:1,十六进数+30H
2,>39H?
3,YES再加07H
NO不操作
4,结束 6开始初始化循环记数值BX循环左移一个数位把最右边的数位转换为ASCⅡ
ASCⅡA~F?是显示一个字符记数值-1=0?加上7YNN结束Y返回例题7下面是以BIN2HEX.ASM为文件名建立的源文件prognamsegmentmainprocfarassumecs:prognamstart:
;setupstackforreturnpushdsxorax,axpushax
:mainpartofprognammovch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintitaddal,7h;definecodesegment;startingexecutionaddr;saveolddatasegment;putzeroinAX;savezeroonstack;numberofdigits;setcountto4bit;leftdigittoright;movetoAL;maskoffleftdigit;converthextoASCⅡ;isit>9?;jumpifdigit=0to9;digitisAtoF8printit:movdl,almovah,2int21hdecchjnzrotateretmainendpprognamendsendstart;putASCⅡcharinDL;displayoutputfunction;callDOS;done4digits?;notyet;returntoDOS;endofmainpartofprog;endofsegment;endofassembly
程序中,没有用LOOP指令,原因:循环移位指令要用到的CL与LOOP指令中用的CX存放器产生了冲突。解决:用CH存放器存放循环计数值,而用DECCH和JNZ两条指令来完成LOOP指令的功能。这说明使用计数值控制循环结束也不是非用LOOP指令不可。9例5.3:在附加段中有一个首地址为LIST和未经排序的字数组,在数组的第一个字中存放着该数组的长度,数组的首地址放在DI存放器中。AX存放器中存放着一个数。要求编制一程序:在数组中查找该数,如找到此数那么把它从数组中删除。这一程序应首先查找数组中是否有〔AX〕,如没有那么不对数组做任何处理就结束程序。如找到这一元素那么应把数组中位于其下(指地址比该元素高)的元素上移一个字〔向低地址移动〕,并修改数组长度。如找到的元素位于数组末尾,那么不必移动数组的任何元素,只需修改数组长度即可。程序的结构框图如下图程序的主体局部如下所示LinkLink下一页10开始用串处理指令查找(AX)找到(AX)数组结束否?上移一个字NN是末元素?Y结束NY修改数组长度YBack11;DeletethevalueinAXfromanunorderedlistintheextra;segment,ifthatvalueisinthelist.;Input(DI)=startingaddressofthelist.;Firstlocationofthelist=Lengthoflist(words)procfarcldpushdimovcx,es:[di]adddi,2repnescaswjedeletepopdijmpshortexit
del_ul;makeDF=0,toscanforword;savestartingaddress;fetchelementcount;makeDIpointto1stdatael;valueinthelist?;Ifso,godeleteit;otherwise,exit;thefollowinginstructiondeleteanelementfromthelistasfollows:;(1)iftheelementliesattheendofthelist,deleteitbydecreasing;theelementcountby1.12;(2)otherwise,deletetheelementbymovingallsubsequentelementsupbyoneposition.jcxzdec_cntmovbx,es:[di]moves:[di-2],bxadddi,2loopnext_elpopdidecwordptres:[di]retendpdelete:next_el:
dec_cnt:exit:del_ul;if(CX)=0,deletelastele;moveoneeleupinlist;pointtonextele;repeatuntillallelemoved;decreaseelecountby1;exit;endofmainpartofprogBack13我们采用冒泡排序算法从第一个字开始依次对相邻两个数进行比较,如次序对那么不做任何调整;如次序不对那么这两个数交换位置。下表说明了这种算法的例子:序号数比较遍数1238168432516843285843216851234585168432程序的结构框图如下图多重循环程序设计例5.7有一个首地址为A的N字数组,请编制一程序使该数组中的数按从大到小的次序排序。14AIAI+1≥?(COUNT2)(COUNT2)-1(COUNT2)=0?(COUNT1)=0?I0(COUNT2)(COUNT1)开始(COUNT1)N-1NN结束Y(COUNT1)(COUNT1)-1YYI=I+1AIAI+1N15以下为程序的实现:Datareasegment;definedatasegmentnEQU20adwndup(?)DatareaendsPrognamsegment;definecodesegment;mainprocfarassumecs:prgnam,ds:datareastart:;setupstackforreturnpushdssubax,axpushax;setdsregistertocurrentdatasegmentmovax,datareamovds,ax;mainpartofprognam;startingexecutionaddress;saveolddatasegment;putzeroinAX;saveitonstack;datareasegmentaddr;intoDSregister16movdecmovmovmovcmpjgexchgmovaddloopmovloopretendpendstartcx,ncxdi,cxbx,0ax,a[bx]ax,a[bx+2]continueax,a[bx+2]a[bx],axbx,2loop2cx,diloop1loop1:loop2:continue:mainPrognamends;setcount1;ton-1;savecount1indi;clearbx;loada(i)intoaxandcompare;witha(i+1);swapif;a(i)<a(i+1)andstoregreater;number;incrementindex;ifnottheendofapass,repeat;restorecount1fortheeitherloop;ifnotthefinalpass,repeat;returntodos;endofmainpartofprognam;endofcodesegment;endassembly175.2分支程序设计5.2.1分支程序的结构形式条件满足?处理1处理2IF_THEN_ELSE结构YN判断条件处理1处理2处理n…CASE结构185.2.2分支结构设计方法一般利用条件转移指令来产生。(1)单条件,测试某次运算结果(P88)A、ZF,0或相等:JZ(JE)、JNZ(JNE)B、SF,符号:JS、JNSC、OF,溢出:JO、JNOD、PF,奇偶位:JP、JNPE、CF,进位:JB(<)、JNAE(≯=)或JCJNB(≮)、JAE(≥)或JNC19(2)根据无符号数比较结果进行转移(P89)A、JB(<)、JNAE(≯=)或JCJNB(≮)、JAE(≥)或JNCB、CF∨ZF=1:JBE(≤)、JNA(≯)C、CF∨ZF=0:JNBE(≮=)、JA(>)20(3)根据有符号数比较结果进行转移(P89)A、SF∧OF=1:JL(<)、JNGE(≯=)B、SF∧OF=0:JNL(≮)、JGE(≥)C、(SF∧OF)∨ZF=1:JLE(≤)、JNG(≯)D、(SF∧OF)∨ZF=0:JNLE(≮=)、JG(>)21(4)测试CX或ECX的值为0转移指令(P91)A、(CX)=0:JCXZB、(ECX)=0:JECXZ22例5.9:在附加段中,有一个按从小到大排列的无符号数数组,其首地址放在DI存放器中,数组中的第一个单元存放着数组长度。在AX中有一个无符号数,要求在数组中查找(AX),如找到,那么使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,那么使CF=1。思路:1、因为已排序,采用折半查找法以提高查找效率。2、先取中间元素,如果相等那么查找成功;如果比中间元素大,那么再取高半部的中间元素进行比较;如果比中间元素小,那么再取低半部的中间元素进行比较。3、重复2过程直到查找成功或最终未找到该数为止。4、顺序查找法平均N/2次,折半法平均比较次数为log2N23长度为n的有序数组r中,查找元素k的折半查找算法:1、初始化被查找数组的首尾下标,low←1,high←n2、假设low>high,那么查找失败,置CF=1,退出程序。否那么,计算中点:mid←(low+high)/23、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,继续查找。24SEARCH初始化low,highLow>high?SI←所查找元素的偏移地址EXITCF←1(SETC)>查找不成功=查找成功mid←(low+high)/2≤high←mid-1<LOWER(AX)=r[Mid]?COMPARElow←mid+1HIGHER>25以下为程序的实现:;SEARCH_HALF-EX5_9;Searchanorderedlistintheextrasegmentfortheword;valuecontainedinAX;Inputs:EX:DI=startingaddressofthelist;Firstlocation=Lengthoflist(words);Results:Ifthevalueisinthelist,; CF=0; SI=Offsetofmatchingelement,; Ifthevalueisnotinthelist,; CF=1; SI=Offsetoflastelementcompared;**************************************************************dseg segment ;definedatasegment LISTdw 12,11,22,33,44,55,66,77,88,99,111,222,333 low_idxdw? high_idxdw? AX_VALUEdw55dsegends26;**************************************************************cseg segment ;definecodesegment;------------------------------------------------------------------------- assumecs:cseg,ds:dseg,es:dseg b_searchprocnear push ds ;savecaller'sds push ax mov ax,dseg ;initializeDS mov ds,ax mov es,ax mov ax,AX_VALUEmovdi,offsetLIST;FindoutifAXliesbeyondtheboundariesofthelist cmp ax,es:[di+2] ;searchvalue≤firstel.? ja chk_last ;no,gochecklastel. lea si,es:[di+2] ;yes,fetchaddroffirstel. je exit ;ifvalue=1stel.,exit stc ;ifvalue<1stel.,setCF jmp exit ;andthenexit27chk_last: mov si,es:[di] ;siisthenumberofel.s,pointtolastel. shl si,1;(si)=(si)*2 add si,di;gettheaddressoflastel. cmp ax,es:[si] ;search value>=lastel.? jb search ;no,gosearchlist je exit ;yes,exitifvalue=lastel. stc jmp exit ;andthenexit;searchforvaluewithinthelistsearch: mov low_idx,1 ;fetchindex mov bx,es:[di] mov high_idx,bx mov bx,di28mid: mov cx,low_idx ;calculatemiddlepoint mov dx,high_idx cmp cx,dx ja no_match add cx,dx shr cx,1;(cx)=(cx)/2 mov si,cx shl si,1 ;calculatenextsearchaddrcompare: cmp ax,es:[bx+si] ;searchvaluefound? je exit ;ifso,exit ja higher ;otherwise,findcorrecthalf;Theseinstructionsareexecutedifthesearchvalueis;lowerinthelist dec cx mov high_idx,cx jmp mid29higher: inc cx mov low_idx,cx jmp midno_match: stc ;ifso,setCF;Followingareexitinstructionsexit: pop ds ret ;andexitb_searchendp;------------------------------------------------------------------------cseg ends ;endofcodesegment;************************************************************** end ;endofassembly
305.2.3跳跃表法可使用跳跃表法来实现CASE结构。A、用变址寻址实现B、用间接寻址实现C、用基址变址寻址实现例5.10试根据AL存放器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支中去。31A、用变址寻址实现;*********************************************************branch_addressessegment ;definedatasegment branch_table dwroutine_1 dwroutine_2 dwroutine_3 dwroutine_4 dwroutine_5 dwroutine_6 dwroutine_7 dwroutine_8branch_addresses;*********************************************************32procedure_selectsegment ;definecodesegment;---------------------------------------------------------main procfar ;mainpartofprogram assumecs:procedure_select,ds:branch_addressesstart: ;startingexecutionaddress
;setupstackforreturn push ds ;saveolddatasegment sub bx,bx ;putseroinBX push bx ;saveitonstack
;setDSregistertocurrentdatasegment mov bx,branch_addresses ;datasegmentaddr mov ds,bx ;intoDSregister;MAINPARTOFPROGRAMGOESHERE cmp al,0 ;thistestassuresthatsome
;bitofALhasbeensetby je continue_main_line;earlierinstructionto;specifyaroutime mov si,0L: shr al,1 ;putsleast_significantbit
;ofALintotheCF jnb not_yet ;ifCF=0,theonbitinAL33
jmp branch_table[si]
;ifCF=1,thencontrolistransferrednot_yet: add si,typebranch_table ;ifnotransfer,then, ;thebitthatisonhasnot;yetbeenfound,soSIissettopointtothenextentryinthe;addresstablebyadding2 jmpL ;jumptoLtoshiftandretestcontinue_main_line:
;wereachhereonlyifnobitwassettoindicate … ;adesiredroutineroutine_1: …routine_2: …… ret ;exitmain endp;endofmainpartofprog.;-----------------------------------------------------------procedure_selectends;endofcodesegment;********************************************************* endstart ;endofassembly34B、用间接寻址实现;MAINPARTOFPROGRAMGOESHERE cmp al,0 ;thistestassuresthatsome ;bitofALhasbeensetby je continue_main_line ;earlierinstructionto ;specifyaroutine lea bx,branch_table ;BXsettolocationholdingL: shr al,1 ;putsleast_significantbit
;ofALintotheCF jnb not_yet ;ifCF=0,theonbitinAL
;hasnotyetbeenfound
jmp wordptr[bx]
;ifCF=1,thecontrolistransferrednot_yet: add bx,typebranch_table;ifnottransfer,then ;thebitthatisonhasnot ;yetbeenfound,soBXis ;settopointtothe ;nextentryinthe ;addresstablebyadding2 jmpL;jumptoLtoshiftandretestcontinue_mainline:35C、用基址变址寻址实现;MAINPARTOFPROGRAMGOESHERE cmp al,0 ;thistestassuresthatsome ;bitofALhasbeensetby
je continue_main_line ;earlierinstructionto ;specifyaroutine lea bx,branch_table ;BXsettolocationholding ;addressoffirstroutine mov si,7*typebranch_table ;pointsinitiallyto ;lastsuchentryinlist mov cx,8 ;loopcounterallowing ;shiftmaximumL: shr al,1 ;shifthigh_orderALbitintoCF jnb not_yet ;ifCF=0,routinerepresented ;bythatbitnotdesired
jmp wordptr[bx][si]
;ifCF=1,transferto;procedurerepresentedbymostrecentbittestednot_yet:sub si,typebranch_table ;adjustindexregister;topointto"next"branchaddress loopLcontinue_mainline:365.3在实模式下发挥30386及后继机型的优势5.1、5.2例子是基于8086的程序使用386及后继基型的优势,将有利于提高编程质量375.3.1充分利用高档机的32位字长特性A、8086中分4段计算,每段一个字长,4次循环B、考虑进位,用ADC求和,进入循环前去除CFC、用INC修改地址指针,以免影响进位值(CF)例5.11如有两个4字长(64位)数分别存放在DATA1和DATA2中,请用8086指令编写一程序求出它们的和,并把结果存放于DATA3中。38程序实现.modelsmall.datadata1 dq 123456789abcdefhdata2 dq 0fedcba987654321hdata3 dq ?.codestart: mov ax,@data mov ds,ax clc ;setCF=0
lea si,data1 lea di,data2 lea bx,data3 mov cx,439back: mov ax,[si] adc ax,[di] mov [bx],ax inc si inc si inc di inc di inc bx inc bx loopback mov ax,4c00h ;gobacktoDOS int 21h endstart40利用386及后继机型32字长的特点来计算.modelsmall.data data1 dq 123456789abcdefh data2 dq 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年霞浦县带编教师招聘考试备考题库及答案解析
- 2026年绥中县带编教师招聘笔试备考试题及答案解析
- 2026年肇源县带编教师招聘考试模拟试题及答案解析
- 2026年肇州县带编教师招聘考试备考试题及答案解析
- 2026年吉木乃县带编教师招聘考试备考题库及答案解析
- 2026年皋兰县带编教师招聘笔试模拟试题及答案解析
- 2026年贞丰县带编教师招聘考试参考题库及答案解析
- 2026年长宁县带编教师招聘考试模拟试题及答案解析
- 嘉兴供销冷链发展有限公司2026年度招聘5人笔试备考试题及答案详解
- 2026年罗田县带编教师招聘笔试备考试题及答案解析
- 2026崂山国家实验室招聘(山东)笔试备考试题及答案解析
- 地铁建设规范
- 2026年全国爱国卫生月主题:宜居靓家园、健康新生活
- 除氧器系统培训课件
- 深圳网格管理制度规定(3篇)
- 血透失衡综合征的护理课件
- 中学科二 - 主观题80个核心考点
- 基坑降水井施工应急预案
- 低压配电室故障排除课件
- 2025-2026学年教科版二年级体育全一册教案
- 电焊工技术操作技能评分细则
评论
0/150
提交评论