




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章子程序設(shè)計(jì)
為了使程序結(jié)構(gòu)更加清晰,把程序需要完成的任務(wù)分解為若干個(gè)子任務(wù),把每個(gè)子任務(wù)設(shè)計(jì)成一個(gè)相對(duì)獨(dú)立的程序,稱為子程序,也稱為過(guò)程。8.1子程序結(jié)構(gòu)8.1.1子程序調(diào)用指令8.1.2過(guò)程定義與過(guò)程結(jié)構(gòu)
8.1.3保護(hù)和恢復(fù)現(xiàn)場(chǎng)寄存器8.1.1子程序調(diào)用指令子程序定義:在模塊化程序設(shè)計(jì)中,經(jīng)常把程序中某些具有獨(dú)立功能的部分編寫成獨(dú)立的程序模塊,稱為子程序。主程序通過(guò)CALL指令調(diào)用子程序。子程序執(zhí)行完畢后通過(guò)RET指令回到主程序。(1)CALL調(diào)用指令格式:CALLDST操作:首先把下一條指令的地址(返回地址)壓入堆棧保存,再把子程序的入口地址置入IP(CS)寄存器,以便實(shí)現(xiàn)轉(zhuǎn)移。對(duì)于段內(nèi)調(diào)用,只是向堆棧保存IP寄存器的值。對(duì)于段間調(diào)用,是先向堆棧保存CS寄存器的值,再向堆棧保存IP寄存器的值。(2)RET返回指令格式1:RET格式2:RETEXP操作:把堆棧里保存的返回地址送回IP(CS)寄存器,實(shí)現(xiàn)程序的返回。對(duì)于段內(nèi)調(diào)用,彈出一個(gè)字到IP寄存器。對(duì)于段間調(diào)用,先彈出一個(gè)字到IP寄存器,再?gòu)棾鲆粋€(gè)字到CS寄存器。例8.1例8.1代碼段1中的主程序A調(diào)用代碼段2中的子程序B,程序B調(diào)用代碼段2中的子程序C,調(diào)用關(guān)系如圖8-1所示,堆棧情況如圖8-2所示。 主程序A程序B程序C ………………CALLFARPTRBCALLNEARPTRCRET(IP=2000H,CS=3400H)(IP=1000H,CS=6200H)………… RET8.1.2過(guò)程定義與過(guò)程結(jié)構(gòu)過(guò)程定義偽指令
Procedure_NamePROCAttribute┇Procedure_NameENDP如:
mainprocfar/near┇mainendp過(guò)程名是標(biāo)識(shí)符,起到標(biāo)號(hào)的作用,是子程序入口的符號(hào)地址。過(guò)程的屬性可以是FAR或NEAR類型。對(duì)過(guò)程屬性的確定原則是:NEAR為近,是段內(nèi)調(diào)用。FAR類型為遠(yuǎn),是跨段調(diào)用。如調(diào)用程序和子程序在同一代碼段,則使用NEAR屬性;如調(diào)用程序和子程序不在同一代碼段,則使用FAR屬性。主程序的過(guò)程定義屬性應(yīng)為FAR。
例8.2調(diào)用程序和子程序在同一個(gè)代碼段,調(diào)用程序和子程序并列。 mainprocfar … callsubr… ret mainendp subrprocnear… ret subrendp調(diào)用程序和子程序在同一個(gè)代碼段,調(diào)用程序和子程序相互嵌套。 mainprocfar … callsubr … ret subrprocnear … ret subrendp mainendp例8.3調(diào)用程序和子程序不在同一個(gè)代碼段。 code1segment … mainprocfar … callsubr … ret mainendp code1ends … code2segment … callsubr … subrprocfar … ret subrendp code2ends8.1.3保存和恢復(fù)現(xiàn)場(chǎng)寄存器子程序調(diào)用CALL:首先將返回地址壓棧,然后把子程序的入口地址送入IP/CS寄存器。子程序返回RET:將堆棧里保存的返回地址送回IP/CS寄存器。在子程序中對(duì)主程序的現(xiàn)場(chǎng)實(shí)施保護(hù)和恢復(fù)在進(jìn)入子程序后,對(duì)將要使用的寄存器,先保存這些寄存器的值,在子程序退出前恢復(fù)這些寄存器的值。保存和恢復(fù)寄存器
8.2子程序的參數(shù)傳遞入口參數(shù)(調(diào)用參數(shù)):主程序傳遞給子程序。出口參數(shù)(返回參數(shù)):子程序返回給主程序。傳遞的參數(shù):值傳遞和地址傳遞。8.2.1用寄存器傳遞參數(shù)
用寄存器傳遞參數(shù)就是約定某些寄存器存放將要傳遞的參數(shù)。該方法簡(jiǎn)單,執(zhí)行的速度也很快。但由于寄存器數(shù)量有限,不能用于傳遞很多的參數(shù)。例8.4從鍵盤輸入一個(gè)十進(jìn)制數(shù)(小于65536的正數(shù)),顯示輸出該數(shù)的十六進(jìn)制形式。通過(guò)寄存器傳送變量。算法分析1.輸入的十進(jìn)制數(shù)整合成二進(jìn)制數(shù);
2.整合的方法A(n)=A(n-1)*10+B(n);
3.二進(jìn)制數(shù)轉(zhuǎn)化為十六進(jìn)制顯示。程序結(jié)構(gòu)框圖DTOB子程序流程圖 dtohexsegment assumecs:dtohex mainprocfar pushds xorax,ax pushax calldtob;十進(jìn)制數(shù)鍵盤輸入整合為二進(jìn)制 callcrlf;輸出回車換行 callbtoh;二進(jìn)制轉(zhuǎn)為十六進(jìn)制顯示
ret mainendp dtobprocnear movbx,0 input:movah,1;鍵盤輸入
int21h subal,30h;把a(bǔ)scii碼轉(zhuǎn)變?yōu)閿?shù)值 jlexit;如不是數(shù)則退出 cmpal,9 jgexit;如不是數(shù)則退出 cbw;擴(kuò)展為字 xchgax,bx;交換寄存器 movcx,10 mulcx;a(n)=a(n-1)×10 addax,bx;a(n)=a(n)+b(n)xchgax,bx;交換寄存器 jmpinput exit:ret dtobendp btohprocnear movch,4;準(zhǔn)備輸出4位十六進(jìn)制數(shù) shift:movcl,4;每次需移4位 rolbx,cl moval,bl andal,0fh;取最右4位 addal,30h;轉(zhuǎn)為ascii cmpal,39h jledig;是0~9則轉(zhuǎn)dig addal,7;是A~F dig:movdl,al;顯示 movah,2 int21h decch jnzshift ret btohendp crlfprocnear movdl,0dh movah,2 int21h movdl,0ah movah,2 int21h ret crlfendp dtohexends endmain討論1.畫出程序調(diào)用過(guò)程中堆棧的變化情況;2.畫出DTOB,BTOH的程序流程圖,并闡述算法思想;8.2.2用變量傳遞參數(shù)參數(shù)較多時(shí)可以用約定的變量在過(guò)程間傳遞參數(shù)。例8.5鍵盤輸入字符串到緩沖區(qū)后,對(duì)緩沖區(qū)內(nèi)容降序排序并輸出。datasegment buffdb16;緩沖區(qū)大小 numbdb?;輸入的字節(jié)數(shù) arrydb16dup(?);緩沖區(qū)內(nèi)容dataendscodesegment assumecs:code,ds:datamainprocfar pushds subax,ax pushax movax,data movds,ax callorder retmain endporderprocnear leadx,buff;輸入緩沖區(qū) movah,10 int21h movcl,numb;實(shí)際輸入個(gè)數(shù)deccl movch,0lp1: movdi,cx movbx,0;下標(biāo)lp2: moval,arry[bx]
cmpal,arry[bx+1] jgecont xchgal,arry[bx+1] movarry[bx],alcont:incbx decdi jnzlp2
looplp1 calloutput retorder endp;------------------outputprocnearmovbl,numb;后面插入$以便顯示
movbh,0movbyteptr[arry+bx],'$'movdx,offsetarrymovah,9int21hretoutput endpcode endsendmain討論1.畫出降序排序的流程圖,并簡(jiǎn)述算法思想;2.這兩個(gè)例題是利用了寄存器和變量的什么性質(zhì),實(shí)現(xiàn)參數(shù)傳遞的?8.2.3用地址表傳遞參數(shù)的通用子程序在主程序中建立一個(gè)地址表,把要傳遞的參數(shù)地址放在地址表中,然后把地址表的首地址放入寄存器,子程序通過(guò)寄存器間接尋址方式從地址表中取得所需參數(shù),可以設(shè)計(jì)通用子程序處理其他類似字符串排序問(wèn)題。例8.6采用通過(guò)地址表傳遞參數(shù)地址的方法,鍵盤輸入緩沖區(qū)并對(duì)其內(nèi)容排序和輸出。datasegment buffdb16 numbdb? arrydb16dup(?) tabledw3dup(?);地址表dataendscodesegment assumecs:code,ds:datamain procfar pushds subax,ax pushax movax,data movds,ax movtable,offsetbuff movtable+2,offsetnumb movtable+4,offsetarry movsi,offsettable;地址表首地址送si callorder retmainendporder procnear movdx,[si] movah,10 int21h movdi,[si+2] movcl,[di];實(shí)際輸入個(gè)數(shù)送cxdeccl movch,0
lp1: movdi,cx movbx,[si+4];bx指向緩沖區(qū)lp2: moval,[bx] cmpal,[bx+1] jgecont xchgal,[bx+1] mov[bx],alcont:incbx decdi jnzlp2
looplp1 calloutput retorder endp;------------------outputprocnearmovdi,[si+2];后面插入$以便顯示movbl,[di]movbh,0movdi,[si+4]movbyteptr[di+bx],'$'movdx,di movah,9int21hretoutput endpcode endsendmain思考題畫出數(shù)據(jù)段中數(shù)據(jù)的存放情況,并用指針標(biāo)注出數(shù)據(jù)之間的關(guān)系。為了實(shí)現(xiàn)在cx中存放字符串的實(shí)際長(zhǎng)度,進(jìn)行了幾次尋址,每一次是什么尋址方式;為了實(shí)現(xiàn)每一輪中兩個(gè)數(shù)的比較,對(duì)參與比較的兩個(gè)數(shù)進(jìn)行了幾次尋址,每一次是什么尋址方式。8.2.4用堆棧傳遞參數(shù)的通用子程序用堆棧傳遞參數(shù)地址
,可以設(shè)計(jì)通用子程序。例8.7鍵盤輸入緩沖區(qū)內(nèi)容排序并輸出,用堆棧傳遞參數(shù)地址。datasegment dw50dup(?);堆棧50個(gè)字 toslabelword;棧頂?shù)刂穞os buffdb16 numbdb? arrydb16dup(?)dataendscodesegmentassumecs:code,ds:data,ss:datamainprocfar ;設(shè)置ss和sp movax,data movss,ax leasp,tos ;ds和0壓入堆棧,以便返回dos pushds xorax,ax pushax movax,data movds,ax ;參數(shù)地址壓入堆棧 leabx,buff pushbx;buff的地址壓入堆棧 leabx,numb pushbx;numb的地址壓入堆棧 leabx,arry pushbx;arry的地址壓入堆棧 callorder retmainendporderprocnear movbp,sp movdx,[bp+6];buff地址送dx movah,10 int21h movdi,[bp+4];取numb的地址 movcl,[di]deccl movch,0;numb送cx
lp1: movdi,cx movbx,[bp+2];arry的地址送bxlp2:moval,[bx]
cmpal,[bx+1] jgecont xchgal,[bx+1] mov[bx],alcont:incbx decdi jnzlp2looplp2 calloutput ret6;修改sp指針并返回order endp;------------------outputprocnearmovdi,[bp+4];后面插入$以便顯示movbl,[di]movbh,0 movdi,[bp+2]movbyteptr[di+bx],'$'movdx,di movah,9int21hretoutput endpcode endsendmain思考題程序初始時(shí)tos的值是多少?畫出程序執(zhí)行過(guò)程中,堆棧段中的存儲(chǔ)情況8.2.5用結(jié)構(gòu)變量傳遞參數(shù)的通用子程序結(jié)構(gòu)就是把邏輯上互相關(guān)聯(lián)的一組數(shù)據(jù)以某種形式組合在一起。在程序中,若要多次使用相同的一組數(shù)據(jù)格式,那么我們就可以把這一組數(shù)據(jù)格式定義為一個(gè)結(jié)構(gòu)數(shù)據(jù)。結(jié)構(gòu)類型的定義:結(jié)構(gòu)名STRUC……結(jié)構(gòu)名ENDSSTRUC偽指令只是定義了一種結(jié)構(gòu)模式,還沒(méi)有生成結(jié)構(gòu)變量。用結(jié)構(gòu)預(yù)置語(yǔ)句生成結(jié)構(gòu)變量并賦值。結(jié)構(gòu)預(yù)置語(yǔ)句格式:變量結(jié)構(gòu)名<各字段賦值>對(duì)結(jié)構(gòu)字段初值的修改,并非所有字段的初值都可以修改,只有簡(jiǎn)單結(jié)構(gòu)字段和字符串字段初值才可以修改。簡(jiǎn)單結(jié)構(gòu)字段是指由偽指令DB、DW或DD定義的單項(xiàng)變量。多項(xiàng)變量的結(jié)構(gòu)字段初值不能修改。例如下面就是多項(xiàng)的結(jié)構(gòu)字段:
DW10DUP(?)DB12H,34HDB‘ABCD’,’1234’例8.8定義一個(gè)名為STUDENT的結(jié)構(gòu)類型。STUDENTSTRUCIDDB‘AAAAAAAA’NAMEDB3DUP(0)JF1DW22HJF2DW?JF3DW?JF4DW?STUDENTENDS例8.9結(jié)構(gòu)變量預(yù)置語(yǔ)句(定義結(jié)構(gòu)變量)STD1STUDENT<’A2031456’,,,33H>STD2STUDENT<>STDSSSTUDENT100DUP(<>)例8.10結(jié)構(gòu)變量的訪問(wèn)
MOVSI,1LEABX,STD1MOVAL,STD1.NAME[SI];變量STD1的字段NAME的第2項(xiàng)送ALMOVAL,[BX].NAME[SI];變量STD1的字段NAME的第2項(xiàng)送ALMOVDL,STDSS+3*19.NAME[SI];變量STDSS第4條記錄的字段NAME的第2項(xiàng)送AL例8.11鍵盤輸入緩沖區(qū)內(nèi)容排序并輸出,用堆棧傳遞參數(shù)地址,使用結(jié)構(gòu)類型.
datasegment dw50dup(?);堆棧50個(gè)字
toslabelword;棧頂?shù)刂穞os buffdb16 numbdb? arrydw16dup(?)data endscode segment assumecs:code,ds:data,ss:datamain procfar ;設(shè)置ss和sp movax,data movss,ax leasp,tos ;ds和0壓入堆棧,以便返回dos pushds xorax,ax pushax movax,data movds,ax ;參數(shù)地址壓入堆棧 leabx,buff pushbx;buff的地址壓入堆棧 leabx,numb pushbx;numb的地址壓入堆棧
leabx,arry pushbx;arry的地址壓入堆棧
callorder retmain endporderprocnear parstruc pipdw? p3dw? p2dw? p1dw? parends movbp,sp movdx,[bp].p1 ;buff的地址送dx movah,10 int21h movdi,[bp].p2;取numb的地址
movcl,[di] ;numb送cx decclmovch,0
lp1:movdi,cx movbx,[bp].p3;arry地址送bx lp2:moval,[bx] cmpal,[bx+1] jgecont xchgal,[bx+1] mov[bx],alcont:incbx decdi jnzlp2 looplp1calloutput ret6;修改sp指針并返回order endpcodeends endmain;------------------outputprocnearmovdi,[bp].p2movbl,[di]movbh,0movdi,[bp].p3movbyteptr[di+bx],'$'movdx,di movah,9int21hretoutput endpcode endsendmain思考題畫出執(zhí)行指令callorder后,堆棧段中的數(shù)據(jù)存儲(chǔ)情況。8.3多模塊程序設(shè)計(jì)
多模塊程序設(shè)計(jì)中,各個(gè)模塊獨(dú)立編寫,分別匯編,便于程序的編寫,調(diào)試和維護(hù)。8.3.1多模塊之間的參數(shù)傳遞局部符號(hào)和外部符號(hào)在本模塊中定義,又只在本模塊中引用的符號(hào)叫局部符號(hào)。
在本模塊中定義,而在另一模塊中引用的符號(hào)叫外部符號(hào)。對(duì)于外部符號(hào),編程時(shí)需要明確說(shuō)明。EXTRN符號(hào)名:類型[,…]
在另一個(gè)模塊中定義而要在本模塊中使用的符號(hào)必須使用EXTRN偽操作說(shuō)明。符號(hào)名為變量時(shí),則type應(yīng)為BETY,WORD,DWORD等;如符號(hào)名為標(biāo)號(hào)或過(guò)程名,則type應(yīng)為NEAR或FAR。PUBLIC符號(hào)名1,符號(hào)名2,……
在一個(gè)模塊中定義的符號(hào)(包括變量、標(biāo)號(hào)、過(guò)程名等)在提供給其他模塊使用時(shí),必須要用PUBLIC定義。例8.12主程序鍵盤輸入緩沖區(qū),子程序?qū)彌_區(qū)內(nèi)容排序并輸出,采用獨(dú)立模塊。;812main.asmpublicbuff,numb,arryextrnorder:fardatasegment buffdb16 numbdb? arrydb16dup(?)dataendscodesegmentassumecs:code,ds:datamainprocfar pushds subax,ax pushax movax,data movds,ax leadx,buff movah,10 int21h callorder retmain endpcodeends endmain;812sub.asmpublicorderextrnbuff:byte,numb:byte,arry:bytecodesegmentassumecs:codeorderprocfar movcl,numb movch,0 movdi,cx lp1:movcx,di movbx,0 lp2:moval,arry[bx] cmpal,arry[bx+1] jgecont xchgal,arry[bx+1] movarry[bx],al cont:incbx looplp2 decdi jnzlp1 movbl,numb movbh,0 movbyteptr[arry+bx],'$' movdx,offsetarry movah,9 int21h retorder endpcode ends end各模塊先分別匯編,然后再連接:Link812main+812subLink的次序影響結(jié)果,主模塊在前面。codesegment assumeds:data,cs:codemainprocfar(1)(2)(3)………retmainendpcodeendsendmain此處添加題目描述MOVAX,DATAPUSHDSXORAX,AXPUSHAXABCD提交MOVDS,AXE多選題50分datasegmentdw100dup(?)toslabelworddataendscodesegment assume cs:code,ss:datamainprocfar()()()pushdsxorax,axpushaxcallfarptrsuba…;假定此處指令的地址為CS=3400h,IP=30h……codeendsendmain此處添加題目描述MOVAX,DATAMOVSS,AXMOVDS,AXMOVSP,TOSABCD提交LEASP,TOSE多選題50分編程題在數(shù)據(jù)段定義一個(gè)緩沖區(qū)在主程序中完成從鍵盤輸入一個(gè)字符串到緩沖區(qū),再?gòu)逆I盤輸入單個(gè)字符;在查找子程序中查找緩沖區(qū)中該字符出現(xiàn)的次數(shù);在顯示子程序中把該字符出現(xiàn)的次數(shù)存入內(nèi)存中并顯示出來(lái)。8.3.2顯示十進(jìn)制數(shù)的通用模塊例8.13從鍵盤輸入一個(gè)十六進(jìn)制數(shù)(不超過(guò)四位),顯示輸出該數(shù)的十進(jìn)制形式。
算法分析:
1.輸入的十六進(jìn)制數(shù)轉(zhuǎn)化為二進(jìn)制數(shù);
2.把二進(jìn)制數(shù)用十進(jìn)制顯示;
3.輾轉(zhuǎn)相除法。主程序文件HTODPRO.ASMextrnhtob:far,crlf:far,btod:farcodesegment assumecs:codemainprocfar pushds xorax,ax pushax callhtob callcrlf callbtod retmainendpcodeends endmain子程序文件htobpro.asmpublichtobcode1segment assumecs:code1htobprocfarstart:movbx,0;初始化 movch,4 movcl,4inchr:movah,1;鍵盤輸入 int21h cmpal,30h jlexit ;非法輸入 cmpal,39h jledig;輸入是數(shù)字0~9 cmpal,41h jlexit;非法輸入 cmpal,46h jgexit;非法輸入 subal,37h;輸入是大寫A~F jmpls4dig: subal,30h ls4: shlbx,cl addbl,al decch jnzinchrexit: rethtobendpcode1endsend子程序文件btodpro.asmpublicbtodcode2segment ass
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 黑龍江能源職業(yè)學(xué)院《口腔頜面外科學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 陜西電子信息職業(yè)技術(shù)學(xué)院《矢量與張量》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南工商學(xué)院《能源專業(yè)外語(yǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南通大學(xué)《英美小說(shuō)研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 石家莊人民醫(yī)學(xué)高等專科學(xué)校《金屬材料專業(yè)英語(yǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 杭州電子科技大學(xué)信息工程學(xué)院《中國(guó)古代文獻(xiàn)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 海南外國(guó)語(yǔ)職業(yè)學(xué)院《服裝結(jié)構(gòu)設(shè)計(jì)研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古財(cái)經(jīng)大學(xué)《鋼琴與即興伴奏一》2023-2024學(xué)年第二學(xué)期期末試卷
- 南通師范高等專科學(xué)校《建筑裝飾工程計(jì)量與計(jì)價(jià)》2023-2024學(xué)年第二學(xué)期期末試卷
- 泉州工藝美術(shù)職業(yè)學(xué)院《影視史論》2023-2024學(xué)年第二學(xué)期期末試卷
- 焊接車間作業(yè)流程看板
- 家族成員關(guān)系輩分排列樹(shù)狀圖含女眷
- 圍堰施工監(jiān)理實(shí)施細(xì)則
- 老年癡呆護(hù)理
- 新生血管性青光眼課件
- 車間精益改善總結(jié)報(bào)告課件(PPT 19頁(yè))
- 中小學(xué)教育懲戒規(guī)則(試行)全文解讀ppt課件
- YY∕T 1797-2021 內(nèi)窺鏡手術(shù)器械 腔鏡切割吻合器及組件
- 《冬病夏治工作指南》
- 布魯克納操作手冊(cè)
- 印度尼西亞煤炭購(gòu)銷合同
評(píng)論
0/150
提交評(píng)論