




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第七章子程序設計與多模塊編程7.1子程序的引出7.2子程序(過程)定義偽指令7.3調用和返回指令7.4子程序設計方法7.5子程序嵌套7.6遞歸子程序7.7可重入子程序7.8程序的連接7.1子程序的引出在我們編寫解決實際問題的程序時,往往會遇到多處使用相同功能的程序段,使用該程序段的唯一差別是對程序變量賦不同的值,例如計算:S=√2X+√3Y+√150計算上述函數(shù)需要多次使用開方運算,如果每次用到開方運算就編寫一段開方程序,那末開方程序在程序中會多次出現(xiàn),不僅書寫麻煩,容易出錯,編輯、匯編它時,也會花費較多時間。同時,由于冗長,占用內存也較多。如果把多次使用的功能程序編制為一個獨立的程序段,每當用到這種功能時,就將控制轉向它,完成功能后再返回到原來的程序,這就會大大減少編程工作量。7.1子程序的引出
使用子程序的好處:(1)簡化了程序設計過程,減少了工作量,節(jié)省了時間;(2)源程序縮短,節(jié)省了機器匯編源程序的時間和存儲目標代碼的存儲空間;(3)增加了源程序的可讀性,便于調試維護;(4)有利于程序模塊化、結構化和自頂向下的程序設計;(5)子程序一旦編制成功,在開發(fā)研制各種軟件時都可利用,大大縮短了軟件的開發(fā)周期。7.1子程序的引出
子程序設計需了解的問題:1.子程序的定義與調用設計出可以完成相對獨立功能的程序段,并對匯編程序提供必要的信息,使得對該程序段匯編之后,在需要時可以被其他主程序調用,這一過程稱為子程序的定義。已定義的子程序在什么時候被執(zhí)行,執(zhí)行多少次,都不是由子程序自身決定的。在主程序需要調用相應的子程序時,可以用調用子程序指令使得相應子程序被執(zhí)行。2.主程序與子程序之間的調用與返回在主程序需要利用子程序的執(zhí)行來完成某種工作時,就可以使用調用子程序指令來調用相應的子程序;在子程序完成它應該完成的工作之后,應當用返回指令返回調用它的主程序。主程序::CALLSUBR::子程序SUBR:::::RET7.2子程序(過程)定義偽指令子程序定義偽指令所定義的子程序的一般格式:PNPROC[NEAR]/[FAR];說明過程開始:;過程體:RETPNENDP;說明過程結束7.3調用和返回指令1.調用分類(1)段內調用與段間調用段內調用:轉返地址只用IP實現(xiàn);段間調用:轉返地址由CS和IP實現(xiàn)。(2)直接調用與間接調用直接調用:調用指令使用過程名調用過程,過程的指令入口地址偏移量直接送入IP來實現(xiàn)。間接調用:調用指令通過某寄存器或某存儲器單元指出被調用程序的入口地址。2.調用指令
指令匯編格式:CALLPROCNAME/REGNAME/MEMLABEL
操作:(1)段內調用:SP←SP-2(SP+1,SP)←IPIP←OFFSETPROCNAME或REGNAME或(MEMLABEL)
(2)段間調用:SP←SP-2(SP+1,SP)←CSCS←SEGPROCNAME或(MEMLABEL+2,MEMLABEL+3)SP←SP-2(SP+1,SP)←IPIP←OFFSETPROCNAME或(MEMLABEL,MEMLABEL+1)受影響的寄存器:沒有3.返回指令指令匯編格式:RET[VAL]操作:(1)段內返回:IP←(SP+1,SP)SP←SP+2SP←SP+VAL(如果選用了VAL)
(2)段間返回:IP←(SP+1,SP)SP←SP+2CS←(SP+1,SP)SP←SP+2SP←SP+VAL(如果選用了VAL)受影響的寄存器:沒有7.4子程序設計方法7.4.1現(xiàn)場的保護和恢復7.4.2子程序說明文件7.4.3主程序與子程序之間的參數(shù)傳遞7.4.1現(xiàn)場的保護和恢復子程序中需要使用的寄存器,有可能在主程序中正被用來保存某種中間結果,這些寄存器的值在從子程序返回主程序后還要繼續(xù)使用,這些寄存器的值或所需的標志位的值等信息稱之為現(xiàn)場。顯然,子程序執(zhí)行前需要保護現(xiàn)場,返回時要恢復現(xiàn)場。保存現(xiàn)場與恢復現(xiàn)場的工作既可在調用程序中完成,也可在子程序中完成,程序設計時根據(jù)情況安排。如果子程序已經設計好了,而其中未保護主程序現(xiàn)場,那么調用程序在使用子程序之前應保護現(xiàn)場,從子程序返回后再恢復現(xiàn)場。通常在主程序中保護現(xiàn)場,則一定在主程序中恢復;在子程序中保護現(xiàn)場,則一定在子程序中恢復。這樣可以增強主程序和子程序之間的相對獨立性,減少相互依賴,使程序結構清楚,減少錯誤。7.4.1現(xiàn)場的保護和恢復保護現(xiàn)場和恢復現(xiàn)場的方法:(1)利用壓棧和出棧指令,將寄存器內容或狀態(tài)標志位內容保存在堆棧中,恢復時再從堆棧中取出。例子:
SQROOT1PROC NEARPUSHAX ;保存現(xiàn)場PUSHBXPUSHCX... ;子程序正常工作POPCX ;恢復現(xiàn)場POPBXPOPAXRETSQROOT1ENDP(2)利用內存單元。用傳送指令將寄存器的內容保存到指定的內存單元,恢復時再用傳送指令取出。7.4.2子程序說明文件(1)子程序名(子程序入口地址):用過程(子程序)定義偽指令定義該過程(子程序)時的過程名,這時過程(子程序)中第一條語句必須是子程序的入口指令;否則應寫子程序入口指令的標號或地址。(2)子程序功能:用自然語言或數(shù)學語言等形式簡單清楚地描述子程序完成的任務。(3)入口條件:說明子程序要求有幾個入口參數(shù),這些參數(shù)表示的意義及存放位置。(4)出口條件:說明子程序有幾個輸出參數(shù)(運行結果),這些參數(shù)表示的意義、存放的位置。(5)受影響的寄存器:說明子程序運行后,哪些寄存器的內容被破壞了,以便使用者在調用該子程序之前注意保護現(xiàn)場。7.4.2子程序說明文件子程序說明文件例子:(1)子程序名:SQROOT1;(2)程序功能:求雙字節(jié)整數(shù)的平方根的整數(shù)部分;(3)入口條件:被開方數(shù)放在DX中;(4)出口條件:平方根在DX中;(5)受影響的寄存器:AX,BX,CX,DX及標志寄存器F。7.4.3主程序與子程序之間的參數(shù)傳遞子程序運行時所需的加工對象應由調用程序提供,處理的結果應提供調用程序使用,二者之間要進行信息交換或者說相互之間要傳遞參數(shù)。常用的傳送方法有四種:(1)約定寄存器法;(2)約定存儲單元法;(3)堆棧法;(4)約定參數(shù)地址指針法。以計算下述函數(shù)為例,說明各種參數(shù)傳送方法。
例7.1編制程序計算:Z=√2X+√3Y+√150設X,Y為整數(shù)字數(shù)據(jù),且存于PX和PY單元,計算結果存入RLT單元。1.約定寄存器法
約定寄存器法傳送參數(shù),即事先約定一些存放參數(shù)的通用寄存器,調用程序轉向子程序時,先把要傳送的參數(shù)放到約定好的寄存器中,子程序工作時,從約定的寄存器中取參數(shù),然后把結果存入事先約定的寄存器中,調用程序再從約定的寄存器中取結果。這種方法是程序設計中最常用、最簡單、最方便的方法,在傳送參數(shù)不多的情況下都采用此方法。1.約定寄存器法
開平方子程序和調用程序,約定將被開平方數(shù)放在DX中,平方根也放在DX中,其結果求得平方根的整數(shù)部分。1:;*****EXAM7.1.1S*****2:SQROOT1 PROC NEAR3: XOR AX,AX ;i←04: AND DX,DX ;測試被開方數(shù)5: JZ SQRT2 ;被開方數(shù)為06:SQRT1: MOV BX,AX ;形成奇數(shù)7: SHL BX,18: INC BX9: SUB DX,BX ;被開方數(shù)減去奇數(shù)10: JC SQRT2 ;不夠減11: INC AX ;夠減,i增112: JMP SQRT1 ;繼續(xù)13:SQRT2: MOV DX,AX ;DX←平方根14: RET ;返回15:SQROOT1 ENDP1.約定寄存器法調用程序:1:;*****EXAM7.1.1M*****2:SSEGSEGMENTSTACK3:STKTOPDB20DUP(0)4:SSEGENDS5:DSEGSEGMENT6:PXDW123457:PYDW24698:RLTDW09:DSEGENDS10:CSEGSEGMENT11:ASSUMECS:CSEG,DS:DSEG12:ASSUMESS:SSEG13:MAIN1:MOVAX,DSEG14:MOVDS,AX15:MOVAX,SSEG16:MOVSS,AX
17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X20: CALL SQROOT1 ;調用開平方子程序21: PUSH DX ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX26: CALL SQROOT1 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,15031: CALL SQROOT132: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN1SQROOT1 PROC NEAR XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV DX,AX RETSQROOT1 ENDP17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X20: CALL SQROOT1 ;調用開平方子程序21: PUSH DX ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX26: CALL SQROOT1 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,15031: CALL SQROOT132: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN1SQROOT1 PROC NEAR XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV DX,AX RETSQROOT1 ENDP①②③④⑤初始態(tài)(執(zhí)行指令①后)17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X20: CALL SQROOT1 ;調用開平方子程序21: PUSH DX ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX26: CALL SQROOT1 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,15031: CALL SQROOT132: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN1SQROOT1 PROC NEAR XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV DX,AX RETSQROOT1 ENDP①②③④⑤執(zhí)行指令②后17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X20: CALL SQROOT1 ;調用開平方子程序21: PUSH DX ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX26: CALL SQROOT1 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,15031: CALL SQROOT132: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN1SQROOT1 PROC NEAR XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV DX,AX RETSQROOT1 ENDP①②③④⑤執(zhí)行指令RET后17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X20: CALL SQROOT1 ;調用開平方子程序21: PUSH DX ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX26: CALL SQROOT1 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,15031: CALL SQROOT132: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END MAIN1SQROOT1 PROC NEAR XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV DX,AX RETSQROOT1 ENDP①②③④⑤執(zhí)行指令③后17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X20: CALL SQROOT1 ;調用開平方子程序21: PUSH DX ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX26: CALL SQROOT1 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,15031: CALL SQROOT132: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN1SQROOT1 PROC NEAR XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV DX,AX RETSQROOT1 ENDP①②③④⑤執(zhí)行指令④后17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X20: CALL SQROOT1 ;調用開平方子程序21: PUSH DX ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX26: CALL SQROOT1 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,15031: CALL SQROOT132: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN1SQROOT1 PROC NEAR XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV DX,AX RETSQROOT1 ENDP①②③④⑤執(zhí)行指令RET后17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X20: CALL SQROOT1 ;調用開平方子程序21: PUSH DX ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX26: CALL SQROOT1 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,15031: CALL SQROOT132: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END MAIN1SQROOT1 PROC NEAR XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV DX,AX RETSQROOT1 ENDP①②③④⑤執(zhí)行指令⑤后2.約定存儲單元法
約定存儲單元法傳送參數(shù),與約定寄存器法類似。下面設計的開平方子程序與調用程序,約定被開方數(shù)放在ARGX單元,計算結果放入ROOT單元。1:;*****EXAM7.1.2S*****2:SQROOT2 PROC NEAR3: XOR AX,AX ;i←04: AND DX,DX ;測試被開方數(shù)5: JZ SQRT2 ;被開方數(shù)為06:SQRT1: MOV BX,AX ;形成奇數(shù)7: SHL BX,18: INC BX9: SUB DX,BX ;被開方數(shù)減去奇數(shù)10: JC SQRT2 ;不夠減11: INC AX ;夠減,i增112: JMP SQRT1 ;繼續(xù)13:SQRT2: MOV DX,AX 14: RET ;返回15:SQROOT2 ENDPMOVDX,ARGXMOVROOT,AX17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X MOV ARGX,DX20: CALL SQROOT2 ;調用開平方子程序21: PUSH ROOT ;暫存結果√2X22: MOV DX,PY ;取Y23: MOV AX,DX ;計算3Y24: ADD DX,DX25: ADD DX,AX MOV ARGX,DX26: CALL SQROOT2 ;調用開平方子程序27: POP AX ;取出√2X28: ADD AX,ROOT ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV ARGX,15031: CALL SQROOT232: POP AX ;取出中間結果33: ADD AX,ROOT ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN1SQROOT2 PROC NEAR XOR AX,AX MOV DX,ARGX
AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV ROOT,AX RETSQROOT2 ENDP3.堆棧法
堆棧法傳送參數(shù)是調用程序先將參數(shù)壓入堆棧,子程序從堆棧中把參數(shù)取出,進行處理,然后把結果壓入堆棧,調用程序再從堆棧中取出結果。1:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4: INC SP5: POP DX6: XOR AX,AX ;i←07: AND DX,DX ;測試被開方數(shù) . . .13:SQRT2: PUSH AX14: DEC SP15: DEC SP 16: RET ;返回17:SQROOT3 ENDP17:①MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X② PUSH DX20:③ CALL SQROOT3 22: MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX④ PUSH DX26:⑤ CALL SQROOT3 ⑥ POP DX27:⑦ POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4: INC SP5: POP DX6: XOR AX,AX 7: AND DX,DX . . .13:SQRT2: PUSH AX14: DEC SP15: DEC SP 16: RET ;返回17:SQROOT3 ENDP初始態(tài)(執(zhí)行指令①后)17:①MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X② PUSH DX20:③ CALL SQROOT3 22: MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX④ PUSH DX26:⑤ CALL SQROOT3 ⑥ POP DX27:⑦ POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4:⑧ INC SP5:⑨ POP DX6: XOR AX,AX 7: AND DX,DX . . .13:㈠SQRT2: PUSH AX14: DEC SP15:㈡ DEC SP 16: RET ;返回17:SQROOT3 ENDP執(zhí)行指令②后17:①MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X② PUSH DX20:③ CALL SQROOT3 22:xxyy MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX④ PUSH DX26:⑤ CALL SQROOT3 ⑥ POP DX27:⑦ POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4:⑧ INC SP5:⑨ POP DX6: XOR AX,AX 7: AND DX,DX . . .13:㈠SQRT2: PUSH AX14: DEC SP15:㈡ DEC SP 16: RET ;返回17:SQROOT3 ENDP執(zhí)行指令③后17:①MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X② PUSH DX20:③ CALL SQROOT3 22:xxyy MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX④ PUSH DX26:⑤ CALL SQROOT3 ⑥ POP DX27:⑦ POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4:⑧ INC SP5:⑨ POP DX6: XOR AX,AX 7: AND DX,DX . . .13:㈠SQRT2: PUSH AX14: DEC SP15:㈡ DEC SP 16: RET ;返回17:SQROOT3 ENDP執(zhí)行指令⑧后17:①MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X② PUSH DX20:③ CALL SQROOT3 22:xxyy MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX④ PUSH DX26:⑤ CALL SQROOT3 ⑥ POP DX27:⑦ POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4:⑧ INC SP5:⑨ POP DX6: XOR AX,AX 7: AND DX,DX . . .13:㈠SQRT2: PUSH AX14: DEC SP15:㈡ DEC SP 16: RET ;返回17:SQROOT3 ENDP執(zhí)行指令⑨后17:①MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X② PUSH DX20:③ CALL SQROOT3 22:xxyy MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX④ PUSH DX26:⑤ CALL SQROOT3 ⑥ POP DX27:⑦ POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4:⑧ INC SP5:⑨ POP DX6: XOR AX,AX 7: AND DX,DX . . .13:㈠SQRT2: PUSH AX14: DEC SP15:㈡ DEC SP 16: RET ;返回17:SQROOT3 ENDP執(zhí)行指令㈠后17:①MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X② PUSH DX20:③ CALL SQROOT3 22:xxyy MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX④ PUSH DX26:⑤ CALL SQROOT3 ⑥ POP DX27:⑦ POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4:⑧ INC SP5:⑨ POP DX6: XOR AX,AX 7: AND DX,DX . . .13:㈠SQRT2: PUSH AX14: DEC SP15:㈡ DEC SP 16: RET ;返回17:SQROOT3 ENDP執(zhí)行指令㈡后17:①MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X② PUSH DX20:③ CALL SQROOT3 22:xxyy MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX④ PUSH DX26:⑤ CALL SQROOT3 ⑥ POP DX27:⑦ POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT3 PROC NEAR3: INC SP4:⑧ INC SP5:⑨ POP DX6: XOR AX,AX 7: AND DX,DX . . .13:㈠SQRT2: PUSH AX14: DEC SP15:㈡ DEC SP 16: RET ;返回17:SQROOT3 ENDP執(zhí)行指令RET后17:MOVSP,SIZESTKTOP18: MOV DX,PX ;取X19: ADD DX,DX ;計算2X PUSH DX20: CALL SQROOT3 22:XXYY MOV DX,PY 23: MOV AX,DX 24: ADD DX,DX25: ADD DX,AX PUSH DX26: CALL SQROOT3 POP DX27: POP AX 28: ADD AX,DX ;計算√2X+√3Y29: PUSH AX ;暫存結果30: MOV DX,150 PUSH DX31: CALL SQROOT3 POP DX32: POP AX ;取出中間結果33: ADD AX,DX ;計算最終結果34: MOV RLT,AX ;保存結果35: MOV AH,4CH36: INT 21H37:CSEG ENDS38: END
MAIN11:;*****EXAM7.1.3S*****2:SQROOT4 PROC NEAR3: PUSH BP4: MOV BP,SP5: MOV DX,[BP+4]6: XOR AX,AX 7: AND DX,DX . . .13:SQRT2: MOV[BP+4],AX14: POP BP15: RET ;返回16:SQROOT4 ENDP執(zhí)行指令RET后4.約定參數(shù)地址指針法當要傳送的參數(shù)較多時,用約定地址指針法,即調用程序將參數(shù)存放的地址送入約定的地址指針,然后調用子程序,子程序從地址指針指出的地址取出所需參數(shù)。當返回參數(shù)較多時,可存入內存某區(qū)域,然后把其首地址指針放入約定的寄存器中,供調用程序使用。例8.2設內存有三組無符號字整數(shù),三組數(shù)據(jù)的首地址分別為LIST1,LIST2和LIST3,數(shù)據(jù)個數(shù)分別存放在CNT1,CNT2和CNT3單元。編制程序計算三組數(shù)據(jù)中最小數(shù)之和并存入SUM開始的單元。求一組數(shù)據(jù)中最小數(shù)據(jù)的子程序1:;*****EXAM7.2S*****2:FMIN PROCNEAR;求數(shù)組中最小值3:PUSHSI;保存數(shù)組首址4:MOVAX,[SI];取第一個數(shù)5:DECCX;計數(shù)值減16:JZRETURN;計數(shù)值為0,轉7:FMIN2:INCSI;修改數(shù)組指針8:INCSI9:CMPAX,[SI];與下一個數(shù)比較10:JBFMIN1;AX中數(shù)小,轉11:MOVAX,[SI];小數(shù)取入AX12:FMIN1:LOOPFMIN2;計數(shù)值減1,不為0轉13:RETURN:POPSI;恢復數(shù)組首值14:RET;返回15:FMINENDP1:;*****EXAM7.2M*****2:SSEG SEGMENTSTACK3:SKTOPDB40DUP(0)4:SSEGENDS5:DSEGSEGMENT6:LIST1DW35,27,165,3,1825,6037:CNT1DW68:LIST2DW438,121,496,6321,28,17,2,1059:CNT2DW810:LIST3DW18,5,19,46,372511:CNT3DW512:SUMDW013:DSEGENDS14:CSEGSEGMENT15:ASSUMECS:CSEG,DS:DSEG16:ASSUMESS:SSEG17:MAIN:MOVAX,DSEG18:MOVDS,AX19:MOVAX,SSEG20:MOVSS,AX21:MOVSP,LENGTHSKTOP22:MOVSI,OFFSETLIST123:MOVCX,CNT124:CALLFMIN25:MOVBX,AX26:MOVSI,OFFSETIST227:MOVCX,CNT228:CALLFMIN29:ADDBX,AX30:MOVSI,OFFSETLIST331:MOVCX,CNT332:CALLFMIN33:ADDBX,AX34:MOVSUM,BX35:MOVAH,4CH36:INT21H37:CSEGENDS38:ENDMAIN子程序設計的舉例例7.3計算三組字數(shù)據(jù)中正數(shù)、負數(shù)和零的個數(shù),并分別存入PCOUNT,MCOUNT和ZCOUNT單元。設三組數(shù)據(jù)首地址分別ARRY1,ARRY2和ARRY3,數(shù)據(jù)個數(shù)分別在CNT1,CNT2和CNT3單元存放。子程序說明文件如下:(1)子程序名(入口標號):PMZN;(2)子程序功能:求一組數(shù)據(jù)中正數(shù)、負數(shù)和零的個數(shù);(3)入口條件:數(shù)組首地址在SI中;數(shù)組數(shù)據(jù)個數(shù)在CX中;(4)出口條件:正數(shù)個數(shù)在AX中;負數(shù)個數(shù)在BX中;零的個數(shù)在DX中;(5)受影響的寄存器:AX,BX,DX和標志寄存器F。;*****EXAM7.3S***** PUBLIC PMZNCSEGSEGMENT ASSUMECS:CSEGPMZNPROCFAR PUSHSI ;保存數(shù)組首址 PUSHCX ;保存數(shù)據(jù)個數(shù) XORAX,AX ;清計數(shù)器 XORBX,BX XORDX,DXPMZN0:TESTWORDPTR[SI],0FFFFH ;測試數(shù)據(jù) JSMINUS ;負轉 JNZPLUS ;非0轉 INCDX ;為0,0計數(shù)器加1 JMPPMZN1PLUS:INCAX ;正數(shù)計數(shù)器加1 JMPPMZN1MINUS:INCBX ;負數(shù)計數(shù)器加1PMZN1:ADDSI,2 ;指向下一個數(shù)據(jù) LOOPPMZN0 ;循環(huán)計數(shù)減1,非0轉 POPCX ;恢復CX POPSI ;恢復SI RETPMZNENDPCSEGENDS END;*****EXAM7.3.M***** EXTRN PMZN:FARSSEGSEGMENTSTACKSKTOPDB50DUP(0)SSEGENDSDSEGSEGMENTARRY1DW15,-5,1,5,0,123,964,-327,0CNT1DW9ARRY2DW103,4,-8,-23,0,827,-936,0,0,18CNT2DW10ARRY3DW-29,-137,-23,0,4,0CNT3DW6PCOUNTDW0 ;保存結果單元MCOUNTDW0ZCOUNTDW0ADRDWOFFSETARRY1,OFFSETCNT1 DWOFFSETARRY2,OFFSETCNT2 DWOFFSETARRY3,OFFSETCNT3DSEGENDSCSEGSEGMENT ASSUMECS:CSEG,DS:DSEG ASSUMESS:SSEGSTART:MOVAX,DSEG MOVDS,AX MOVAX,SSEG MOVSS,AX MOVSP,LENGTHSKTOP
LEADI,ADR MOVCX,03AGAIN:MOVSI,[DI] ;取數(shù)組首址→SI MOVBX,[DI+2] ;取數(shù)組數(shù)據(jù)個數(shù)首址 PUSHCX ;保存CX中的循環(huán)計數(shù)值 MOVCX,[BX] ;取數(shù)組數(shù)據(jù)個數(shù)→CX CALLFARPTRPMZN ADDPCOUNT,AX ;累加結果 ADDMCOUNT,BX ADDZCOUNT,DX ADDDI,4 ;修改指針指向下一數(shù)組 POPCX ;恢復CX中循環(huán)計數(shù) LOOPAGAIN ;CX計數(shù)值減1,非0轉 MOVAH,4CH INT21HCSEGEND ENDSTART7.5子程序嵌套我們編制子程序時,如果用到已有的某種功能的子程序,也可以采用調用的方法,在一個子程序的內部再調用其它子程序,稱為子程序嵌套。這樣的子程序稱為嵌套子程序。嵌套子程序的層數(shù)稱為嵌套深度,一般設有硬件堆棧的計算機,嵌套深度只受堆棧區(qū)大小的限制。假設我們已經有一個子程序,其說明文件和程序清單如下:(1)子程序名:HTOA;(2)子程序功能:將一位十六進制數(shù)轉換為ASCII碼;(3)入口條件:要轉換的數(shù)據(jù)在AL中的低四位;(4)出口條件:十六進制數(shù)的ASCII碼在AL中;(5)受影響的寄存器:AL和標志寄存器F。程序清單如下:;*****EXAM7.4S3*****HTOA PROC NEARANDAL,0FH CMPAL,10 JCHTOA1 ADDAL,07HTOA1:ADDAL,30H RETHTOAENDP(1)子程序名:BHTOA;(2)子程序功能:將兩位十六進制數(shù)轉換為ASCII碼;(3)入口條件:兩位十六進制數(shù)在AL中;(4)出口條件:高位十六進制數(shù)的ASCII碼在AH中;低位十六進制數(shù)的ASCII碼在AL中;(5)受影響的寄存器:AX和標志寄存器F。;*****EXAM7.4S2*****BHTOA PROC PUSHCX MOVCH,AL MOVCL,04 SHRAL,CL CALLHTOA MOVAH,AL MOVAL,CH CALLHTOA POPCX RETBHTOA ENDP
假定在內存DATA單元存放著一個無符號的字節(jié)數(shù)據(jù),將它在屏幕上顯示出來。DSEG SEGMENTDATA DB 4CHDSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEG MOV DS,AX MOV AL,DATA CALL BHTOA PUSH AX MOV DL,AH MOV AH,2 INT 21H POP DX INT 21H MOV AX,4C00H INT 21HCSEG ENDS END START7.6遞歸子程序子程序能直接或間地調用自身稱為遞歸調用,具有遞歸調用性質的子程序稱為遞歸子程序。遞歸子程序一般用于解遞歸函數(shù),遞歸函數(shù)定義具有下述兩個組成部分:1.遞歸函數(shù)的遞歸過程必須是有限的。即每個遞歸函數(shù)有一個非遞歸終值,遞歸過程(子程序)一旦求得該值,就結束遞歸。2.任一函數(shù)項的值都有明確的定義,其值可由函數(shù)中的一項或幾項值求得。
舉例:階乘函數(shù),對于任一個大于等于0的正整數(shù)N,其函數(shù)值定義為:1(N=0)FACT(N)=
N*FACT(N-1)(N>0)
{算法(1)測試N=0嗎?是,則令FACT(N)=1,返回;(2)保存N,并令N=N-1,調用自身求得FACT(N-1);(3)順序取出保存的N值(后保存的先取出);(4)計算FACT(N)=N*FACT(N-1),并返回。1:;*****EXAM7.5S*****2:FACT PROC NEAR3:ANDBX,BX4:JZ FACT15:PUSHBX6:DECBX7:CALLFACT8:F:POPBX9:MULBX10:RET11:FACT1:MOVAX,112:RET13:FACTENDP舉例:求4!SSEG SEGMENTSKTOP DB 20HDUP(0)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEGFACT PROC NEAR AND BX,BX JZ FACT1 PUSH BX DEC BX CALL FACTaabb POP BX MUL BX RETFACT1: MOV AX,1 RETFACT ENDPMIAN: MOV AX,SSEG MOV DS,AX① MOV SP,SIZESKTOP MOV BX,4② CALL FACTxxyy NOPCSEG ENDS END MAIN執(zhí)行指令①后舉例:求4!SSEG SEGMENTSKTOP DB 20HDUP(0)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEGFACT PROC NEAR AND BX,BX JZ FACT1③ PUSH BX DEC BX④ CALL FACTaabb POP BX MUL BX⑤ RETFACT1: MOV AX,1⑥ RETFACT ENDPMIAN: MOV AX,SSEG MOV DS,AX① MOV SP,SIZESKTOP MOV BX,4② CALL FACTxxyy NOPCSEG ENDS END MAIN執(zhí)行指令②后BX=4AX=?SP=1EH舉例:求4!SSEG SEGMENTSKTOP DB 20HDUP(0)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEGFACT PROC NEAR AND BX,BX JZ FACT1③ PUSH BX DEC BX④ CALL FACTaabb POP BX MUL BX⑤ RETFACT1: MOV AX,1⑥ RETFACT ENDPMIAN: MOV AX,SSEG MOV DS,AX① MOV SP,SIZESKTOP MOV BX,4② CALL FACTxxyy NOPCSEG ENDS END MAIN執(zhí)行指令③后BX=4AX=?SP=1CH舉例:求4!SSEG SEGMENTSKTOP DB 20HDUP(0)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEGFACT PROC NEAR AND BX,BX JZ FACT1③ PUSH BX DEC BX④ CALL FACTaabb POP BX MUL BX⑤ RETFACT1: MOV AX,1⑥ RETFACT ENDPMIAN: MOV AX,SSEG MOV DS,AX① MOV SP,SIZESKTOP MOV BX,4② CALL FACTxxyy NOPCSEG ENDS END MAIN執(zhí)行指令④后BX=3AX=?SP=1AH舉例:求4!SSEG SEGMENTSKTOP DB 20HDUP(0)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEGFACT PROC NEAR AND BX,BX JZ FACT1③ PUSH BX DEC BX④ CALL FACTaabb POP BX MUL BX⑤ RETFACT1: MOV AX,1⑥ RETFACT ENDPMIAN: MOV AX,SSEG MOV DS,AX① MOV SP,SIZESKTOP MOV BX,4② CALL FACTxxyy NOPCSEG ENDS END MAIN再執(zhí)行指令③后BX=3AX=?SP=18H舉例:求4!SSEG SEGMENTSKTOP DB 20HDUP(0)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEGFACT PROC NEAR AND BX,BX JZ FACT1③ PUSH BX DEC BX④ CALL FACTaabb POP BX MUL BX⑤ RETFACT1: MOV AX,1⑥ RETFACT ENDPMIAN: MOV AX,SSEG MOV DS,AX① MOV SP,SIZESKTOP MOV BX,4② CALL FACTxxyy NOPCSEG ENDS END MAIN再執(zhí)行指令④后BX=2AX=?SP=16H舉例:求4!SSEG SEGMENTSKTOP DB 20HDUP(0)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEGFACT PROC NEAR AND BX,BX JZ FACT1③ PUSH BX DEC BX④ CALL FACTaabb POP BX MUL BX⑤ RETFACT1: MOV AX,1⑥ RETFACT ENDPMIAN: MOV AX,SSEG MOV DS,AX① MOV SP,SIZESKTOP MOV BX,4② CALL FACTxxyy NOPCSEG ENDS END MAIN再執(zhí)行指令③后BX=2AX=?SP=14H舉例:求4!SSEG SEGMENTSKTOP DB 20HDUP(0)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEGFACT PROC NEAR AND BX,BX JZ FACT1③ PUSH BX DEC BX④ CALL FACTaabb POP BX MUL BX⑤ RETFACT1: MOV AX,1⑥ RETFACT ENDPMIAN: MOV AX,SSEG MOV DS,AX① MOV SP,SIZESKTOP MOV BX,4② CALL FACTxxyy
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 測量實習自我鑒定范文(18篇)
- 遼寧工程職業(yè)技術學院數(shù)學復習試題(一)
- 新家風家訓心得(16篇)
- 領導科學的核心理念與實踐試題及答案
- 企業(yè)形象規(guī)定(完整版)
- 獎學金自我鑒定范文(28篇)
- 電子商務安全與支付行業(yè)試題集
- 成就數(shù)據(jù)庫夢想2025年試題及答案
- 市場推廣及渠道分銷合同
- 農民合作社農業(yè)生產設備采購合同
- 護理查房慢性腎臟病5期護理查房
- 鉆越保阜高速公路施工方案
- GMS基礎知識的教案
- 第5章 鋼梁計算原理
- 西南科技大學機械原理期末考試復習題及答案
- 讀后續(xù)寫:騎馬迷路 遇困難不放棄 課件 【知識建構+點播拓展】高考英語作文備考
- 2023年宜興市云湖茶禪文旅發(fā)展有限公司招聘筆試題庫及答案解析
- Unit2Reading2知識點課件-高中英語牛津譯林版(2020)選擇性必修第一冊
- 交通協(xié)管員勞務外包服務方案
- 頂管工程頂進記錄表
- 呼吸道病原體抗體檢測及臨床應用課件
評論
0/150
提交評論