資源描述:
《子程序的嵌套》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、子程序的嵌套 一、子程序的嵌套 一個(gè)子程序作為調(diào)用程序去調(diào)用另一個(gè)子程序的情況稱為子程序的嵌套。 嵌套深度:嵌套的層數(shù)稱為嵌套深度。不受限制。 嵌套子程序的設(shè)計(jì):沒有什么特殊要求,除子程序的調(diào)用和返回應(yīng)正確使用CALL和RET指令外,要注意寄存器的保護(hù)和恢復(fù)。如用堆棧傳送數(shù)據(jù)要避免因堆棧使用中的溢出問題而造成子程序不能正確返回的錯(cuò)誤。有兩種可能發(fā)生堆棧溢出的情況: 堆棧上溢:如堆棧已滿,但還想再存入信息,這種情況稱為堆棧上溢?! 《褩O乱纾喝缍褩R芽眨€想再取出信息,這種情況稱為堆棧下溢?!?/p>
2、 遞歸子程序:子程序自己調(diào)用自己的情況稱為遞歸調(diào)用,這種子程序稱為遞歸子程序 二、嵌套深度 圖1表示了嵌套深度為2時(shí)的子程序嵌套情況?! ±? 兩個(gè)6字節(jié)數(shù)相加?! 》治觯簩⒁粋€(gè)字節(jié)相加的程序段設(shè)計(jì)為子程序。主程序分3次調(diào)用該子程序,但每次調(diào)用的參數(shù)不同?! 〕绦蛉缦拢骸 ATA SEGMENT ADD1 DB FEH,86H,7CH,35H,68H,77H ADD2 DB 45H,BCH,7DH,6AH,87H,90H SUM DB 6DUP(0) COUNT D
3、B 6 DATA ENDS STACK SEGMENT DB 100DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MADD: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SI,OFFSET ADD1 MOV DI,OFFSET ADD2 MOV BX,OFFSET SUM MOV CX,COUNT ??;循環(huán)初值為6 CLC A
4、GAIN:CALL SUBADD ?。徽{(diào)用子程序 LOOP AGAIN ?。谎h(huán)調(diào)用6次 MOV AX,4C00H INT 21H ;子程序入口參數(shù):SI,DI,BX 出口參數(shù):SI,DI,BX SUBADD PROC ;完成一個(gè)字節(jié)相加 PUSH AX ??;保護(hù)AX的值 MOV AL,[SI] ??;SI是一個(gè)源操作數(shù)指針 ADC AL,[DI] ?。籇I是另一個(gè)源操作數(shù)指針 MOV [BX],AL ??;BX是結(jié)果操作數(shù)指針 INC SI INC
5、DI INC BX POP AX ;恢復(fù)AX的值 RET SUBADD ENDP CODE ENDS END MADD 例2 把內(nèi)存中的字變量NUMBER的值,轉(zhuǎn)換為4個(gè)ASCII碼表示的十六進(jìn)制數(shù)碼串,串的起始地址為STRING。 分析:把內(nèi)存中的字變量NUMBER的值,轉(zhuǎn)換為4個(gè)ASCII碼表示的十六進(jìn)制數(shù)碼串的工作設(shè)計(jì)成一個(gè)子程序,在這個(gè)子程序中再調(diào)用另一個(gè)子程序,由它完成從BCD碼到ASCII碼的轉(zhuǎn)換?! 〕绦蛉缦拢骸 ATA SEGMENT NUMBER D
6、W 25AFH STRING DB 4DUP(?),0DH,0AH,‘$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX MOV ES,AX LEA BX,STRING PUSH BX ;將參數(shù)(結(jié)果地址指針)壓入堆棧 PUSH NUMBER ?。粚⒃磾?shù)據(jù)壓入堆?! ALL BINHEX ??;調(diào)用子程序 LEA DI,STRING
7、MOV AH,9 INT 21H BINHEX PROC PUSH BP MOV BP,SP PUSH AX PUSH DI PUSH CX PUSH DX PUSHF ??;以上為保護(hù)現(xiàn)場 MOV AX,[BP+4] ??;取出NUMBER MOV DI,[BP+6] ;取出STRING的偏移地址 ADD DI,LENGTH STRING-1??;使DI指向轉(zhuǎn)換數(shù)據(jù) MOV DX,AX ;保護(hù)原始數(shù)據(jù) MOV CX,
8、4 AGAIN: AND AX,0FH ??;取低4位 CALL HEXD ;調(diào)子程序 STD STOSB ??;保護(hù)轉(zhuǎn)換數(shù)據(jù) PUSH CX ?。槐Wo(hù)CX的值 MOV CL,4 SHR DX,CL MOV AX,DX POP CX LOOP AGAIN POPF POP DX POP CX POP DI POP AX POP BP RET