版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第四章程序設(shè)計的基本方法微機原理與接口技術(shù)
二月2324.4匯編語言程序設(shè)計方法4.4.1概述4.4.2分支程序設(shè)計4.4.3循環(huán)程序設(shè)計4.4.4子程序設(shè)計3設(shè)計一個程序要點:認(rèn)真分析問題的需求,選擇好解決方法;針對選定的算法,編寫高質(zhì)量的程序。一個高質(zhì)量的程序不僅要滿足設(shè)計的要求,而且還應(yīng)盡可能實現(xiàn)以下幾點:(1)結(jié)構(gòu)清晰、簡明、易讀、易調(diào)試。結(jié)構(gòu)好(2)執(zhí)行速度快。
效率高(3)占用存儲空間少。
資源少4.4.1概述4(1)分析問題,選擇合適的解題方法。(2)根據(jù)具體問題,確定輸入輸出數(shù)據(jù)的格式。(3)分配存貯區(qū)并給變量命名(包括分配寄存器)。(4)繪制程序的流程圖,即將解題方法和步驟用程序流程圖的形式表示出來。(5)根據(jù)流程圖編寫程序。(6)靜態(tài)檢查與動態(tài)調(diào)試。匯編語言程序設(shè)計的一般步驟5幾種框圖符號起始、終止框判斷框處理說明框子程序或過程調(diào)用框流向框連接框YN112126分支程序的特點:根據(jù)不同情況作出不同的處理,程序結(jié)構(gòu)分成了若干支路。分支的結(jié)構(gòu)形式:(1)(2)結(jié)構(gòu)特點:程序運行方向是向前的,條件確定,只能執(zhí)行分支中的一個。機器根據(jù)不同的情況作出判定,有選擇的執(zhí)行相應(yīng)的分支。這類程序稱之為分支程序。NY判定條件分支1分支2相當(dāng)于C語言的if、else…判定條件分支1分支2相當(dāng)于C語言的switch()分支n4.4.2分支程序設(shè)計7(1)分支由條件轉(zhuǎn)移指令產(chǎn)生,不同條件通過FLAGS的標(biāo)志位狀態(tài)(0或1)反映出來;(2)轉(zhuǎn)移指令不影響FLAGS的標(biāo)志位,可連續(xù)使用轉(zhuǎn)移指令,產(chǎn)生多個分支。例:可以產(chǎn)生如下的多個分支。CMPBYTEPTRARRAY[BX],0
JLEL1;小于等于0,轉(zhuǎn)移到L1┇分支1;大于0L1:JLNEXT;小于0,轉(zhuǎn)移到NEXT ┇分支2;等于0NEXT: ┇分支3;小于0問題:計算機怎樣判斷這些分支?8選擇合適的轉(zhuǎn)移指令;為每個分支安排出口;將分支中的公共部分盡量放到分支前或分支后的公共程序段中;流程圖、程序?qū)?yīng);調(diào)試時,逐分支檢查。分支程序設(shè)計要點9特點:(1)改變程序的執(zhí)行順序,即改變指令指針CS:IP的值;(2)不改變標(biāo)志位。4.4.2.1轉(zhuǎn)移指令設(shè)計分支程序的時候,關(guān)鍵在于根據(jù)需要,根據(jù)各個標(biāo)志位的不同狀態(tài),選用合適的轉(zhuǎn)移指令。10轉(zhuǎn)移指令條件轉(zhuǎn)移無條件轉(zhuǎn)移簡單條件轉(zhuǎn)移(10條)無符號數(shù)條件轉(zhuǎn)移(4)有符號數(shù)條件轉(zhuǎn)移(4)段內(nèi)直接、段間直接段內(nèi)間接、段間間接轉(zhuǎn)移指令的分類111無條件轉(zhuǎn)移指令格式:JMP標(biāo)號作用:①使CPU無條件地轉(zhuǎn)移到指令指明的目的地址處(標(biāo)號指定)執(zhí)行,轉(zhuǎn)移的范圍大,靈活性大;②不能構(gòu)成分支程序,但可將各分支的出口重新匯集在一起;CMPARRAY[BX],BYTEPTR0JLE L1;小于等于0
┇分支1;大于0
JMPGO1L1:JLNEXT;小于0
┇分支2;等于0JMPGO1NEXT:┇分支3;小于0GO1:;所有分支匯集12③某些條件轉(zhuǎn)移指令轉(zhuǎn)移的范圍超過它規(guī)定的范圍時,
用JMP搭橋。例:JLL1;小于0時轉(zhuǎn)L1┇L1:……可改為如下指令串:
JGEL0;大于等于0時轉(zhuǎn)L0
JMPL1;小于0時無條件轉(zhuǎn)L1L0:……┇L1:……1無條件轉(zhuǎn)移指令;超過了規(guī)定的轉(zhuǎn)移范圍13根據(jù)所處的位置分類:段內(nèi)轉(zhuǎn)移:要轉(zhuǎn)移的目的地址與指令本身在同一段;段間轉(zhuǎn)移:要轉(zhuǎn)移的目的地址與指令本身在不同段。根據(jù)尋址的方式分類:直接方式轉(zhuǎn)移:轉(zhuǎn)移到標(biāo)號。間接方式轉(zhuǎn)移:從存儲器或寄存器中得到轉(zhuǎn)移目的地的段地址和偏移地址。1無條件轉(zhuǎn)移指令14格式名稱功能JMP標(biāo)號段內(nèi)直接(IP)+位移量IPJMPOPD段內(nèi)間接(OPD)IPJMP[FARPTR
]標(biāo)號段間直接標(biāo)號的EAIP段首址CSJMPOPD段間間接(OPD)IP(OPD+2)CS1無條件轉(zhuǎn)移指令15例:JMPNEXT
——直接方式的無條件轉(zhuǎn)移指令JMPWORDPTR[BX]
——段內(nèi)間接轉(zhuǎn)移指令(16位段)JMPDWORDPTR[BX]——DS:[BX]指向的雙字單元中存放著EA和段首址(16位段)1無條件轉(zhuǎn)移指令例162條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令語句格式:
操作符標(biāo)號JX
標(biāo)號功能:如果轉(zhuǎn)移條件滿足,則標(biāo)號的EA(立即數(shù))→IP否則,執(zhí)行緊跟轉(zhuǎn)移指令之后的那條指令。172條件轉(zhuǎn)移指令例如:
┋JZNEXTINCAX┋NEXT:DECCX┋E9000140……49…0100H0103H0203HJZNEXTINCAXDECAX位移量=標(biāo)號EA–下一條指令EA有符號數(shù)位移量182簡單條件轉(zhuǎn)移特點:只能是段內(nèi)直接跳轉(zhuǎn),即:(1)用立即數(shù)改變IP的值,不改變CS。(2)為有符號數(shù),>0向前轉(zhuǎn),否則往回轉(zhuǎn)。(3)16位段:匯編程序計算的位移量在IF-128~127之間時,翻譯成8位有符號數(shù);
ELSEIF-32768~32767間時,翻譯成16位有符號數(shù);ELSEERROR。
19JZ/JE
ZF=1時,轉(zhuǎn)移JNZ/JNE
ZF=0時,轉(zhuǎn)移JS
SF=1時,轉(zhuǎn)移JNS
SF=0時,轉(zhuǎn)移JO
OF=1時,轉(zhuǎn)移JNO
OF=0時,轉(zhuǎn)移JC
CF=1時,轉(zhuǎn)移JNC
CF=0時,轉(zhuǎn)移JP/JPE
PF=1時,轉(zhuǎn)移JNP/JPO
PF=0時,轉(zhuǎn)移運算結(jié)果為0運算結(jié)果不為0運算結(jié)果為負(fù)數(shù)運算結(jié)果不為負(fù)數(shù)運算結(jié)果溢出運算結(jié)果沒有溢出運算產(chǎn)生進位借位運算沒有產(chǎn)生進位借位結(jié)果低8位1的個數(shù)為偶數(shù)結(jié)果低8為1的個數(shù)為奇數(shù)(1)簡單條件轉(zhuǎn)移指令20JZL1MOVAX,0……L1:ZF=1?MOVAX,0……NYL1:指令與流程圖的對應(yīng)關(guān)系21特點:①根據(jù)單一標(biāo)志位確定轉(zhuǎn)移方向;②當(dāng)超出轉(zhuǎn)移范圍時,可用JMP搭橋;③不能作段間轉(zhuǎn)移,不得作間接轉(zhuǎn)移;④
不影響FLAGS的標(biāo)志位,可連續(xù)使用轉(zhuǎn)移指令,產(chǎn)生多個分支。(1)簡單條件轉(zhuǎn)移指令22例:分析以下程序段,指出所完成的功能。
┋ MOVY,-1 MOVAX,X CMPAX,0 JEEXIT1 ADDAX,1000HJOOVERJNSEXIT1NEGAXEXIT1:MOVY,AXEXIT0:MOVAH,4CHINT21HOVER:LEADX,OVERFMOVAH,9INT21HJMPEXIT0DATASEGMENTXDWnYDW0OVERFDB0AH,0DH,‘ISoverflow!$’DATAENDS23無符號數(shù)條件轉(zhuǎn)移指令往往跟在比較指令之后;根據(jù)與無符號數(shù)特征有關(guān)條件標(biāo)志CF和ZF的組合決定轉(zhuǎn)移方向。
JA/JNBE
短標(biāo)號
當(dāng)CF=0且ZF=0時,轉(zhuǎn)移
JAE/JNB
短標(biāo)號當(dāng)CF=0或者ZF=1時,轉(zhuǎn)移JB/JNAE
短標(biāo)號當(dāng)CF=1且ZF=0時,轉(zhuǎn)移JBE/JNA
短標(biāo)號當(dāng)CF=1或者ZF=1時,轉(zhuǎn)移(2)無符號數(shù)條件轉(zhuǎn)移指令24①大于轉(zhuǎn)(即不小于且不等于轉(zhuǎn))JA/JNBE條件標(biāo)志:CF=0且ZF=0時轉(zhuǎn)移用于兩個無符號數(shù)a、b的比較,若a>b則實現(xiàn)轉(zhuǎn)移查看a,b兩數(shù)相減的結(jié)果:a-bCMPa,bCF(有沒有借位)ZF(相不相等)a>ba-b00a=ba-b01a<ba-b10一般用法:CMPOPD,OPS;(OPD)>(OPS)轉(zhuǎn)JAP(2)無符號數(shù)條件轉(zhuǎn)移指令25②大于或等于轉(zhuǎn)(即不低于轉(zhuǎn))JAE/JNB條件標(biāo)志:CF=0或ZF=1時轉(zhuǎn)移即(OPD)≥(OPS)時轉(zhuǎn),等價于指令JNC(兩數(shù)相等的時候ZF=1,那么CF=0)③小于或等于轉(zhuǎn)(即不高于轉(zhuǎn))JBE/JNA條件標(biāo)志:CF=1或ZF=0時轉(zhuǎn)移即(OPD)≤(OPS)時轉(zhuǎn),④小于轉(zhuǎn)(即不高于等于轉(zhuǎn))JB/JNAE條件標(biāo)志:CF=1且ZF=0時轉(zhuǎn)移即(OPD)<(OPS)轉(zhuǎn)等價于指令JC(因為CF=1,則ZF=0)(2)無符號數(shù)條件轉(zhuǎn)移指令26JG/JNLE
短標(biāo)號
當(dāng)SF=OF且ZF=0時,轉(zhuǎn)移JGE/JNL
短標(biāo)號
當(dāng)SF=OF或者ZF=1時,轉(zhuǎn)移JL/JNGE
短標(biāo)號
當(dāng)SF≠OF且ZF=0時,轉(zhuǎn)移JLE/JNG
短標(biāo)號當(dāng)SF≠OF或者ZF=1時,轉(zhuǎn)移(3)有符號數(shù)條件轉(zhuǎn)移指令27問題:CF和ZF標(biāo)志位是否可以作為判斷有符號數(shù)比較大小的標(biāo)志位?來看兩有符號數(shù)相減的結(jié)果:A-B,A,B取值有下列幾種情況:ABA-B取值CFZFSFOFA=B0100++A>B0000++A<B1010+-A-B無溢出0000+-A-B有溢出0011-+A-B無溢出1010-+A-B有溢出1001--A>B1000--A<B0010不能用CF、ZF的組合來判斷有符號數(shù)的大小,而用SF、OF、ZF組合。
28①
小于轉(zhuǎn)(或不大于等于轉(zhuǎn))JL/JNGE功能:SFOF=1(SF≠OF)且ZF=0轉(zhuǎn)(異或為1時轉(zhuǎn)移)。(兩數(shù)相減,差為負(fù)就說明(OPD)小于(OPS),為什么不僅僅判斷SF=1,用JS呢?沒有溢出時可以,有溢出的時候結(jié)果為正)設(shè)(OPD)-(OPS)有:SFOFSFOF000011101110結(jié)果為正無溢出,說明OPD>=OPS,不轉(zhuǎn)移結(jié)果為正有溢出,說明真正結(jié)果應(yīng)為負(fù)(OPD小),轉(zhuǎn)移結(jié)果為負(fù)無溢出,說明OPD<OPS,應(yīng)轉(zhuǎn)移結(jié)果為負(fù)有溢出,說明真正結(jié)果應(yīng)為正,不轉(zhuǎn)移(3)有符號數(shù)條件轉(zhuǎn)移指令29②大于等于轉(zhuǎn)(或不小于0轉(zhuǎn))JGE/JNL條件:SFOF=0或ZF=1轉(zhuǎn)移,即SF=OF或ZF=1轉(zhuǎn)。用于兩帶符號數(shù)比較,若A≥B則條件滿足,實現(xiàn)轉(zhuǎn)移。③大于轉(zhuǎn)(或不小于等于轉(zhuǎn))JG/JNLE條件:SFOF=0且ZF=0轉(zhuǎn),即SF=OF且ZF=0轉(zhuǎn)。④小于等于轉(zhuǎn)(或不大于0轉(zhuǎn))JLE/JNLE條件:SFOF=1或ZF=1轉(zhuǎn)移,即SF≠OF或ZF=1轉(zhuǎn)。(3)有符號數(shù)條件轉(zhuǎn)移指令30例1:請實現(xiàn):(AX)小于0轉(zhuǎn)A處執(zhí)行。CMPAX,0JLATESTAX,8000HJNZAANDAX,AXJLAADDAX,0JLASUBAX,0JLAORAX,0JLA31例2:(AX)+(-2)=>AX,如果結(jié)果小于0轉(zhuǎn)L。ADDAX,-2JLL問題:可以用JS嗎?No18001H-327670FFFEH-2
7FFFH
此例中不能用JS,因為當(dāng)(AX)=8001H時(即-7FFFH的補碼)說明兩負(fù)數(shù)相加結(jié)果為正,產(chǎn)生溢出,僅用JS不發(fā)生轉(zhuǎn)移。而此時OF=1、SF=0,SFOF=1,發(fā)生轉(zhuǎn)移。該例說明JL本質(zhì)上是判斷運算結(jié)果是否為負(fù),而不僅僅是(OPD)<(OPS).可見,對于有符號數(shù),只用一個標(biāo)志位來判斷是否轉(zhuǎn)移往往會造成錯誤。要用有符號數(shù)條件轉(zhuǎn)移指令,除非是和0進行比較。32例3:清除數(shù)據(jù)段中EA為8002H~2000H號字中的內(nèi)容為0。MOVBX,8002HL:MOVWORDPTR[BX],0SUBBX,2CMPBX,2000HJAEL;問題:此處用JGE會怎樣?JNB呢?不能循環(huán),因為清第一個字后,EA修改為8000H,為負(fù),跳出循環(huán)。地址是一種無符號數(shù)。33根據(jù)以上各條件指令的選用,可總結(jié)如下:1.簡單轉(zhuǎn)移指令用在TEST、CMP、AND、OR后面,測試某一標(biāo)志位是否滿足條件;用在算術(shù)運算指令后,測試某一標(biāo)志位是否滿足條件;在循環(huán)計數(shù)控制中,用來判斷循環(huán)是否結(jié)束(JZ/JE/JNZ/JNE)。2.有符號數(shù)的條件轉(zhuǎn)移指令用在CMP后面,比較帶符號數(shù)大小,確定轉(zhuǎn)移方向;用在算術(shù)運算指令后面,根據(jù)結(jié)果正負(fù)確定轉(zhuǎn)移方向;用在OR,AND后面,根據(jù)結(jié)果正負(fù)確定轉(zhuǎn)移方向。3.無符號數(shù)的條件轉(zhuǎn)移指令用作無符號數(shù)的比較---地址的比較、ASCII碼比較;用于循環(huán)控制。34例1:從鍵盤輸入0~9中任一自然數(shù),求其立方值。若輸入的字符不是0~9中的數(shù)字,則顯示“InputError!”從鍵盤輸入一個字符是0~9中的某一個數(shù)求其立方顯示輸入錯結(jié)束Y開始N35從鍵盤輸入一個字符是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)生黨課課件教學(xué)課件
- 神經(jīng)內(nèi)科電場治療方案
- 新人入職培訓(xùn)規(guī)章制度
- 糖尿病傷口處理
- 眼耳鼻喉科護理查房
- 老年病科科普講解大賽
- 博物館奇案教案反思
- 化學(xué)肥料說課稿
- 好玩的竹梯說課稿
- 過秦論的說課稿
- 學(xué)校財務(wù)處理程序制度
- 塔里木河流域胡楊林生態(tài)恢復(fù)成效評估
- 環(huán)境保護Theenvironmentalprotection英語演講課件
- 2023年事故序列模型介紹
- 兒童免疫性疾病課件
- 行為金融學(xué)中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
- 中圖版八年級地理上冊《世界氣候》復(fù)習(xí)課件
- 家族財富傳承法商
- 無損檢測通用作業(yè)指導(dǎo)書
- 2023年中考語文復(fù)習(xí):150個文言實詞-課件(共183張PPT)
- 蛋糕經(jīng)濟學(xué):如何實現(xiàn)企業(yè)商業(yè)價值和社會責(zé)任的雙贏
評論
0/150
提交評論