大學(xué)單片機(jī)原理與應(yīng)用設(shè)計(jì)子程序結(jié)構(gòu)課件_第1頁
大學(xué)單片機(jī)原理與應(yīng)用設(shè)計(jì)子程序結(jié)構(gòu)課件_第2頁
大學(xué)單片機(jī)原理與應(yīng)用設(shè)計(jì)子程序結(jié)構(gòu)課件_第3頁
大學(xué)單片機(jī)原理與應(yīng)用設(shè)計(jì)子程序結(jié)構(gòu)課件_第4頁
大學(xué)單片機(jī)原理與應(yīng)用設(shè)計(jì)子程序結(jié)構(gòu)課件_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1介紹 P139子程序又叫過程,相當(dāng)與高級(jí)語言的過程和函數(shù)。子程序結(jié)構(gòu)是模塊化程序設(shè)計(jì)的基礎(chǔ)。結(jié)構(gòu):procnamePROCAttribute…..procnameENDPAttribute為 NEAR(段內(nèi)調(diào)用) FAR(段間調(diào)用)1介紹 P139子程序又叫過程,相當(dāng)與高級(jí)語言的過2一.子程序的設(shè)計(jì)方法2一.子程序的設(shè)計(jì)方法31.子程序的調(diào)用和返回 P140call

格式:CALL目標(biāo)地址功能:暫停正在執(zhí)行的程序,轉(zhuǎn)去執(zhí)行相應(yīng)的子程序,目標(biāo)地址給出調(diào)用于程序的入口地址。在子程序執(zhí)行完后,由子程序中的RET指令返回至CALL指令的下一條指令繼續(xù)執(zhí)行。為此,CALL指令同時(shí)需要把斷點(diǎn)地址(即CALL指令的下—條指令的CS和IP)入棧保護(hù)CALL指令不影響標(biāo)志位,但應(yīng)特別注意在于程序中對(duì)相關(guān)寄存器的保護(hù)。CALL指令實(shí)質(zhì)上是一條特殊的、帶返回的無條件轉(zhuǎn)移指令。31.子程序的調(diào)用和返回 P1404 CALL指令目標(biāo)地址的形成方式與JMP指令完全類似,即有段內(nèi)直接調(diào)用、段內(nèi)間接調(diào)用、段間直接調(diào)用與段間間接調(diào)用四種方式。直接調(diào)用其目標(biāo)地址直接出現(xiàn)在CALL指令中,間接調(diào)用其目標(biāo)地址存放在指令所指向的寄存器或內(nèi)存單元中。4 CALL指令目標(biāo)地址的形成方式與JMP指令完全類似,即有5(1)段內(nèi)直接接調(diào)用格式:CALLNEARPTR標(biāo)號(hào)功能:首先將斷點(diǎn)的IP值壓入推棧,再將從指令中得到的子程序相對(duì)偏移量加到IP,然后根據(jù)IP轉(zhuǎn)相應(yīng)子程序執(zhí)行。如:CALLOUTPUT ;段內(nèi)直接調(diào)用子程序output5(1)段內(nèi)直接接調(diào)用格式:CALLNEARPTR標(biāo)號(hào)6(2)段內(nèi)間接調(diào)用格式:CALLREG|MEM功能:首先將斷點(diǎn)的IP值壓入堆棧,再將子程序的地址偏移量送入IP,然后根據(jù)IP轉(zhuǎn)相應(yīng)子程序執(zhí)行。子程序的地址偏移量為指令中指定的16位通用寄存器或存儲(chǔ)單元值。如:

CALLBX CALLWORDPTR[BX]6(2)段內(nèi)間接調(diào)用格式:CALLREG|MEM7(3)段間直接調(diào)用格式:CALLFARPTR標(biāo)號(hào)功能:首先把斷點(diǎn)的CS值壓入堆棧,并將于程序的段地址送入CS再把斷點(diǎn)的IP值壓入堆棧,把子程序的地址偏移量送入IP。然后根據(jù)CS:IP轉(zhuǎn)相應(yīng)于程序執(zhí)行。如:CALLFARPTROUTPUT ;段間直接調(diào)用子程序OUTPUT7(3)段間直接調(diào)用格式:CALLFARPTR標(biāo)號(hào)8(4)段間間接調(diào)用格式:CALLDWORDPTRMEM功能:首先把斷點(diǎn)的CS壓入堆棧,并將指令中指定的雙字存儲(chǔ)器的第二個(gè)字的內(nèi)容送入CS;再把斷點(diǎn)的IP壓入堆棧,再將雙字指針的第一個(gè)字的內(nèi)容送入IP。然后根據(jù)CS:IP轉(zhuǎn)相應(yīng)子程序執(zhí)行。如:

CALLDWORDPTR[BX] CALLDWRODPTRMEM328(4)段間間接調(diào)用格式:CALLDWORDPTRME92.返回指令RET P141返回指令RET通常作為一個(gè)子程序的最后一條指令,用以返回到調(diào)用這個(gè)于程序的主程序斷點(diǎn)處繼續(xù)執(zhí)行。與調(diào)用指令相對(duì)應(yīng),返回指令RET也有段內(nèi)返回與段間返回兩種形式。是段內(nèi)返回,還是段間返回,匯編程序能自動(dòng)確定,并形成相應(yīng)的返回指令。返回指令有兩種格式:92.返回指令RET P141返回指令RET通常作為一10格式一:RET

格式一為不帶偏移量的返回。若是段內(nèi)的RET指令(機(jī)器碼為C3H/C2H),只返回主程序斷點(diǎn)處的IP值。即從堆棧彈出一個(gè)字送入IP,且SP加2。然后返回CS:IP處繼續(xù)執(zhí)行程序。此時(shí)的返回也稱近返回。若為段間的RET指令(機(jī)器碼為CBH/CAH),則要返回主程序斷點(diǎn)處的段地址和IP值。將從堆棧彈出一個(gè)字送CS,SP+2→SP,再從堆棧彈出一個(gè)字送Cs,同時(shí)SP加2。然后返回CS:IP處繼續(xù)執(zhí)行程序。此時(shí)RET也稱遠(yuǎn)返回。10格式一:RET11格式二:RETn格式二為帶偏移量的返回,與格式一完全類似,只是在修改堆棧指針時(shí)需增加SP←SP+n處理。n一般為偶數(shù),格式二適合主程序向于程序利用堆棧傳遞參數(shù)的情況。在利用堆棧傳遞參數(shù)時(shí),主程序先將參數(shù)壓入堆棧,在于程序中將參數(shù)取出,為找到正確的返回地址,保持堆棧平衡,應(yīng)將堆棧指針修正。返回指令RET對(duì)標(biāo)志位無影響。11格式二:RETn12例7-3求兩個(gè)數(shù)的最大公約數(shù) P144用展轉(zhuǎn)相除法

在我們編程中用的最多方法就是展轉(zhuǎn)相除法了,展轉(zhuǎn)相除法是古希臘求兩個(gè)正整數(shù)的最大公約數(shù)的也叫歐幾里德算法,用較大的數(shù)除以較小的數(shù),結(jié)果的余數(shù)和被除數(shù)構(gòu)成新的一對(duì)數(shù),繼續(xù)做上面的除法,直到大數(shù)被小數(shù)求盡。12例7-3求兩個(gè)數(shù)的最大公約數(shù) P144用展轉(zhuǎn)相除法13GYS PROCPUSH AXPUSH BXPUSH DXG1: XOR DX,DXDIV BXCMP DX,0JZ EXITMOV AX,BXMOV BX,DXJMP G1EXIT: MOV CX,BXPOP DXPOP BXPOP AXRETGYS ENDP13GYS PROC14

調(diào)用程序和子程序之間的信息傳送叫參數(shù)傳送。a.通過寄存器傳送參數(shù)(約定寄存器法)P104

例1:十進(jìn)制到十六進(jìn)制數(shù)的轉(zhuǎn)換(BX)。 流程圖開始調(diào)用DECIBIN調(diào)用crlf調(diào)用binihex調(diào)用CRLF結(jié)束從鍵盤取得十進(jìn)制數(shù),保存在BX中顯示回車和換行用十六進(jìn)制形式顯示BX中的數(shù)3.子程序的參數(shù)傳送14調(diào)用程序和子程序之間的信息傳送叫參數(shù)傳送。開始調(diào)用D15;從鍵盤輸入十進(jìn)制數(shù),然后按十六進(jìn)制顯示DATASEGMENTDATAENDS;同學(xué)們掌握各段的結(jié)構(gòu)STACKSEGMENTPARASTACK'STACK'DB100HDUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK ;分配段址,但不會(huì)給段寄存器付值15;從鍵盤輸入十進(jìn)制數(shù),然后按十六進(jìn)制顯示16START:MOVAX,DATAMOVDS,AX ;給段寄存器DS付值

callDECIBINcallbinihex ;子程序調(diào)用

callcrlfMOVAH,4CHINT21H ;主程序的返回方式一(DOS 功能調(diào)用返回)16START:17DECIBINprocnearpushaxpushcxpushfmovbx,0newchar:movah,1;鍵盤輸入

int21hsubal,30hjlexit;<0退出

cmpal,9jgexit;>9退出

cbwxchgax,bxmovcx,10mulcxxchgax,bxaddbx,axjmpnewcharexit:popfpopcxpopaxretDECIBINendp17DECIBINprocnear cbw18binihexprocnearpushaxpushcxpushdxpushfmovch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30h;’0’~’9’cmpal,3ahjlprintitaddal,7h;’A’~’F’printit:movdl,almovah,2int21hdecchjnzrotatemovdl,'H'movah,2int21hpopfpopdxpopcxpopaxretbinihexendp18binihexprocnearprintit19crlfPROCNEAR pushax pushdx pushf movdl,0dh movah,2 int21h movdl,0ah movah,2 int21h popf popdx popax retcrlfENDPCODEENDSENDSTART19crlfPROCNEAR20b.如果過程和調(diào)用程序在同一模塊中,則過程可直接訪問模塊中的變量。(約定變量法)Datasegmentarydw100dup(?)countdw100sumdw?Dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdssubax,axpushaxmovax,datamovds,ax20b.如果過程和調(diào)用程序在同一模塊中,則過程可直接訪問模塊21…callnearptrproadd…retmainendpProaddprocnearpushax….ProaddendpCodeendsendstart21…22c.通過地址表傳送參數(shù)地址(約定存儲(chǔ)器法)建立一個(gè)地址表,把要傳送的參數(shù)存在地址表中,然后把地址表的首地址通過寄存器BX傳送到子程序。

movtable,offsetnummovtable+2,offsetnmovtable+4,offsettotalmovbx,offsettablecallproadd22c.通過地址表傳送參數(shù)地址(約定存儲(chǔ)器法)23d.通過堆棧傳送參數(shù)或參數(shù)地址(堆棧法)采用在主程序里把參數(shù)地址保存到堆棧中,在子程序里從堆棧中取出參數(shù)以達(dá)到傳送參數(shù)的目的。注:用BP保存原來的SP的值,以便取得堆棧中的地址.23d.通過堆棧傳送參數(shù)或參數(shù)地址(堆棧法)24e.多個(gè)模塊之間的參數(shù)傳送問題

(1)外部符號(hào)

PUBLICsymbol[,…]

在一個(gè)模塊中定義的符號(hào)在提供給其他模塊使用時(shí),必須用PUBLIC定義.EXTRNsymbolname:type[,…]

在另一模塊中定義而在本模塊中使用的符號(hào)必須用EXTERN偽操作。如符號(hào)為變量,則類型為BYTE/WORD/DWORD;如符號(hào)為標(biāo)號(hào)或過程名,則類型為NEAR/FAR24e.多個(gè)模塊之間的參數(shù)傳送問題25二.子程序的嵌套

P153主程序CALLPROC-A子程序AProc_a…Callproc_b…ret子程序BProc-b…ret25二.子程序的嵌套 P153主程序子程序A子程26三、子程序的結(jié)構(gòu)子程序的代碼部分通常有如下結(jié)構(gòu):

(1)保護(hù)現(xiàn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論