版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第六章子程序設(shè)計本章主要內(nèi)容:子程序調(diào)用與返回指令編制子程序的基本要求子程序設(shè)計舉例DOS功能子程序調(diào)用1子程序--在一個程序的不同的地方需要多次使用的某個程序段,將其進(jìn)行獨(dú)立編制。調(diào)用與返回:在主程序中需要使用該功能時,就轉(zhuǎn)移到子程序執(zhí)行,執(zhí)行完后又返回原程序繼續(xù)執(zhí)行。這樣的程序結(jié)構(gòu)稱為子程序設(shè)計。6.1調(diào)用與返回指令在匯編語言中,子程序是以“過程”的形式表示。根據(jù)被調(diào)用過程與調(diào)用程序是否在同一個段內(nèi),可以分為兩種情況。2主程序與子程序同在一個段內(nèi)。這時,子程序的調(diào)用與返回只需修改指令指針I(yè)P。CODEASEGMENT...CALLPROCAAAA:......PROCAPROC...RET...PROCAENDP...CODEAENDS段內(nèi)調(diào)用與返回右圖中指令CALLPROCA就是段內(nèi)調(diào)用。3下面CODEB段中的CALLFARPTRPROCB就是段間調(diào)用。CODEASEGMENTCODEBSEGMENT......PROCBPROC...CALLFARPTRPROCB...BBB:......RETPROCBENDPCODEBENDS...CODEAENDS段間調(diào)用與返回調(diào)用指令與子程序分別在不同的段,這時,需要同時修改CS和IP。4執(zhí)行CALL指令時,先將斷點(diǎn)壓入堆棧中保存,然后轉(zhuǎn)移到目標(biāo)單元。1、調(diào)用指令指令格式:CALL過程名
CALL指令的執(zhí)行對各標(biāo)志位無影響。前述程序結(jié)構(gòu)圖中,AAA和BBB就是兩條調(diào)用子程序指令的斷點(diǎn)。斷點(diǎn)是調(diào)用子程序指令CALL的下一條指令的地址。5匯編指令書寫格式為在CALL之后直接書寫過程名(1)段內(nèi)調(diào)用(a)段內(nèi)直接調(diào)用例如:CALLSUB1例如:CALLBXCALLCXCALLWORDPTR30H[BX][SI](b)段內(nèi)間接調(diào)用子程序的起始地址(偏移量)由一個通用寄存器或一個字存儲單元提供。6調(diào)用指令提供一個雙字存儲單元的地址,它所指向的雙字存儲單元內(nèi)容為被調(diào)用過程的起始地址。其中,兩個低字節(jié)存放偏移量,兩個高字節(jié)存放段基值。(b)段間間接調(diào)用例如:CALLDWORDPTRDISP[BX][DI]由于在定義過程時,對提供段間調(diào)用的過程,已經(jīng)說明其屬性為FAR。因此調(diào)用時,在CALL后直接書寫過程名,也可以在過程名前面加FAR屬性修飾。(2)段間調(diào)用(a)段間直接調(diào)用例如:CALLPROC_NAMECALLFARPTRPROC_NAME7兩者都是無條件轉(zhuǎn)移到目標(biāo)單元,但CALL指令要保存“斷點(diǎn)”,而JMP指令不保存斷點(diǎn)。(3)子程序調(diào)用指令與轉(zhuǎn)移指令JMP的區(qū)別83、返回指令(2)段間返回——指令編碼為CBH執(zhí)行該指令,將從堆棧頂部彈出兩個字分別送IP和CS中。根據(jù)子程序調(diào)用指令的使用情況,返回指令也分為段內(nèi)返回和段間返回。其匯編指令書寫形式都是RET,但它們的編碼是不相同的。一個子程序最后執(zhí)行的指令一定是返回指令,但不一定是最后一條指令。(1)段內(nèi)返回——指令編碼為C3H執(zhí)行該指令,將從堆棧頂部彈出一個字送入IP。9匯編指令格式為:RETn
其中n為一個立即數(shù),長度為2字節(jié)。并且是一個偶數(shù)。(1)從堆棧彈出1個字送IP(段內(nèi)返回)或2個字送IP和CS;(2)執(zhí)行SP<=(SP)+n。將堆棧中已經(jīng)用過的參數(shù)(n個字節(jié))彈出舍去.指令執(zhí)行過程:(3)帶彈出值的返回指令這條指令既可用于段內(nèi)返回也可以用于段間返回,但它們的指令編碼不同,分別為C2n和CAn。106.2編制子程序的基本要求1、具有一定的通用性2、選擇適當(dāng)?shù)膮?shù)傳遞方法在主程序與子程序之間傳遞參數(shù),可以選擇的方法有:
A、使用通用寄存器B、使用指定的存儲單元C、使用堆棧選擇和設(shè)計好子程序所需的各種入口參數(shù)和出口參數(shù)。11A、在主程序中保存子程序中將要使用的一些寄存器的內(nèi)容...PUSHBXPUSHCXCALLSUB1POPCXPOPBX...3、注意信息保護(hù)信息的保護(hù)可以有兩種方法:如果在子程序中需要使用某些寄存器或存儲單元,為了不破壞它們原來在主程序中的值,為此需要進(jìn)行信息保護(hù)。12B、在子程序中保存將要使用的一些寄存器的內(nèi)容SUB2PROCPUSHBXPUSHCX......;完成子程序功能指令序列POPCXPOPBXRETSUB2ENDP4、正確使用堆棧由于堆棧中保存著主程序調(diào)用子程序時的斷點(diǎn)地址。若在子程序中也使用了堆棧,注意各個數(shù)據(jù)壓棧和出棧的順序不能錯,否則將導(dǎo)致數(shù)據(jù)錯誤和子程序返回地址錯誤。13子程序名子程序功能描述子程序的入口參數(shù)與出口參數(shù)使用哪些寄存器和存儲單元本子程序是否又調(diào)用其他子程序子程序的調(diào)用形式、舉例5、編制子程序文件子程序文件應(yīng)包括文字說明與子程序本身兩個部分。而文字說明一般包括:146.3子程序設(shè)計舉例例5.5.1將兩個給定的二進(jìn)制數(shù)(8位和16位)轉(zhuǎn)換為ASCII碼字符串。主程序提供被轉(zhuǎn)換的數(shù)據(jù)和轉(zhuǎn)換后的ASCII碼字符串的存儲區(qū)的首地址開始取出待轉(zhuǎn)換數(shù)據(jù)給出存放結(jié)果首址給出轉(zhuǎn)換的位數(shù)調(diào)用轉(zhuǎn)換子程序取出待轉(zhuǎn)換數(shù)據(jù)給出存放結(jié)果首址給出轉(zhuǎn)換的位數(shù)調(diào)用轉(zhuǎn)換子程序結(jié)束主程序框圖15子程序完成二進(jìn)制數(shù)與ASCII碼字符串的轉(zhuǎn)換。子程序的入口參量有:被轉(zhuǎn)換的數(shù)據(jù)、存儲ASCII碼字符串的首址和被轉(zhuǎn)換數(shù)據(jù)的位數(shù)。無出口參量。BINASC待轉(zhuǎn)換的一位二進(jìn)制數(shù)送AL的第0位DX<=待轉(zhuǎn)換數(shù)據(jù)DI<=存放ASCII碼首址CX<=轉(zhuǎn)換的位數(shù)AL<=(AL)^01HAL<=(AL)+30H存ASCII碼:(DI)<=(AL)修改指針:DI<=(DI)+1計數(shù):CX<=(CX)-1(CX)=0?返回NY子程序框圖:‘0’的ASCII碼為30H,’1’的ASCII碼為31H。16源程序的數(shù)據(jù)段和堆棧安排如下:DATASEGMENTBIN1DB35HBIN2DW0AB48HASCBUFDB20HDUP(?)DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS*用寄存器傳遞參量*用堆棧傳遞參量*用地址表傳遞參量由于參量的傳遞方式有多種形式,其相應(yīng)地在子程序中取入口參量的方法也有所不同。下面介紹三種參量的傳遞方法:171、用寄存器傳遞參量設(shè)調(diào)用子程序時,入口參量為:被轉(zhuǎn)換的數(shù)在DX中,若數(shù)位<16,則從高到低地存放,轉(zhuǎn)換后的ASCII碼的存放首址在DI中。信息的保存由主程序完成。COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXXORDX,DXLEADI,ASCBUF;存放ASCII碼的單元首址送DIMOVDH,BIN1;待轉(zhuǎn)換的第1個數(shù)據(jù)送DHMOVAX,8;待轉(zhuǎn)換的二進(jìn)制數(shù)的位數(shù)PUSHDI;保護(hù)信息CALLBINASC;調(diào)用轉(zhuǎn)換子程序POPDI;恢復(fù)信息MOVDX,BIN2;待轉(zhuǎn)換的第二個數(shù)據(jù)送DX
MOVAX,16ADDDI,8;設(shè)置下一個數(shù)的存放首址CALLBINASCMOVAH,4CHINT21H主程序18BINASCPROCMOVCX,AXLOP:ROLDX,1;最高位移入最低位MOVAL,DLANDAL,1;保留最低位,屏蔽其它位ADDAL,30H;AL中即為該數(shù)字符(0或1)的ASCII碼MOV[DI],AL;存結(jié)果INCDI;修改地址指針LOOPLOPRETBINASCENDPCOSEGENDSENDSTART轉(zhuǎn)換子程序192、用堆棧傳遞參量(2)在子程序中保存信息。如果使用堆棧傳遞參量,一般應(yīng)包括:(1)在主程序中,將待轉(zhuǎn)換的數(shù)據(jù)、存放ASCII碼的首址和轉(zhuǎn)換的位數(shù)壓入堆棧;20;主程序COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AXMOVAH,BIN1PUSHAX;待轉(zhuǎn)換數(shù)據(jù)壓棧MOVAX,8PUSHAX;轉(zhuǎn)換位數(shù)壓棧LEAAX,ASCBUFPUSHAX;存放ASCII碼的首址壓棧CALLBINASC;調(diào)用轉(zhuǎn)換子程序MOVAX,BIN2 PUSHAX MOVAX,10H PUSHAXADDDI,8 PUSHDICALLBINASC MOVAH,4CHINT21HASCII碼首址位數(shù)待轉(zhuǎn)換數(shù)據(jù)執(zhí)行CALL指令前堆棧情況SP+2SP+4SP執(zhí)行CALL指令后堆棧情況SP+2SP+4SP待轉(zhuǎn)換數(shù)據(jù)位數(shù)ASCII碼首址返回地址SP+621;轉(zhuǎn)換子程序BINASCPROCPUSHAXPUSHCXPUSHDXPUSHDIMOVBP,SPMOVDI,[BP+10];從堆棧取入口參數(shù)MOVCX,[BP+12]MOVDX,[BP+14];LOP:ROLDX,1MOVAL,DLANDAL,1ADDAL,30HMOV[DI],ALINCDILOOPLOPDIDXCXAX返回地址ASCII碼首址位數(shù)待轉(zhuǎn)換數(shù)據(jù)子程序中保存信息并執(zhí)行MOVBP,SP后SPSP+2SP+4SP+6SP+8BP22POPDIPOPDXPOPCXPOPAXRET6;返回并從堆棧中彈出6個字節(jié)BINASCENDPCOSEGENDBEGINDIDXCXAX返回地址ASCII碼首址位數(shù)待轉(zhuǎn)換數(shù)據(jù)執(zhí)行RET6前SPDIDXCXAX返回地址ASCII碼首址位數(shù)待轉(zhuǎn)換數(shù)據(jù)執(zhí)行RET6后SP233、用地址表傳遞參量在調(diào)用子程序前,將所有參量的地址依次存放在一個地址表中,然后將該表的首地址傳送給子程序。數(shù)據(jù)段部分改為:DATASEGMENTBIN1DB35HBIN2DW0AB48HCUNTDB8,16ASCBUPDB20HDUP(?)ADR_TABDW3DUP(0);存放參量地址表DATAENDS傳遞參數(shù)也可以采用傳遞參量的地址來實(shí)現(xiàn)。24主程序中有關(guān)指令序列修改為:......MOVADR_TAB,OFFSETBIN1;存參量地址MOVADR_TAB+2,OFFSETCUNTMOVADR_TAB+4,OFFSETASCBUPMOVBX,OFFSETADR_TAB;傳表首址CALLBINASC8MOVADR_TAB,OFFSETBIN2MOVADR_TAB+2,OFFSETCUNT+1MOVADR_TAB+4,OFFSETASCBUP+8MOVBX,OFFSETADR_TAB;傳表首址CALLBINASC16......25BINASCPROCBINASC8:MOVDI,[BX];取待轉(zhuǎn)換8位數(shù)據(jù)MOVDH,[DI]JMPTRANBINASC16:MOVDI,[BX];取待轉(zhuǎn)換16位數(shù)據(jù)MOVDX,[DI]TRAN:MOVDI,[BX+2];取待轉(zhuǎn)換數(shù)據(jù)位數(shù)MOVCL,[DI]XORCH,CHMOVDI,[BX+4]:取存ASCII碼首址LOP:ROLDX,1MOVAL,DL;待轉(zhuǎn)換的1位送到AL中轉(zhuǎn)換ANDAL,1ADDAL,30H;構(gòu)成相應(yīng)的ASCII碼MOV[DI],AL;存結(jié)果INCDILOOPLOPRET轉(zhuǎn)換子程序設(shè)置兩個入口,一個是轉(zhuǎn)換8位數(shù)據(jù)的入口BINASC8,另一個是轉(zhuǎn)換16位數(shù)據(jù)的入口BINASC16。266.4DOS功能子程序調(diào)用DOS操作系統(tǒng)為程序設(shè)計人員提供了可以直接調(diào)用的功能子程序。調(diào)用這些子程序可以實(shí)現(xiàn)從鍵盤輸入數(shù)據(jù),將數(shù)據(jù)送顯示器顯示,以及磁盤操作等功能。調(diào)用這些子程序時,需要使用軟中斷指令I(lǐng)NT21H,并且在執(zhí)行該指令之前,需要將要調(diào)用的功能號送入寄存器AH中,有關(guān)的參量送入指定的寄存器。調(diào)用過程包括以下三個步驟:*送入口參量給指定寄存器*AH<=功能號*INT21H27調(diào)用該功能子程序?qū)⒌却I盤輸入,直到按下一個鍵。將字符的ASCII碼送入AL寄存器,并在屏幕上顯示該字符。如果是Ctrl-C組合鍵,則停止程序運(yùn)行。該功能調(diào)用無入口參量。1、帶顯示的鍵盤輸入(1號功能)例如:MOVAH,01HINT21H2、不帶顯示的鍵盤輸入(8號功能)該功能調(diào)用與1號功能的作用相似,區(qū)別是8號功能將不顯示輸入的字符。調(diào)用方法為:MOVAH,8INT21H283、不帶顯示的鍵盤字符輸入(7號功能)MOVAH,7INT21H4、字符串輸入(0AH號功能)該功能與8號功能相似,但對Ctrl-C組合鍵和TAB制表鍵無反應(yīng)。調(diào)用方法:該功能調(diào)用可實(shí)現(xiàn)從鍵盤輸入一個字符串,其長度可達(dá)255個字符。調(diào)用該功能前,應(yīng)在內(nèi)存中建立一個輸入緩沖區(qū)。緩沖區(qū)第一個字節(jié)是可輸入的最大字符數(shù)+1;第二個字節(jié)是系統(tǒng)在調(diào)用該功能時,自動填入的本次調(diào)用時實(shí)際輸入的字符個數(shù);從第三個字節(jié)開始存放輸入字符的ASCII碼。29當(dāng)用戶輸入回車鍵時,結(jié)束輸入,并將回車鍵的ASCII碼(0DH)作為最后一個字符送入緩沖區(qū)。但它不計入實(shí)際輸入字符個數(shù)。調(diào)用入口參量:DS和DX寄存器分別裝入輸入緩沖區(qū)的段基值和偏移量CHAR_BUFDB31H;緩沖區(qū)的最大長度DB0;存實(shí)際輸入字符數(shù)DB31HDUP(0);輸入緩沖區(qū)......MOVDX,SEGCHAR_BUF;如果DS已經(jīng)指向CHAR_BUF所在MOVDS,DX;數(shù)據(jù)段,則可以省去這兩條指令MOVDX,OFFSETCHAR_BUFMOVAH,0AHINT21H305、字符顯示(2號功能)該功能實(shí)現(xiàn)在屏幕上顯示單個字符。入口參數(shù):DL<=要顯示字符的ASCII碼。例如:MOVDL‘A’MOVAH,2INT21H6、字符打?。?號功能)該功能將字符送入打印機(jī)接口,實(shí)現(xiàn)單個字符的打印操作。入口參數(shù):DL<=打印字符的ASCII碼MOVDL,‘A’MOVAH,5INT21H317、字符串顯示(9號功能)該功能實(shí)現(xiàn)將一個字符串顯示到屏幕上。入口參數(shù):(1)將待顯示的字符串存放在一個數(shù)據(jù)緩沖區(qū),字符串以符號“$”作為結(jié)束標(biāo)志。(2)將字符串的首址的段基值和偏移量分別送入DS和DX中例如:CHARDB‘Thisisatest.’,0AH,0DH,’$’..........MOVDX,OFFSETCHARMOVAH,9INT21H328、直接輸入輸出(6號功能)例如:顯示美圓符號“$”的程序段為:MOVDL,24H;$的ASCII碼為24HMOVAH,06
INT21H該功能可以實(shí)現(xiàn)鍵盤輸入,也可以實(shí)現(xiàn)屏幕顯示操作。兩種操作通過DL的內(nèi)容確定。(1)(DL)=00—0FEH,顯示輸出。DL中是所顯示字符的ASCII碼。33(2)(DL)=FFH,從鍵盤輸入字符該功能的字符輸入不等待鍵盤輸入,而是從鍵盤緩沖區(qū)中讀取。讀取
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 贛州師范高等??茖W(xué)校《高級業(yè)績管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南師范大學(xué)科技學(xué)院《健美運(yùn)動》2023-2024學(xué)年第一學(xué)期期末試卷
- 預(yù)防艾滋病安全教育課件
- 贛東學(xué)院《可持續(xù)發(fā)展》2023-2024學(xué)年第一學(xué)期期末試卷
- 中小學(xué)生電腦制作課件
- 七年級語文上冊單元清二新人教版
- 七年級道德與法治上冊第二單元友誼的天空第五課交友的智慧第1框讓友誼之樹常青說課稿新人教版
- 三年級數(shù)學(xué)上冊6多位數(shù)乘一位數(shù)綜合與實(shí)踐數(shù)字編碼導(dǎo)學(xué)案新人教版
- 三年級科學(xué)上冊第三單元天氣與我們的生活第十七課大雁南飛教案青島版
- 2022年東北林業(yè)大學(xué)自考英語(二)練習(xí)題(附答案解析)
- 數(shù)據(jù)中心供電系統(tǒng)應(yīng)用方案
- (正式版)SH∕T 3507-2024 石油化工鋼結(jié)構(gòu)工程施工及驗(yàn)收規(guī)范
- 中東及非洲注塑成型模具行業(yè)現(xiàn)狀及發(fā)展機(jī)遇分析2024-2030
- 牡丹江2024年黑龍江牡丹江醫(yī)科大學(xué)招聘109人筆試歷年典型考題及考點(diǎn)附答案解析
- 貴州省黔西南布依族苗族自治州2023-2024學(xué)年六年級下學(xué)期6月期末語文試題
- 泰州市2022-2023學(xué)年七年級上學(xué)期期末數(shù)學(xué)試題【帶答案】
- JGJ276-2012 建筑施工起重吊裝安全技術(shù)規(guī)范 非正式版
- 2019電子保單業(yè)務(wù)規(guī)范
- 學(xué)堂樂歌 說課課件-2023-2024學(xué)年高中音樂人音版(2019) 必修 音樂鑒賞
- 幕墻工程材料組織、運(yùn)輸裝卸和垂直運(yùn)輸方案
- 灌溉用水循環(huán)利用技術(shù)
評論
0/150
提交評論