微機原理與接口技術(shù)(樓順天)-第4章5_第1頁
微機原理與接口技術(shù)(樓順天)-第4章5_第2頁
微機原理與接口技術(shù)(樓順天)-第4章5_第3頁
微機原理與接口技術(shù)(樓順天)-第4章5_第4頁
微機原理與接口技術(shù)(樓順天)-第4章5_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

本教案內(nèi)容第4章

匯編語言程序設(shè)計匯編語言程序設(shè)計基礎(chǔ)源程序的匯編、連接與調(diào)試分支程序設(shè)計技術(shù)循環(huán)程序設(shè)計技術(shù)子程序設(shè)計技術(shù)綜合程序設(shè)計示例4.5

子程序設(shè)計技術(shù)

利用子程序可以大大地簡化匯編語言的程序設(shè)計。宏指令是以存儲空間作為代價提高執(zhí)行速度的,而子程序是以降低執(zhí)行速度來節(jié)省存儲空間的。建議在多次調(diào)用較短的程序時使用宏指令,在多次調(diào)用較長的程序時使用子程序。在子程序設(shè)計過程中,有幾個問題需要特別注意:一:主程序與子程序之間的參數(shù)傳遞在設(shè)計子程序時,需要從主程序獲取數(shù)據(jù),這種數(shù)據(jù)稱為入口參數(shù),同時子程序執(zhí)行后可能有結(jié)果數(shù)據(jù)要送給主程序,這種數(shù)據(jù)稱為出口參數(shù)。主程序與子程序之間對入口參數(shù)和出口參數(shù)的傳遞有三種方式:(一)寄存器參數(shù)傳遞方式(二)存儲單元參數(shù)傳遞方式(三)堆棧參數(shù)傳遞方式4.5

子程序設(shè)計技術(shù)

二、子程序說明文件子程序為功能獨立的程序段,而且會為主程序多次調(diào)用。因此為方便使用,在編寫并調(diào)試好子程序后,應(yīng)該及時給子程序編寫相應(yīng)的說明文件,其內(nèi)容應(yīng)該包含下列6個部分:1、子程序名2、子程序所完成的功能3、入口參數(shù)及其傳遞方式4、出口參數(shù)及其傳遞方式5、子程序用到的寄存器6、典型例子4.5

子程序設(shè)計技術(shù)

這里,子程序用到的寄存器是指執(zhí)行子程序后可能被改變的寄存器,子程序中應(yīng)該盡量少改變幾個寄存器的內(nèi)容,為此,需要在子程序的入口處對某些寄存器進行保護,而在出口處再恢復(fù)其內(nèi)容,這樣,雖然子程序中使用了這些寄存器,但從入口到出口看,這些寄存器的內(nèi)容并沒有改變,它們就不屬于子程序用到的寄存器。在主程序設(shè)計時,就不必關(guān)心這些寄存器的內(nèi)容。4.5

子程序設(shè)計技術(shù)

三、子程序的嵌套在子程序中還可以調(diào)用其他的子程序,這時就形成的子程序的嵌套如圖4-5。采用嵌套子程序設(shè)計,可以使程序結(jié)構(gòu)模塊化,便于編程和應(yīng)用。但子程序的嵌套級數(shù)不是越多越好,而是應(yīng)該適可而止,嵌套級數(shù)越多,出錯的可能性就越多,這樣不利于程序設(shè)計。

在設(shè)計嵌套子程序時,編程時可以從上到下設(shè)計,調(diào)試時應(yīng)該由下至上進行,因為只有處于下層的子程序正確后,才能對上層的子程序進行調(diào)試。圖4-5多層子程序嵌套示意圖4.5

子程序設(shè)計技術(shù)

四、遞歸子程序在嵌套調(diào)用中,被調(diào)用的子程序為其他子程序。當(dāng)被調(diào)用的子程序是其自身時,就形成了遞歸調(diào)用,這種子程序稱為遞歸子程序。不是所有的子程序都可以遞歸調(diào)用的,設(shè)計遞歸子程序是一個較為復(fù)雜的過程,遞歸子程序必須具備兩個基本條件:(1)采用堆棧參數(shù)傳遞方式,這樣才能保證本次調(diào)用與下次調(diào)用采用不同的參數(shù),即每次調(diào)用給入口和出口參數(shù)都分配不同的存儲區(qū)域。(2)必須設(shè)定遞歸結(jié)束條件。設(shè)計遞歸子程序還應(yīng)該有清晰的編程思路和明確的程序結(jié)構(gòu)。設(shè)計遞歸子程序可以降低程序?qū)Υ鎯θ萘啃枨螅F(xiàn)在計算機的存儲容量已經(jīng)不是問題了,因此,用戶應(yīng)該盡量避免采用遞歸子程序。4.5

子程序設(shè)計技術(shù)

五、可再入性子程序在執(zhí)行子程序期間,CPU可能會因為有中斷請求而轉(zhuǎn)向中斷服務(wù)子程序,如果在中斷服務(wù)程序中又調(diào)用了該子程序,這樣就形成了如圖4.6所示的情況(①②③為執(zhí)行流程),子程序的一次調(diào)用還沒有執(zhí)行完成,又調(diào)用了該子程序,如果這兩次調(diào)用都能夠得到正確的結(jié)果,則該子程序稱為可再入性子程序。4.5

子程序設(shè)計技術(shù)

可再入性子程序也需要采用堆棧參數(shù)傳遞方式,而且設(shè)計過程較為復(fù)雜,因此建議用戶盡量避免設(shè)計可再入性子程序。這里給出一種回避的較好方式,即將原本要求為可再入性的子程序復(fù)制出一份,專門供中斷服務(wù)子程序調(diào)用,這樣可以巧妙地回避可再入性子程序的設(shè)計。

例4.9編寫子程序?qū)崿F(xiàn)給緩沖區(qū)BUF中的一組字符的ASCII碼加上偶校驗位。解:每個字符的ASCII碼只占用7位二進制數(shù),其最高位為0。我們可以根據(jù)這7位二進制數(shù)中“1”的個數(shù),給最高位加上“0”或“1”,使得一個字節(jié)內(nèi)容的“1”個數(shù)為偶數(shù),這稱為偶檢驗。4.5

子程序設(shè)計技術(shù)

設(shè)計的子程序(SETEVEN)用于對BUFFER中的字符ASCII碼加上偶檢驗位,其入口參數(shù)為:DI(緩沖區(qū)首地址,默認(rèn)為DS段),(CX)緩沖區(qū)長度;出口參數(shù):無(實際上是緩沖區(qū)的內(nèi)容);用到的寄存器:無。匯編語言程序如下:STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDS N=22DATASEGMENTBUFFERDB'xidianuniversity2006'DATAENDSCODESEGMENT4.5

子程序設(shè)計技術(shù)

ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOP MOVCX,N LEADI,BUFFER CALLSETEVENMOVAH,4CH;返回DOSMOVAL,0INT21H4.5

子程序設(shè)計技術(shù)

SETEVENPROCNEAR ;加上偶校驗子程序 PUSHAX PUSHBX PUSHCX PUSHDISETEVEN1: MOVAL,[DI] CALLCOUNTBYTE ANDBL,01H ;測試“1”的個數(shù)是否為偶數(shù) JZSETEVEN2 ORAL,80H ;最高位置入“1” MOV[DI],AL4.5

子程序設(shè)計技術(shù)

SETEVEN2: INCDI LOOPSETEVEN1 POPDI POPCX POPBX POPAX RETSETEVEN ENDPCOUNTBYTEPROCNEAR ;子程序:統(tǒng)計一個字節(jié)內(nèi)容中“1”的個數(shù)PUSHAX PUSHCX MOVCX,8 XORBL,BL4.5

子程序設(shè)計技術(shù)

COU1: SHRAL,1 ADCBL,0 LOOPCOU1 POPCXPOPAXRETCOUNTBYTEENDPCODE ENDS ENDSTART這里調(diào)用了統(tǒng)計一個字節(jié)內(nèi)容中“1”的個數(shù)的子程序COUNTBYTE,其入口參數(shù)為AL,出口參數(shù)為BL,子程序用到的寄存器為BL。

4.5

子程序設(shè)計技術(shù)

例4.10編寫子程序TRANS16TO10,將16位二進制數(shù)(AX)轉(zhuǎn)換成十進制數(shù),并保存在指定的緩沖區(qū)中。解:16位二進制數(shù)x至多可以用5位十進制數(shù)進行表示,其轉(zhuǎn)換算法和步驟為:●將x除以10得到商x1和余數(shù)y1,其中y1就是轉(zhuǎn)換結(jié)果的最低位(個位);●將x1再除以10得到商x2和余數(shù)y2,其中y2就是轉(zhuǎn)換結(jié)果的十位;●依次類推,得到y(tǒng)3、y4和y5,分別為轉(zhuǎn)換結(jié)果第三~五位??梢钥隙?,x5=0,y5位為轉(zhuǎn)換結(jié)果的最高位。設(shè)計的子程序TRANS16TO10,其入口參數(shù):AX(待轉(zhuǎn)換的數(shù)據(jù)),DI(轉(zhuǎn)換結(jié)果存儲區(qū)域首地址),出口參數(shù):存儲區(qū)域的內(nèi)容。4.5

子程序設(shè)計技術(shù)

匯編語言子程序如下:TRANS16TO10 PROCNEAR PUSHAX PUSHBX PUSHCX PUSHDX PUSHDI MOVBX,10 MOVCX,5TRANS1: XORDX,DX DIVBX

MOV[DI],DL INCDI LOOPTRANS14.5

子程序設(shè)計技術(shù)

POPDI POPDX POPCX POPBX POPAX RETTRANS16TO10 ENDP例4.11編寫子程序DISPAXD,將16位二進制數(shù)(AX)轉(zhuǎn)換成十進制數(shù),并在顯示在屏幕上。解:利用上例將AX轉(zhuǎn)換成5個十進制數(shù)位,然后利用INT21H的02號功能進行顯示,這時需要將十進制的數(shù)位變換成相應(yīng)的ASCII碼。設(shè)計出的子程序DISPAXD,其入口參數(shù):AX,出口參數(shù):屏幕顯示,這里要用到一個5字節(jié)的臨時存儲單元,用于存放十進制的數(shù)位。4.5

子程序設(shè)計技術(shù)

匯編語言程序如下:STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTDECIMALDB5DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AX4.5

子程序設(shè)計技術(shù)

MOVAX,STACKMOVSS,AXLEASP,TOPMOVAX,23456CALLDISPAXDMOVAH,4CH;返回DOS操作系統(tǒng)MOVAL,0INT21HDISPAXD PROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHDI4.5

子程序設(shè)計技術(shù)

LEADI,DECIMAL

CALLTRANS16TO10MOVCX,5LEADI,DECIMAL+4MOVAH,2DISPAXD2:MOVDL,[DI]ADDDL,30HDECDIINT21HLOOPDISPAXD2POPDIPOPDXPOPCX4.5

子程序設(shè)計技術(shù)

POPBXPOPAXRETDISPAXDENDPTRANS16TO10PROCNEAR;內(nèi)容參見例4.10TRANS16TO10ENDPCODEENDSENDSTART例4.12編寫子程序?qū)崿F(xiàn):將輸入緩沖區(qū)中以ASCII碼表示的十進制數(shù)轉(zhuǎn)換成16位二進制數(shù)。緩沖區(qū)的第一個字節(jié)表示位數(shù),后續(xù)單元存儲十進制數(shù),高位在前,低位在后。如果轉(zhuǎn)換結(jié)果超出一個字的范圍,則在BX中置出錯標(biāo)志(FFFFH)。

4.5

子程序設(shè)計技術(shù)

解:這種存放格式與通過鍵盤輸入十進制數(shù)的格式一致。變換算法與例4.9相反,設(shè)十進制數(shù)字符變換成數(shù)值后為x1~x5,x1為最低位,則變換結(jié)果y為:

y=10*(10*(10*(10*x5+x4)+x3)+x2)+x1據(jù)此可以編寫出子程序TRANS10TO16,入口參數(shù):SI(緩沖區(qū)首地址);出口參數(shù):AX(變換結(jié)果)和BX(變換結(jié)果是否出錯標(biāo)志);用到的寄存器:AX和BX。子程序如下:TRANS10TO16 PROCNEAR PUSHCX PUSHDX PUSHSI XORAX,AX4.5

子程序設(shè)計技術(shù)

XORCX,CX MOVCL,[SI] INCSI MOVAL,[SI] INCSI SUBAL,30H DECCX JCXZTRANSF2 MOVBX,10TRANSF1: MULBX JCTRANSF_ERR MOVDL,[SI] INCSISUBDL,30H4.5

子程序設(shè)計技術(shù)

ADDAL,DL ADCAH,0 JCTRANSF_ERR LOOPTRANSF1 MOVBX,0 TRANSF2: JMPTRANSF_OKTRANSF_ERR: MOVBX,-1TRANSF_OK: POPSI POPDX POPCX RETTRANS10TO16 ENDP4.5

子程序設(shè)計技術(shù)

例4.13利用鍵盤輸入十進制的無符號數(shù),編寫程序完成轉(zhuǎn)換成相應(yīng)的16位二進制數(shù)。解:可以直接利用例4.11編寫的子程序完成轉(zhuǎn)換操作。通過鍵盤輸入數(shù)據(jù)時,需要定義鍵盤緩沖區(qū),并調(diào)用INT21H的0AH號功能。匯編語言程序如下:STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTKEYBUFFER DB100 ;鍵盤緩沖區(qū) DB? DB100DUP(?)STRING1 DB'Pleaseinputdecimaldata:','$' ;輸入提示字符串4.5

子程序設(shè)計技術(shù)

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOP LEADX,STRING1 ;顯示出“輸入提示字符串” MOVAH,09H INT21H MOVAH,0AH ;輸入十進制數(shù)據(jù) LEADX,KEYBUFFER4.5

子程序設(shè)計技術(shù)

INT21H LEASI,KEYBUFFER+1 ;變換 CALLTRANS10TO16 CALLDISPCR ;屏幕光標(biāo)回車換行 CALLDISPAX ;顯示變換結(jié)果 CALLDISPCR MOVAX,BX CALLDISPAX ;顯示變換結(jié)果是否正確的標(biāo)志(BX)的內(nèi)容MOVAH,4CH;返回DOSMOVAL,0INT21HDISPAXPROCNEAR ;顯示寄存器AX的內(nèi)容子程序,詳見例3.34DISPAXENDP4.5

子程序設(shè)計技術(shù)

DISPCRPROCNEAR ;屏幕光標(biāo)回車換行子程序PUSHAXPUSHDXMOVAH,2MOVDL,0AHINT21HMOVAH,2MOVDL,0DHINT21HPOPDXPOPAXRETDISPCRENDP4.5

子程序設(shè)計技術(shù)

TRANS10TO16 PROCNEAR ;詳見例4.12TRANS10TO16 ENDPCODE ENDS ENDSTART

這里,為了方便,設(shè)計了顯示AX寄存器內(nèi)容的子程序DISPAX,它又調(diào)用了顯示AL寄存器內(nèi)容的子程序。另外給出了使屏幕上光標(biāo)回車換行的子程序DISPCR。這樣,執(zhí)行程序的結(jié)果可以直接顯示在屏幕上,圖4.5給出了三次執(zhí)行的結(jié)果,這說明前兩次程序執(zhí)行的結(jié)果正確,而第三次程序執(zhí)行的結(jié)果出錯。4.5

子程序設(shè)計技術(shù)

圖4.5程序執(zhí)行過程及其結(jié)果4.5

子程序設(shè)計技術(shù)

例4.14設(shè)一組16位有符號數(shù)存放在緩沖區(qū)BUFFER中,前兩個字節(jié)用于存放數(shù)據(jù)個數(shù),編寫子程序COMPUTMEAN計算這組數(shù)據(jù)平均值。解:計算數(shù)據(jù)平均值的子程序COMPUTMEAN,采用堆棧參數(shù)傳遞方式,人口參數(shù):緩沖區(qū)首地址壓入堆棧;出口參數(shù):計算出的平均值存入堆棧,采用與保存緩沖區(qū)首地址相同的堆棧單元。匯編語言程序如下:STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDS4.5

子程序設(shè)計技術(shù)

DATASEGMENTBUFFERDW10 ;假設(shè)有10個數(shù)據(jù)DW521,112,3654,-564,45,-166,771,1288,32709,-32014DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOP MOVAX,OFFSETBUFFER4.5

子程序設(shè)計技術(shù)

PUSHAX ;入口參數(shù)壓入堆棧進行傳遞 CALLCOMPUTMEAN POPAX ;出口參數(shù)也通過堆棧得到 CALLDISPAX ;調(diào)用子程序DISPAX顯示AX的內(nèi)容,即數(shù)據(jù)的平均值MOVAH,4CH;返回DOS系統(tǒng)INT21HCOMPUTMEANPROCNEAR ;計算平均值子程序 PUSHBP MOVBP,SP ;利用指針BP指向堆棧中的固定位置 PUSHSI PUSHDI PUSHAX PUSHBX4.5

子程序設(shè)計技術(shù)

PUSHCX PUSHDX MOVSI,[BP+4] ;從堆棧中取出入口參數(shù),即數(shù)據(jù)區(qū)的首地址 XORDX,DX XORBX,BX XORDI,DI MOVCX,[SI] ;取數(shù)據(jù)區(qū)長度 PUSHCX ;暫存數(shù)據(jù)個數(shù) ADDSI,2CPTM1: MOVAX,[SI] ADDSI,2 CWD ADDBX,AX4.5

子程序設(shè)計技術(shù)

ADCDI,DX LOOPCPTM1 MOVDX,DI MOVAX,BX POPBX ;取出數(shù)據(jù)個數(shù) IDIVBX ;求數(shù)據(jù)的平均值CPTM2: MOV[BP+4],AX ;在堆棧中保存數(shù)據(jù)的平均值POPDX POPCX POPBX POPAX POPDI POPSI POPBP4.5

子程序設(shè)計技術(shù)

RETCOMPUTMEANENDPCODEENDSENDSTART利用堆棧參數(shù)傳遞方式時,一定要搞清楚堆棧的結(jié)構(gòu)和指針的位置,在進入子程序后,其堆棧結(jié)構(gòu)與指針如圖4.6所示,隨著子程序中PUSH和POP指令的操作,堆棧指針SP在移動,但BP指針的位置固定不變,因此,可以利用BP指針取出入口參數(shù),同時將處理結(jié)果存放到指定的堆棧區(qū)域。這樣的子程序為可再入性子程序。4.5

子程序設(shè)計技術(shù)

例4.15遞歸子程序設(shè)計。設(shè)計子程序完成y=n!的計算。解:假設(shè)已經(jīng)設(shè)計了計算k階階乘的子程序factorial,為說明方便采用f(k)表示,則k+1階階乘可以表示成: f(k+1)=(k+1)×f(k)這樣,計算n階階乘的過程可以用圖4.7所示。因此,當(dāng)計算n!時,要調(diào)用n次factorial子程序,每次調(diào)用使k值減1,直到k=1,這時將1!=1作為已知結(jié)果,然后一層一層返回。4.5

子程序設(shè)計技術(shù)

4.5

子程序設(shè)計技術(shù)

為設(shè)計遞歸子程序factorial,需要定義一個字單元RESULT用于存放計算結(jié)果,因此,factorial的入口參數(shù)為:正整數(shù)k(≤8)和RESULT單元的偏移地址,出口參數(shù)為RESULT單元的內(nèi)容。匯編語言子程序factorial如下:N=7;計算7!,其結(jié)果應(yīng)該為5040(13B0H)STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTRESULTDW?DATAENDS4.5

子程序設(shè)計技術(shù)

CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPLEASI,RESULTPUSHSI ;結(jié)果單元的偏移地址壓入堆棧MOVAX,NPUSHAX ;N值壓入堆棧CALLFACTORIAL4.5

子程序設(shè)計技術(shù)

MOVAX,RESULT ;取出結(jié)果,并顯示 CALLDISPAXMOVAH,4CH ;返回DOS操作系統(tǒng)

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論