我們都知道,,匯編語言源程序要進過匯編和連接兩個步驟才能生成一個可以在DOS下直接執(zhí)行的.exe文件,,在DOS下執(zhí)行這個文件時,,DOS像調(diào)用子程序一樣,,把控制權(quán)交給它,而這個exe文件執(zhí)行完成后也要像子程序返回調(diào)用程序一樣返回DOS,
一,、用4CH系統(tǒng)功能調(diào)用實現(xiàn)返回
4CH系統(tǒng)調(diào)用功能是結(jié)束程序執(zhí)行返回DOS,,因此可以利用它來完成程序返回操作系統(tǒng),其具體方法是在程序 結(jié)束時使用下列命令:
MOV AH, 4CH
INT 21H
但并不是任何程序都可以用這種方法來實現(xiàn)返回DOS的,,只有返回DOS的主程序才能使用這種方式,而對于調(diào)用的子程序應該返回給的是調(diào)用程序而不是系統(tǒng),,所以不能用4CH實現(xiàn)返回,。下面就介紹一種能夠用來返回給調(diào)用程序的返回方式。
二,、用程序段前綴實現(xiàn)返回
在DOS狀態(tài)下執(zhí)行EXE文件時,,DOS會在COMMAND.COM暫存部分之后建立一個256字節(jié)的程序段前綴(PSP)在其后裝入該EXE程序時把控制權(quán)交給它,PSP的內(nèi)容主要包括3部分信息:被裝入程序與DOS連接時使用的信息,、供裝入程序使用的參數(shù)和供DOS本身使用的信息,。
在DOS轉(zhuǎn)移控制權(quán)時,將代碼段(CS)指向EXE程序的代碼段,,SS指向堆棧段,,DS和ES并不指向用戶程序的數(shù)據(jù)段和附加段,而是指向PSP,。
在PSP首地址(第一,、二字節(jié))有一條軟中斷指令“INT 20H”(有關中斷部分我會在以后說到),而這條指令的功能就是結(jié)束用戶程序返回操作系統(tǒng),,因此可以用程序段前綴實現(xiàn)返回DOS,,其步驟如下:
a、將程序編織成一個過程,,并且將過程的類型屬性設置為FAR
b,、將PSP的起始邏輯地址壓入堆棧,即將“INT 20H”指令的地址壓入堆棧,。由于EXE文件裝入內(nèi)存時DS和ES都是指向PSP的,,因此用指令“PUSH DS”就可以實現(xiàn)將PSP的起始邏輯地址壓入堆棧的操作。
c,、在程序編制而成的過程結(jié)束時使用返回指令RET,,這樣執(zhí)行該指令時系統(tǒng)便會將保存在堆棧中的PSP起始邏輯地址彈出到CS和IP中,進而轉(zhuǎn)去執(zhí)行PSP首地址處的指令INT 20H, 從而實現(xiàn)返回DOS的目的,。