第11講 程序設(shè)計方法二_第1頁
第11講 程序設(shè)計方法二_第2頁
第11講 程序設(shè)計方法二_第3頁
第11講 程序設(shè)計方法二_第4頁
第11講 程序設(shè)計方法二_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

工程:排序工程要求與目的〔1〕工程要求:編寫程序?qū)崿F(xiàn):在數(shù)據(jù)段中,有一個無序排列的無符號數(shù)組,這無符號數(shù)組存放的就是某次考試的學(xué)生成績,其首地址存放在SI存放器中,數(shù)組中的第一個單元存放著數(shù)組長度,即考試考生人數(shù)。要求對這個無符號數(shù)組按降序排序,當(dāng)然數(shù)組的第一個單元存放的仍然為數(shù)組長度?!?〕工程目的:學(xué)習(xí)匯編的子程序結(jié)構(gòu)和模塊化程序設(shè)計方法。1§4-4程序設(shè)計方法——子程序結(jié)構(gòu)1.子程序使用:子程序:將屢次使用的程序段寫成一個相對獨立的程序段,稱為子程序或過程。子程序結(jié)構(gòu)的定義:使用過程定義語句PROC…ENDP。屬性:調(diào)用程序和過程在同一代碼段中,那么用NEAR屬性;調(diào)用程序和過程不在同一代碼段中,使用FAR屬性。主過程定義為FAR屬性,看作DOS調(diào)用的一個子過程。子程序說明:⑴功能描述:名稱,功能及性能⑵存放器,存儲單元⑶入口參數(shù),出口參數(shù)⑷調(diào)用其它子程序的名稱四、子程序結(jié)構(gòu)2§4-4程序設(shè)計方法——子程序結(jié)構(gòu)例12有一個子程序說明如下:;名稱:BCD2BIN;功能:將一個字節(jié)的BCD碼轉(zhuǎn)換成二進制數(shù);所用存放器:CX;入口參數(shù):AL存放兩位BCD碼;出口參數(shù):AL存放二進制數(shù);調(diào)其它子程序:無子程序形式如下;3§4-4程序設(shè)計方法——子程序結(jié)構(gòu)BCD2BIN PROC NEAR(或FAR)

PUSHCX

MOV CH,AL AND CH,0FH ;存低4位 MOV CL,4 SHR AL,CL ;高4位右移4位后乘10 MOV CL,10 MUL CL ADD AL,CH ;高4位加低4位

POP CX RETBCD2BIN ENDP4§4-4程序設(shè)計方法——子程序結(jié)構(gòu)注意:⑴保護調(diào)用程序的斷點:由CALL指令本身完成。要注意堆棧的使用,防止彈出地址值錯誤。⑵保護某些存放器內(nèi)容:在子程序開頭,用一組PUSH指令,保護的存放器原來的內(nèi)容;在子程序結(jié)尾,用一組POP指令,將存放器原來的內(nèi)容恢復(fù)。注意:PUSH和POF指令組的使用次序。⑶主程序與子程序相互之間參數(shù)的傳遞:參數(shù)傳遞的方法有3種:①用存放器傳遞參數(shù):參數(shù)較少,速度較快。②用存儲器傳遞參數(shù):參數(shù)較多,需事先在存儲器中建立一個參數(shù)表。③用堆棧傳遞參數(shù):參數(shù)較多,多用在子程序嵌套與遞歸調(diào)用中。5§4-4程序設(shè)計方法——子程序結(jié)構(gòu)

例13數(shù)據(jù)段定義兩個數(shù)組,編程序?qū)崿F(xiàn)數(shù)組段分別求和(不計溢出)。解:本例通過存儲器來傳遞參數(shù)。相應(yīng)程序如下:DATA SEGMENT ARY1 DW100DUP(?) ;定義數(shù)組1 SUM1 DW? ARY2 DW100DUP(?) ;定義數(shù)組2 SUM2 DW?DATA ENDSSTACK SEGMENTSTACK SA DW50DUP(?)

TOP EQULENGTHSASTACKENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK6§4-4程序設(shè)計方法——子程序結(jié)構(gòu)MAIN PROCFARSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,TOP

LEA SI,ARY1 ;數(shù)組1首地址,入口參數(shù) MOV CX,LENGTHARY1;數(shù)組1長度,入口參數(shù) CALL SUM ;調(diào)用求和子程序 LEA SI,ARY2 ;數(shù)組2首地址,入口參數(shù) MOV CX,LENGTHARY2;數(shù)組2長度,入口參數(shù) CALL SUM ;調(diào)用求和子程序 RETMAIN ENDP7§4-4程序設(shè)計方法——子程序結(jié)構(gòu)SUM PROC NEAR ;子程序 XOR AX,AX ;AX清0L1: ADD AX,WORDPTR[SI] ;加數(shù)組元素 INC SI INC SI LOOP L1 MOV WORDPTR[SI],AX ;數(shù)組和送入SUM MOV AH,4CH INT 21H RETSUM ENDP ;子程序返回CODE EDNS END START8§4-4程序設(shè)計方法——子程序結(jié)構(gòu)

例14通過堆棧傳遞參數(shù),實現(xiàn)十進制數(shù)數(shù)組求和,要求主程序和過程不在同一個代碼段中,要進行段間調(diào)用。相應(yīng)程序如下:MDATA SEGMENT ARY1 DB20DUP(?) ;定義數(shù)組1 SUM1 DW? ARY2 DB20DUP(?) ;定義數(shù)組2 SUM2 DW?MDATA ENDSMSTACK SEGMENTSTACK SB DW100DUP(?)

TOP LABELWORDMSTACK ENDSMCODE SEGMENT ;主程序段 ASSUMECS:MCODE,DS:MDATA,SS:MSTACKMAIN PROC FARSTART: MOV AX,MSTACK MOV SS,AX MOV SP,OFFSETTOP9§4-4程序設(shè)計方法——子程序結(jié)構(gòu) PUSH DS ;初始化DS,SS,SP MOV AX,0 PUSH AX MOV AX,MDATA MOV DS,AX

MOV AX,OFFSETARY1 ;PADD過程入口參數(shù)進棧 PUSH AX ;數(shù)組地址 MOV AX,SIZEARY1 ;數(shù)組長度 PUSH AX CALL FARPTRPADD

MOV AX,OFFSETARY2 PUSH AX MOV AX,SIZEARY2 PUSH AX CALL FARPTRPADD RETMAIN ENDPMCODEENDS10§4-4程序設(shè)計方法——子程序結(jié)構(gòu)PCODE SEGMENT;過程段 ASSUMECS:PCODE,DS:MDATA,SS:MSTACKPADD PROC FAR PUSH BX;存放器保護 PUSH CX PUSH BP MOV BP,SP PUSHF ;標(biāo)志入棧 MOV CX,[BP+10] ;數(shù)組長度→CX MOV BX,[BP+12];數(shù)組ARY起始地址→BX MOV AX,0NEXT: ADD AL,[BX] ;數(shù)組相加 DAA MOV DL,AL ;‘低位和’入DL暫存 MOV AL,0 11§4-4程序設(shè)計方法——子程序結(jié)構(gòu) ADC AL,AH ;AH+進位→AL DAA MOV AH,AL ;進位→AH MOV AL,DL ;從DL中取回低位和 INC BX LOOP NEXT MOV [BX],AX ;送數(shù)組和→SUM POPF ;標(biāo)志出棧 POP BP POP CX POP BX RET 4 ;返回作廢參數(shù)

;彈出返回地址后,再彈出4個字節(jié)數(shù)據(jù)PADD ENDP PCODE ENDS ENDSTART12§4-4程序設(shè)計方法——子程序結(jié)構(gòu)該例用堆棧傳遞參數(shù),堆棧中數(shù)據(jù)變化如以下圖所示。總結(jié):⑴調(diào)用前通過堆棧傳遞兩個參數(shù):數(shù)組的偏移地址值,數(shù)組長度。⑵進入過程時重新定義CS段:指向當(dāng)前代碼段PCODE。因為程序設(shè)計要求段間過程調(diào)用。⑶過程返回時:用返回指令RET4,將通過堆棧傳遞的4個參數(shù)作廢。13§4-4程序設(shè)計方法——子程序結(jié)構(gòu)14§4-4程序設(shè)計方法——子程序結(jié)構(gòu)堆棧的變化:①初始化后,SP指向堆棧底,堆棧為空;②主程序調(diào)用過程前,二個參數(shù)(數(shù)組偏移地址及數(shù)組長度)已入棧;③執(zhí)行CALL指令時,返回地址自動入棧;④過程中:BX,CX,BP,標(biāo)志存放器入棧;繼續(xù)執(zhí)行過程段PCODE程序,利用BP,在堆棧中位置[BP+12]處獲取數(shù)組偏移地址,在堆棧中位置[BP+10]處獲取數(shù)組長度。⑤過程運行到RET4之前,由POP指令將PSW,BP,CX及BX相繼彈出。⑥堆棧中還有4個字節(jié)的參數(shù)SIZE1和ARY1會影響下次過程調(diào)用參數(shù)的正確傳遞,用RET4將此4個字節(jié)的參數(shù)彈出作廢。15§4-4程序設(shè)計方法——子程序結(jié)構(gòu)2.子程序嵌套與遞歸調(diào)用:子程序嵌套:子程序本身又調(diào)用其它子程序。只要堆??臻g足夠嵌套的層數(shù)不限。圖5-12給出了子程序嵌套示意圖。遞歸調(diào)用:子程序調(diào)用子程序本身。16§4-4程序設(shè)計方法——子程序結(jié)構(gòu)例15己知兩個無符號數(shù)125及468,求它們的和并將和轉(zhuǎn)換成十六進制數(shù)在屏幕上顯示。DATA SEGMENT P DW125,368 SUM DW?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATAMAIN PROC FARSTART PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX

MOV SI,OFFSETP

;數(shù)組起始地址→SI

CALL PADD

;兩數(shù)相加子程序 RETMAIN ENDP17§4-4程序設(shè)計方法——子程序結(jié)構(gòu)PADD PROC NEAR ;兩數(shù)相加子程序

PUSH AX PUSH BX PUSH CX PUSH DX

MOV AX,[SI]

;數(shù)組起始地址→SI

ADD AX,[SI+2] MOV SUM,AX CALL DISP ;顯示子程序

POP DX POP CX POP BX POP AX RETPADD ENDP18§4-4程序設(shè)計方法——子程序結(jié)構(gòu)DISP PROC NEAR ;顯示子程序

MOV BX,SUM

MOV CH,4

;16進制數(shù)的位數(shù)L1: MOV CL,4

ROL BX,CL ;循環(huán)左移4次:高4位→低4位

MOV AL,BL

AND AL,0FH

ADD AL,30H

;化成ASCII碼

CMP AL,3AH JL L2 ADD AL,07HL2: MOVDL,AL ;顯示 MOV AH,2 INT 21H DEC CH JNZ L1 RETDISP ENDPCODE ENDS END START19§4-4程序設(shè)計方法——子程序結(jié)構(gòu)例16要求計算N!(N>=0)解:遞歸調(diào)用的應(yīng)用:N?。絅*(N一1)*(N一2)…*1N!=1, N=0N?。絅*(N一1)!, N>0計算核心:N!子程序。注意入棧信息。N!子程序說明:;名稱:FACT;功能:階乘子程序;入口參數(shù):AL=N;出口參效:DX=N?。皇褂么娣牌鳎篊X20§4-4程序設(shè)計方法——子程序結(jié)構(gòu)具體程序如下:ADATA SEGMENT D1 DB4 ;N=4 D2 DW2DUP(?) ;存放運算結(jié)果ADATA ENDSASTACK SEGMENTPARASTACK‘STACK’ SA DW100DUP(?)

TOP LABELWORDASTACK ENDSACODE SEGMENT ASSUMECS:ACODE,DS:ADATA,SS:ASTACK21§4-4程序設(shè)計方法——子程序結(jié)構(gòu)MAIN PROC FARSTART: MOV AX,ASTACK MOV SS,AX MOV SP,OFFSETTOP PUSH DS MOV AX,0 PUSH AX MOV AX,ADATA ;初始化DS,SS,SP MOV DS,AX

MOV DX,0 ;DX=N! MOV AH,0 ;AH清零,為AL入棧保護 MOV BX,OFFSETD1 ;數(shù)據(jù)指針 MOV AL,[BX] ;AL=N,子程序的入口參數(shù)

CALL FACTLP1: MOV [BX+1],DX RETMAIN ENDP22§4-4程序設(shè)計方法——子程序結(jié)構(gòu)FACT PROC ;N!子程序 CMP AL,0 JNZ CHN MOV DL,1 ;N=0,N!=1

RETCHN: PUSH AX ;N入棧 DEC AL ;N-1

CALL FACT ;遞歸調(diào)用FACT子程序LP2: POP AX ;N彈出 MUL DL ;N逐層返回相乘 MOV DX,AX ;送結(jié)果到內(nèi)存

RETFACT ENDPACODE ENDS END START

23§4-4程序設(shè)計方法——綜合舉例1.代碼轉(zhuǎn)換:例17將十六位二進制數(shù)轉(zhuǎn)換成4位壓縮型BCD碼算法:將AX中的二進制數(shù)先后除以l000、100和10,每次除法所得的商,即是BCD數(shù)的千位、百位和十位數(shù),余數(shù)是個位數(shù)。(例如,810D=032AH,9999D=270FH,)子程序名:B2TOBCD輸入?yún)?shù):AX=十六位二進制數(shù)輸出參數(shù):CF=0,那么AX=4位壓縮型BCD碼;CF=1,那么要轉(zhuǎn)換的數(shù)大于9999,AX不變。使用存放器:CX:存放除數(shù);DX:存放中間結(jié)果。五、綜合舉例24§4-4程序設(shè)計方法——綜合舉例B2TOBCD PROC FAR CMP AX,9999 ;AX>9999,那么CF置1 JBE TRAN STC JMP EXITTRAN: PUSH CX PUSH DX SUB DX,DX ;DX清0 MOV CX,1000 ;計算千位數(shù) DIV CX ;商在AX,余數(shù)在DX XCHG AX,DX ;商在DX中,余數(shù)在AX中;DX=___× MOV CL,4 SHL DX,CL ;DX左移4位,DX=__×_ MOV CL,100 ;計算百位數(shù) DIV CL25§4-4程序設(shè)計方法——綜合舉例 ADD DL,AL ;百位數(shù)加到DL中,DX=__×× MOV CL,4 SHL DX,CL ;DX左移4位,DX=_××_ XCHG AL,AH ;余數(shù)保存在AL中 SUB AH,AH MOV CL,10 ;計算十位數(shù) DIV CL ADD DL,AL ;十位數(shù)加到DL中,DX=_××× MOV CL,4 SHL DX,CL ;DX左移4位,DX=×××_ ADD DL,AH ;加個位數(shù),DX=×××× MOV AX,DX ;結(jié)果送到AX中 POP DX POP CXEXIT: RETB2TOBCD ENDP26§4-4程序設(shè)計方法——綜合舉例例18將十進制數(shù)的ASCII字符串轉(zhuǎn)換成有符號二進制數(shù)算法:首先檢測字符串為正還是為負,假設(shè)是為負,將標(biāo)識符MINU置1,然后進行字符串轉(zhuǎn)換,轉(zhuǎn)換結(jié)束判別標(biāo)識符MINU,假設(shè)MINU是1,把AX中的數(shù)取補。字符串轉(zhuǎn)換方法:采用累加和(DX)乘10,然后讀取下一個字符并轉(zhuǎn)換成二進制數(shù)加到累加和中?!怖?1965=(((4×10+1)×10+9)×10+6)×10+5〕子程序名:AS2BIN輸入?yún)?shù):DX=字符串偏移量;CX=字符串字符個數(shù)輸出參數(shù):CF=0,那么AX=二進制數(shù);CF=1,那么字符串非法,AX=0。使用存放器:SI,BX27§4-4程序設(shè)計方法——綜合舉例AS2BIN PROC FAR PUSH CX PUSH DX PUSH SI MOV SI,DX ;字符串指針DX存到SI中 CMP CX,6 ;最長6位 JA ERR CLD MOV AL,[SI] ;查符號 CMP AL,‘-’ JNE CHK MOV MINU,1 ;帶負號,例:‘-41965’ JMP DECSCHK: CMP AL,‘+’ ;帶正號,例:‘+41965’ JNE CLRDDECS: DEC CX ;長度減1 INC SI ;指針下移CLRD: SUB DX,DX ;DX清0,放結(jié)果28§4-4程序設(shè)計方法——綜合舉例NEXT:

CALL CHE ;乘10 JC ERR ;積超過65535出錯 LODSB ;讀下一個字符到AL CMP AL,‘0’ ;字符不在0~9之間,出錯 JB ERR CMP AL,‘9’ JA ERR AND AX,000FH ;轉(zhuǎn)換成二進制數(shù) ADD DX,AX JC ERR ;累加和超過65535出錯

LOOP NEXT MOV AX,DX ;結(jié)果送入AX CMP MINU,1 ;負數(shù)求補 JNE EXIT NEG AX ;求補 JMP EXITERR: STC ;字符串為非法29§4-4程序設(shè)計方法——綜合舉例

MOV AX,0EXIT: POP SI POP DX POP CX

RETCHE PROC NEAR;乘10子程序,第1次調(diào)用,

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論