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