【汇编语言】第一个程序(四)—— 谁在幕后启动程序 : 探讨可执行文件的装载与执行

在这里插入图片描述

文章目录

  • 前言
  • 1. 可执行文件的加载与运行
    • 1.1 DOS中的程序加载过程
    • 1.2 问题1:谁加载了1.exe?
    • 1.3 问题2:程序运行结束后的返回过程
    • 1.4 操作系统的外壳
    • 1.5 回答问题1和问题2
    • 1.6 汇编程序执行的完整历程
  • 2. 使用Debug加载与跟踪1.exe
    • 2.1 Debug的加载流程
    • 2.2 用Debug逐条跟踪程序
      • 2.2.1 观察寄存器
      • 2.2.2 补充:.exe文件中程序的加载过程
      • 2.2.2 看其它指令
      • 2.2.3 单步跟踪与程序结束
    • 2.3 返回顺序及退出Debug
  • 结语

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

1. 可执行文件的加载与运行

1.1 DOS中的程序加载过程

我们在前面文章中讲过,在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2,将P1从可执行文件中加载入内存,将CPU的控制权交给它,P1才能得以运行;当P1运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P2。

按照上面的原理,再来看一下之前的1.exe 的执行过程(思考相关的问题)。

  1. 在提示符"C:\"后面输入可执行文件的名字“1.exe”,按 Enter 键。这时,请思考下面的问题1。
  2. 1.exe 中的程序运行。
  3. 运行结束,返回,再次显示提示符“C:\”。请思考下面的问题2。

1.2 问题1:谁加载了1.exe?

此时,有一个正在运行的程序将1.exe中的程序加载入内存,这个正在运行的程序是什么?它将程序加载入内存后,如何使程序得以运行?

1.3 问题2:程序运行结束后的返回过程

程序运行结束后,返回到哪里?

如果你对 DOS 有比较深入的了解,那么,很容易回答问题1、问题2中所提出的问题。如果没有这种了解,可以先阅读下面的内容。

1.4 操作系统的外壳

操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为shell(外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统进行工作。

在这里插入图片描述

DOS 中有一个程序 command.com,这个程序在DOS 中称为命令解释器,也就是DOS系统的shell。

DOS 启动时,先完成其他重要的初始化工作,然后运行command.com,command.com运行后,执行完其他的相关任务后,在屏幕上显示出由当前盘符和当前路径组成的提示符,比如:“c:”或“c:\windows”等,然后等待用户的输入。
用户可以输入所要执行的命令,比如,cd、dir、type等,这些命令由command执行,command执行完这些命令后,再次显示由当前盘符和当前路径组成的提示符,等待用户的输入。

如果用户要执行一个程序,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口。此后,command 暂停运行,CPU 运行程序。程序运行结束后,返回到command中,command再次显示由当前盘符和当前路径组成的提示符,等待用户的输入。

在DOS中,command 处理各种输入:命令或要执行的程序的文件名。我们就是通过command来进行工作的。

1.5 回答问题1和问题2

现在回答问题1和问题2中所提出的问题。

  1. 在DOS中直接执行1.exe 时,是正在运行的command,将1.exe 中的程序加载入内存。
  2. command设置CPU的CS:IP 指向程序的第一条指令(即程序的入口),从而使程序得以运行。
  3. 程序运行结束后,返回到command 中,CPU 继续运行command。

1.6 汇编程序执行的完整历程

到此,我们知道了完成一个汇编程序从写出到执行的全部过程应该如下图所示:

在这里插入图片描述

2. 使用Debug加载与跟踪1.exe

可以用 Debug 来跟踪一个程序的运行过程,这通常是必须要做的工作。我们写的程序在逻辑上不一定总是正确,对于简单的错误,仔细检查一下源程序就可以发现;而对于隐藏较深的错误,就必须对程序的执行过程进行跟踪分析才容易发现。

下面以在前面的内容中生成的可执行文件1.exe为例,讲解如何用Debug对程序的执行过程进行跟踪。

2.1 Debug的加载流程

现在我们知道,在 DOS中运行一个程序的时候,是由command将程序从可执行文件中加载入内存,并使其得以执行。但是,这样我们不能逐条指令地看到程序的执行过程,因为command 的程序加载,设置CS:IP指向程序的入口的操作是连续完成的,而当CS:IP一指向程序的入口,command 就放弃了CPU的控制权,CPU立即开始运行程序,直至程序结束。

为了观察程序的运行过程,可以使用Debug。Debug可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU的控制,这样,我们就可以使用Debug的相关命令来单步执行程序,查看每一条指令的执行结果。

这里仍然要用到我们之前在【汇编语言】寄存器(CPU工作原理)(七)—— 查看CPU和内存,用机器指令和汇编指令编程这篇文章中所下载的软件和执行程序。

具体方法如下图所示:

在这里插入图片描述

在提示符后输入“debug 1.exe”,按 Enter 键,Debug将程序从 1.exe 中加载入内存,进行相关的初始化后设置 CS:IP 指向程序的入口。

2.2 用Debug逐条跟踪程序

2.2.1 观察寄存器

接下来可以用R命令看一下各个寄存器的设置情况,如下图所示。

在这里插入图片描述

可以看到,Debug将程序从可执行文件加载入内存后,cx中存放的是程序的长度。1.exe 中程序的机器码共有15个字节。则1.exe加载后,cx中的内容为000FH。

现在程序已从1.exe中装入内存,接下来查看一下它的内容,可是我们查看哪里的内容呢?程序被装入内存的什么地方?我们如何得知?

2.2.2 补充:.exe文件中程序的加载过程

这里,需要讲解一下在DOS系统中.EXE文件中的程序的加载过程。下图针对我们的问题,简要地展示了这个过程。

在这里插入图片描述

注意,有一步称为重定位的工作在上图中没有讲解,因为这个问题和操作系统的关系较大,我们不作讨论。

那么,我们的程序被装入内存的什么地方?我们如何得知?从上图中我们知道以
下的信息。

  1. 程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为0,则程序所在的内存区的地址为 ds:0。
  2. 这个内存区的前256个字节中存放的是PSP,DOS用来和程序进行通信。从256字节处向后的空间存放的是程序。

所以,从ds中可以得到PSP的段地址SA,PSP的偏移地址为0,则物理地址为SA*16+0。

因为PSP占256(100H)字节,所以程序的物理地址是:SA*16+0+256=SA*16+16*16+0=(SA+16)*16+0

可用段地址和偏移地址表示为:SA+10H:0。

现在,我们看一下2.2.1图中DS的值,DS=129E,则PSP的地址为129E:0,程序的地址为12AE:0(即 129E+10:0)。
在上面2.2.1图中,CS=12AE,IP=0000,CS:IP指向程序的第一条指令。注意,源程序中的指令是 mov ax,0123H,在 Debug 中记为 mov ax,0123,这是因为 Debug 默认所有数据都用十六进制表示

2.2.2 看其它指令

可以用U命令看一下其他指令,如下图所示。

在这里插入图片描述

可以看到,从076A:0000-076A:000E都是程序的机器码。

2.2.3 单步跟踪与程序结束

现在,我们可以开始跟踪了,用T命令单步执行程序中的每一条指令,并观察每条指令的执行结果,到了int 21,我们要用P命令执行,如下图所示。

在这里插入图片描述

上图中,int 21 执行后,显示出“Program terminated normally”,返回到 Debug中。表示程序正常结束。

注意,要使用P命令执行int 21。这里不必考虑是为什么,只要记住这一点就可以了。

2.3 返回顺序及退出Debug

需要注意的是,在DOS中运行程序时,是command将程序加载入内存,所以程序运行结束后返回到command中,而在这里是Debug 将程序加载入内存,所以程序运行结束后要返回到 Debug 中

使用Q命令退出Debug,将返回到command中,因为Debug是由command 加载运行的

在这里插入图片描述

在 DOS 中用“debug 1.exe”运行 Debug对 1.exe 进行跟踪时

  • 程序加载的顺序是:command加载Debug,Debug加载1.exe。
  • 返回的顺序是:从1.exe 中的程序返回到Debug,从Debug 返回到command。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460747.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(一)认识和了解Build.cs

目录 引言 一、创建一个C插件TextureReader插件 二、Build.cs文件 三、ModuleRules 四、TextureReader插件的构造 4.1ReadOnlyTargetRules的作用 4.2TextureReaderd的构造调用 4.3设置当前类的预编译头文件的使用模式 4.4PublicIncludePaths.AddRange与PrivateInclude…

SELS-SSL/TLS

一、了解公钥加密(非对称加密) 非对称加密中,用于加密数据的密钥与用于解密数据的密钥不同。私钥仅所有者知晓,而公钥则可自由分发。发送方使用接收方的公钥对数据进行加密,数据仅能使用相应的私钥进行解密。 你可以将…

STM32FreeRTOS 使用QSPI驱动nandFlash

STM32FreeRTOS 使用QSPI驱动nandFlash 不清楚为什么STM32同时打开3个以上的音频文件时会出现播放问题,所以更换方案。因为SRAM的内存空间过小,用于存储音频文件不适合,所以使用大小为128MByte的nandFlash。 nandFlash使用华邦的W25N01GVZEI…

vscode的一些使用心得

问题1:/home目录空间有限 连接wsl或者remote的时候,会在另一端下载一个.vscode-server,vscode的插件都会安装进去,导致空间增加很多,可以选择更换这个文件的位置 参考:https://blog.csdn.net/weixin_4389…

1Panel应用商店开源软件累计下载突破200万次!

2024年10月23日,1Panel应用商店内开源软件累计下载突破200万次。 1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。 为…

基于MATLAB多参数结合火焰识别系统

一、课题介绍 本设计为基于MATLAB的火焰烟雾火灾检测系统。传统的采用颜色的方法,误识别大,局限性强。结合火焰是实时动态跳跃的,采用面积增长率,角点和圆形度三个维度相结合的方式判断是否有火焰。该设计测试对象为视频&#xf…

利用摄像机实时接入分析平台LiteAIServer视频智能分析软件进行视频监控:过亮过暗检测算法详解

视频监控作为一种重要的安全和管理工具,广泛应用于各个领域,如安全监控、交通监管、员工监管、公共场所监控等。然而,在实际应用中,视频监控系统经常面临各种挑战,其中之一便是视频画面过亮或过暗的问题。过亮过暗检测…

python画图|坐标轴比例设置方法

【1】引言 在前序学习进程中,我们通过ax.set_box_aspect()函数掌握了坐标轴等比例设置方法。 担当我在回顾以前的学习文章时,发现ax.axis()函数也可以设置坐标轴比例,比如下述文章,文章可通过点击链接直达: python画…

[前端][基础]JavaScript

1,JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言,而Java语言也是跨平台的、面向对象的语言,只不过Java是编译语言,是需要编译成字节码文件才能运行的;JavaScript是脚本语言,不需要编译&…

用于文档理解的局部特征

本文介绍了一种名为DocFormerv2的多模态Transformer模型,它专为视觉文档理解(VDU)而设计。该模型可以处理视觉、语言和空间特征,利用编码器-解码器架构,并通过不对称地使用新颖的无监督任务进行预训练,以促…

Chromium127编译指南 Linux篇 - 额外环境配置(五)

引言 在成功获取 Chromium 源代码后,接下来我们需要配置适当的编译环境,以便顺利完成开发工作。本文将详细介绍如何设置 Python 和相关的开发工具,以确保编译过程无碍进行。这些配置步骤是开发 Chromium 的必要准备,确保环境设置…

HTTP相关返回值异常原因分析,第二部分

今天我们讲讲HTTP相关返回值异常如何解决(实例持续更新中) 一、4xx状态码 这些状态码表示请求有问题,通常是由于客户端的错误引起的。 1.1 400 Bad Request: 请求格式不正确,服务器无法理解。 状态码400的含义: …

.NET内网实战:通过白名单文件反序列化漏洞绕过UAC

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,对内网和后渗透感兴趣的朋友们可以订阅该电子报刊,解锁更多的报刊内容。 02基本介绍 03原理分析 在渗透测试和红…

Spring Boot 实现文件分片上传和下载

文章目录 一、原理分析1.1 文件分片1.2 断点续传和断点下载1.2 文件分片下载的 HTTP 参数 二、文件上传功能实现2.1 客户端(前端)2.2 服务端 三、文件下载功能实现3.1 客户端(前端)3.2 服务端 四、功能测试4.1 文件上传功能测试4.2 文件下载功能实现 参考资料 完整案例代码&…

【数据结构】-数组

数组 特点: 数组的地址连续,可以通过下标获取数据。 1. 数组扩容 步骤: $1. 创建一个比原来数组更长的新数组 $2. 让原来数组当中的数据依次复制到新数组当中 $3. 让arr指向新数组,原数组空间释放 2. 数组插入 2.1 最后位置…

智慧小区:科技之光点亮幸福家园

智慧社区的未来发展方向与趋势 从智能化管理到便捷化服务,从环保节能到安全监控,智慧社区正以其前瞻性的视野和创新性的技术,引领着未来城市生活的新方向。从智慧社区的基本概念中通过运用现代科技手段,如物联网、云计算、大数据…

0,国产FPGA(紫光同创)-新建PDS工程

国产FPGA正在蓬勃发展,紫光同创FPGA是大家竞赛时经常遇到的一款国产FPGA,本专栏从IP核开始一直到后续图像处理等。 开发板:盘古50K标准板 1,新建PDS工程 点击File(1),然后是New Projects&#…

深入解析Sysmon日志:增强网络安全与威胁应对的关键一环

不断演进的网络安全领域中,保持对威胁的及时了解至关重要。Sysmon日志在这方面发挥了至关重要的作用,通过提供有价值的见解,使组织能够加强其安全姿态。Windows在企业环境中是主导的操作系统,因此深入了解Windows事件日志、它们的…

yocto 下基于SDK的 tcpdump 移植

系列文章目录 【1】yocto系统构建 【2】yocto下mosquitto用户名和密码配置 【3】yocto 下基于SDK的 tcpdump 移植 文章目录 系列文章目录前言一、移植tcpdump的意义二、移植步骤1. 准备Yocto环境2.获取源码,配置和编译3.移植到目标设备4.测试tcpdump 总结 前言 tc…