那些年,我们一起学过的汇编----之程序返回操作系统

简介:

  上一篇聊了下汇编的伪指令,本人也是学汇编没多长时间,所以难免有些不对的地方,如果你在阅读过程中发现了错误,还希望不辞吝教呀,这一篇我们一起来看看汇编语言的程序返回操作系统这部分是怎么实现的。

我们都知道,汇编语言源程序要进过汇编和连接两个步骤才能生成一个可以在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的目的。
 
      本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/939717,如需转载请自行联系原作者


相关文章
|
7月前
|
存储 Java C语言
手写操作系统 --汇编执行流(一)
手写操作系统 --汇编执行流(一)
|
2月前
|
Web App开发 Shell Linux
MacOS环境-手写操作系统-41-mem 第一个控制台程序
MacOS环境-手写操作系统-41-mem 第一个控制台程序
23 1
|
2月前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
32 0
|
2月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
49 0
加快软盘操作速度的汇编程序源代码
加快软盘操作速度的汇编程序源代码
|
4月前
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
152 3
|
4月前
|
程序员 编译器 数据处理
汇编高手秘籍:解锁性能优化新境界,用汇编语言让你的程序飞起来!
【8月更文挑战第31天】汇编语言作为编程基石,其高效性能备受推崇。尽管现代软件开发更偏爱高级语言,但在性能要求极高的场景下,汇编优化仍不可或缺。本文通过示例代码介绍四种优化技巧:循环展开、寄存器分配、指令重排及SIMD指令使用,显著提升执行效率。同时强调分析性能瓶颈、测试优化效果及保持代码可读性的重要性,助力开发者在关键代码路径上实现性能突破。
135 0
8086 汇编笔记(五):包含多个段的程序
8086 汇编笔记(五):包含多个段的程序
|
7月前
|
编译器 开发者 C++
8086 汇编笔记(三):第一个程序
8086 汇编笔记(三):第一个程序
|
存储 缓存 Linux
【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
132 1