版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1第五章循環(huán)與分支程序設(shè)計編制一個匯編語言程序的步驟如下:分析題意,確定算法。根據(jù)算法畫出程序框圖。根據(jù)框圖編寫程序。上機調(diào)試程序。1〕2〕3〕4〕5.1循環(huán)程序設(shè)計循環(huán)程序可由以下三局部組成:1〕設(shè)置循環(huán)的初始狀態(tài):循環(huán)次數(shù)、指針設(shè)置、初值。2〕循環(huán)體。3〕循環(huán)控制:修改指針、改變次數(shù)、判斷條件。2根據(jù)題意,把BX中的內(nèi)容從左到右每四位為一組,用循環(huán)的方法在屏幕上顯示出來,循環(huán)記數(shù)值為4。循環(huán)體中:1〕從二進制到十六進制之間的轉(zhuǎn)化,2〕每個十六進字符的顯示,用DOS功能2 調(diào)用來實現(xiàn)??驁D如以下圖所示連接至框圖循環(huán)程序設(shè)計舉例例5.1:試編制一個程序把BX存放器內(nèi)的二進制數(shù)用十六進制數(shù)的形式在屏幕上顯示出來。BX=1100010101110010C5723循環(huán)程序設(shè)計過程框圖:取一個十六進數(shù)顯示次數(shù)-1=0?次數(shù):4結(jié)束初值循環(huán)體循環(huán)控制4取一個十六進制數(shù)BX1011010101110100B574574B74B54B57B574B5745顯示十六進數(shù)字符利用DOS功能調(diào)用(#2功能):DL←ASCII碼十六進數(shù)字符:0┅9,A┅F.ASCII碼:30H┅39H,41H┅46H算法:1,十六進數(shù)+30H
2,>39H?
3,YES再加07H
NO不操作
4,結(jié)束 6開始初始化循環(huán)記數(shù)值BX循環(huán)左移一個數(shù)位把最右邊的數(shù)位轉(zhuǎn)換為ASCⅡ
ASCⅡA~F?是顯示一個字符記數(shù)值-1=0?加上7YNN結(jié)束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指令,原因:循環(huán)移位指令要用到的CL與LOOP指令中用的CX存放器產(chǎn)生了沖突。解決:用CH存放器存放循環(huán)計數(shù)值,而用DECCH和JNZ兩條指令來完成LOOP指令的功能。這說明使用計數(shù)值控制循環(huán)結(jié)束也不是非用LOOP指令不可。9例5.3:在附加段中有一個首地址為LIST和未經(jīng)排序的字數(shù)組,在數(shù)組的第一個字中存放著該數(shù)組的長度,數(shù)組的首地址放在DI存放器中。AX存放器中存放著一個數(shù)。要求編制一程序:在數(shù)組中查找該數(shù),如找到此數(shù)那么把它從數(shù)組中刪除。這一程序應(yīng)首先查找數(shù)組中是否有〔AX〕,如沒有那么不對數(shù)組做任何處理就結(jié)束程序。如找到這一元素那么應(yīng)把數(shù)組中位于其下(指地址比該元素高)的元素上移一個字〔向低地址移動〕,并修改數(shù)組長度。如找到的元素位于數(shù)組末尾,那么不必移動數(shù)組的任何元素,只需修改數(shù)組長度即可。程序的結(jié)構(gòu)框圖如下圖程序的主體局部如下所示LinkLink下一頁10開始用串處理指令查找(AX)找到(AX)數(shù)組結(jié)束否?上移一個字NN是末元素?Y結(jié)束NY修改數(shù)組長度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我們采用冒泡排序算法從第一個字開始依次對相鄰兩個數(shù)進行比較,如次序?qū)δ敲床蛔鋈魏握{(diào)整;如次序不對那么這兩個數(shù)交換位置。下表說明了這種算法的例子:序號數(shù)比較遍數(shù)1238168432516843285843216851234585168432程序的結(jié)構(gòu)框圖如下圖多重循環(huán)程序設(shè)計例5.7有一個首地址為A的N字數(shù)組,請編制一程序使該數(shù)組中的數(shù)按從大到小的次序排序。14AIAI+1≥?(COUNT2)(COUNT2)-1(COUNT2)=0?(COUNT1)=0?I0(COUNT2)(COUNT1)開始(COUNT1)N-1NN結(jié)束Y(COUNT1)(COUNT1)-1YYI=I+1AIAI+1N15以下為程序的實現(xiàn):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分支程序設(shè)計5.2.1分支程序的結(jié)構(gòu)形式條件滿足?處理1處理2IF_THEN_ELSE結(jié)構(gòu)YN判斷條件處理1處理2處理n…CASE結(jié)構(gòu)185.2.2分支結(jié)構(gòu)設(shè)計方法一般利用條件轉(zhuǎn)移指令來產(chǎn)生。(1)單條件,測試某次運算結(jié)果(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)根據(jù)無符號數(shù)比較結(jié)果進行轉(zhuǎn)移(P89)A、JB(<)、JNAE(≯=)或JCJNB(≮)、JAE(≥)或JNCB、CF∨ZF=1:JBE(≤)、JNA(≯)C、CF∨ZF=0:JNBE(≮=)、JA(>)20(3)根據(jù)有符號數(shù)比較結(jié)果進行轉(zhuǎn)移(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轉(zhuǎn)移指令(P91)A、(CX)=0:JCXZB、(ECX)=0:JECXZ22例5.9:在附加段中,有一個按從小到大排列的無符號數(shù)數(shù)組,其首地址放在DI存放器中,數(shù)組中的第一個單元存放著數(shù)組長度。在AX中有一個無符號數(shù),要求在數(shù)組中查找(AX),如找到,那么使CF=0,并在SI中給出該元素在數(shù)組中的偏移地址;如未找到,那么使CF=1。思路:1、因為已排序,采用折半查找法以提高查找效率。2、先取中間元素,如果相等那么查找成功;如果比中間元素大,那么再取高半部的中間元素進行比較;如果比中間元素小,那么再取低半部的中間元素進行比較。3、重復2過程直到查找成功或最終未找到該數(shù)為止。4、順序查找法平均N/2次,折半法平均比較次數(shù)為log2N23長度為n的有序數(shù)組r中,查找元素k的折半查找算法:1、初始化被查找數(shù)組的首尾下標,low←1,high←n2、假設(shè)low>high,那么查找失敗,置CF=1,退出程序。否那么,計算中點:mid←(low+high)/23、k與中點元素r[mid]比較。假設(shè)k=r[mid],那么查找成功,程序結(jié)束;假設(shè)k<r[mid],那么轉(zhuǎn)步驟4;假設(shè)k>r[mid],那么轉(zhuǎn)步驟5。4、低半局部查找〔lower〕,high←mid-1,返回步驟2,繼續(xù)查找。5、高半局部查找〔higher〕,low←mid+1,返回步驟2,繼續(xù)查找。24SEARCH初始化low,highLow>high?SI←所查找元素的偏移地址EXITCF←1(SETC)>查找不成功=查找成功mid←(low+high)/2≤high←mid-1<LOWER(AX)=r[Mid]?COMPARElow←mid+1HIGHER>25以下為程序的實現(xiàn):;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跳躍表法可使用跳躍表法來實現(xiàn)CASE結(jié)構(gòu)。A、用變址尋址實現(xiàn)B、用間接尋址實現(xiàn)C、用基址變址尋址實現(xiàn)例5.10試根據(jù)AL存放器中哪一位為1(從低位到高位)把程序轉(zhuǎn)移到8個不同的程序分支中去。31A、用變址尋址實現(xiàn);*********************************************************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、用間接尋址實現(xiàn);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、用基址變址尋址實現(xiàn);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在實模式下發(fā)揮30386及后繼機型的優(yōu)勢5.1、5.2例子是基于8086的程序使用386及后繼基型的優(yōu)勢,將有利于提高編程質(zhì)量375.3.1充分利用高檔機的32位字長特性A、8086中分4段計算,每段一個字長,4次循環(huán)B、考慮進位,用ADC求和,進入循環(huán)前去除CFC、用INC修改地址指針,以免影響進位值(CF)例5.11如有兩個4字長(64位)數(shù)分別存放在DATA1和DATA2中,請用8086指令編寫一程序求出它們的和,并把結(jié)果存放于DATA3中。38程序?qū)崿F(xiàn).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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度廠房拆遷評估與補償實施流程合同4篇
- 2025年華師大版九年級科學上冊階段測試試卷
- 稅收政策與企業(yè)財務(wù)風險-洞察分析
- 二零二五版新型多功能腳手架租賃安裝服務(wù)合同3篇
- 2025年冀教版七年級地理下冊月考試卷含答案
- 2025年度金融科技產(chǎn)品研發(fā)合同范本:二零二五版區(qū)塊鏈技術(shù)應(yīng)用協(xié)議4篇
- 2025年外研版2024九年級科學下冊階段測試試卷
- 音樂制作產(chǎn)業(yè)鏈協(xié)同創(chuàng)新-洞察分析
- 二零二五年度古建筑群打蠟修繕合同4篇
- 2025年新世紀版八年級化學下冊階段測試試卷
- 巖土工程勘察課件0巖土工程勘察
- 《腎上腺腫瘤》課件
- 2024-2030年中國典當行業(yè)發(fā)展前景預測及融資策略分析報告
- 《乘用車越野性能主觀評價方法》
- 幼師個人成長發(fā)展規(guī)劃
- 2024-2025學年北師大版高二上學期期末英語試題及解答參考
- 動物醫(yī)學類專業(yè)生涯發(fā)展展示
- 批發(fā)面包采購合同范本
- 乘風化麟 蛇我其誰 2025XX集團年終總結(jié)暨頒獎盛典
- 2024年大數(shù)據(jù)分析公司與中國政府合作協(xié)議
- 一年級數(shù)學(上)計算題專項練習匯編
評論
0/150
提交評論