上一篇聊了下匯編的偽指令,本人也是學匯編沒多長時間,所以難免有些不對的地方,如果你在閱讀過程中發現了錯誤,還希望不辭吝教呀,這一篇我們一起來看看匯編語言的程序返回操作系統這部分是怎麼實現的。
我們都知道,匯編語言源程序要進過匯編和連接兩個步驟才能生成一個可以在DOS下直接執行的.exe文件,在DOS下執行這個文件時,DOS像調用子程序一樣,把控制權交給它,而這個exe文件執行完成後也要像子程序返回調用程序一樣返回DOS,
一、用4CH系統功能調用實現返回
4CH系統調用功能是結束程序執行返回DOS,因此可以利用它來完成程序返回操作系統,其具體方法是在程序 結束時使用下列命令:
MOV AH, 4CH
INT 21H
但並不是任何程序都可以用這種方法來實現返回DOS的,只有返回DOS的主程序才能使用這種方式,而對於調用的子程序應該返回給的是調用程序而不是系統,所以不能用4CH實現返回。下面就介紹一種能夠用來返回給調用程序的返回方式。
二、用程序段前綴實現返回
在DOS狀態下執行EXE文件時,DOS會在COMMAND.COM暫存部分之後建立一個256字節的程序段前綴(PSP)在其後裝入該EXE程序時把控制權交給它,PSP的內容主要包括3部分信息:被裝入程序與DOS連接時使用的信息、供裝入程序使用的參數和供DOS本身使用的信息。
在DOS轉移控制權時,將代碼段(CS)指向EXE程序的代碼段,SS指向堆棧段,DS和ES並不指向用戶程序的數據段和附加段,而是指向PSP。
在PSP首地址(第一、二字節)有一條軟中斷指令“INT 20H”(有關中斷部分我會在以後說到),而這條指令的功能就是結束用戶程序返回操作系統,因此可以用程序段前綴實現返回DOS,其步驟如下:
a、將程序編織成一個過程,並且將過程的類型屬性設置為FAR
b、將PSP的起始邏輯地址壓入堆棧,即將“INT 20H”指令的地址壓入堆棧。由於EXE文件裝入內存時DS和ES都是指向PSP的,因此用指令“PUSH DS”就可以實現將PSP的起始邏輯地址壓入堆棧的操作。
c、在程序編制而成的過程結束時使用返回指令RET,這樣執行該指令時系統便會將保存在堆棧中的PSP起始邏輯地址彈出到CS和IP中,進而轉去執行PSP首地址處的指令INT 20H, 從而實現返回DOS的目的。
本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/939717