那些年,我们一起学过的汇编----之程序返回操作系统
来源:互联网 发布:影视片头特效制作软件 编辑:程序博客网 时间:2024/05/16 19:54
转载自http://yiluohuanghun.blog.51cto.com/3407300/939717
我们都知道,汇编语言源程序要进过汇编和连接两个步骤才能生成一个可以在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首地址(第一、二字节)有一条软中断指令“INT20H”(有关中断部分我会在以后说到),而这条指令的功能就是结束用户程序返回操作系统,因此可以用程序段前缀实现返回DOS,其步骤如下:
a、将程序编织成一个过程,并且将过程的类型属性设置为FAR
b、将PSP的起始逻辑地址压入堆栈,即将“INT20H”指令的地址压入堆栈。由于EXE文件装入内存时DS和ES都是指向PSP的,因此用指令“PUSH DS”就可以实现将PSP的起始逻辑地址压入堆栈的操作。
c、在程序编制而成的过程结束时使用返回指令RET,这样执行该指令时系统便会将保存在堆栈中的PSP起始逻辑地址弹出到CS和IP中,进而转去执行PSP首地址处的指令INT 20H, 从而实现返回DOS的目的。
- 那些年,我们一起学过的汇编----之程序返回操作系统
- 那些年,我们一起学过的汇编----之子程序设计
- 那些年,我们一起学过的汇编----之伪指令
- 那些年,我们一起学过的汇编----之跳转指令
- 那些年,我们一起学过的汇编----之顺序、分支与循环程序设计
- 那些年我们一起学的汇编----之寻址方式
- 那些年,我们没有一起学过的英语。
- 那些年,我们一起学过的linux
- 那些年,我们一起学过的编程语言
- 那些年,我们一起学过的R语言
- 那些年,我们一起学过的算法。
- 那些年我们一起学过的“排序算法”
- 那些年我们一起学过的“排序算法”
- Cstyle的嵌入式之:那些年我们一起写过的单片机程序,世上最简单的单片机程序
- 那些年,我们一起学的C++
- 那些年,我们一起学的嵌入式
- 那些年我们一起学的排序
- ~那些年,我们一起学过的网络通信~01~两台电脑的单向交流~
- 站长投稿网站大全
- iphone5 上Facebook教程
- hibernate抓取策略fetch详解
- 那些年,我们一起学过的汇编----之伪指令
- WinCE OAL中的OEMIoControl函数
- 那些年,我们一起学过的汇编----之程序返回操作系统
- 第一代身份证的底纹曲线的绘制
- PIC_CCS CAN帮助文件(翻译)
- 新的一頁
- 那些年,我们一起学过的汇编----之跳转指令
- 经典的webshell提权
- Wikipedia’s 10 most-visited pages in 2012
- Android调用系统设置壁纸功能
- boost property_tree的read_xml的第一个参数不支持中文路径的解决方案