Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【汇编语言】第一个程序(三)—— 深度剖析汇编程序的执行流程:编辑、编译、连接与运行

【汇编语言】第一个程序(三)—— 深度剖析汇编程序的执行流程:编辑、编译、连接与运行

作者头像
Crossoads
发布于 2024-10-30 00:32:34
发布于 2024-10-30 00:32:34
1.4K02
代码可运行
举报
文章被收录于专栏:汇编语言汇编语言
运行总次数:2
代码可运行

前言

📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。 本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

通过前面的学习我们已经知道一个汇编源程序应该是什么样的,本文我们将会从一个源程序的编辑到最终的运行完整的过程展现出来。

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

1. 编辑源程序

可以用任意的文本编辑器来编辑源程序,只要最终将其存储为纯文本文件即可。在这里我们将用Notepad++来进行编辑程序,并且以如下程序作为示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
assume cs:codesg

codesg segment
	mov ax,0123H
	mov bx,0456H
	add ax,bx
	add ax,ax
	
	mov ax,4C00H
	int 21H

codesg ends

end

1.1 找到执行程序的目录

我们首先要找到当初下载的执行程序的目录,之后编辑好的源程序要放在该目录下才可以被执行,因为这样才能被执行程序所找到。

1.2 进入文本编辑器,编辑程序

在Notepad++中编辑程序,如下图所示。

1.3 保存源程序文件,推出编辑

将源程序文件保存在执行程序的目录下,比如说我这里是:D:\DOSBox\MASM\1.asm。(汇编源程序文件的后缀是.asm)

2. 启动DOS模拟器——DOSBox

2.1 执行挂载操作

首先打开DOSBox程序后,将我们执行程序的路径挂载到DOSBox的C盘上(这样就把我们的d盘里的这个执行程序所在的文件夹当作模拟器里面的C盘使用了)。

2.2 转换到C盘

将模拟器的当前位置转到模拟器的C盘上。

执行dir命令可以看当前位置下,我们所具备的文件和文件夹。

3. 编译

在我们得到一个源程序文件D:\DOSBox\MASM\1.asm后。可以对其进行编译,生成包含机器代码的目标文件。

在编译一个源程序之前首先要找到一个相应的编译器。我们这里就是使用的之前下载的文件名为masm.exe执行程序。

3.1 编译源程序

在执行文件的目录下,运行masm.exe。输入要编译的源程序文件名后,按Enter键,屏幕显示如下图所示。

上图中,在执行命令后,程序继续提示我们输入要编译出的目标文件的名称,目标文件是我们对一个源程序进行编译要得到的最终结果。

注意屏幕上的显示:“1.OBJ”,因为我们已经输入了源程序文件名为1.asm,则编译程序默认要输出的目标文件名为1.obj,所以可以不必再另行指定文件名。

直接按Enter键,编译程序将在当前的目录下,生成1.obj 文件。

3.2 忽略列表文件

确定了目标文件的名称后,屏幕显示如下图所示。

上图中,编译程序提示输入列表文件的名称,这个文件是编译器将源程序编译为目标文件的过程中产生的中间结果。可以让编译器不生成这个文件,直接按Enter键即可。

3.3 忽略交叉引用文件

忽略了列表文件的生成后,屏幕显示如下图所示。

上图中,编译程序提示输入交叉引用文件的名称,这个文件同列表文件一样,是编译器将源程序编译为目标文件过程中产生的中间结果。可以让编译器不生成这个文件,直接按 Enter 键即可。

3.4 编译结束的结果

忽略了交叉引用文件的生成后,屏幕显示如下图所示。

上图中,对源程序的编译结束,编译器输出的最后两行告诉我们这个源程序没有警告错误和必须要改正的错误。

上面我们通过对 C盘根目录下的 1.asm 进行编译的过程,展示了使用汇编编译器对源程序进行编译的方法。按照上面的过程进行了编译之后,在编译器masm.exe 运行的目录下(即当前路径下),将出现一个新的文件:1.obj,如下图所示,这是对源程序 1.asm 进行编译所得到的结果。当然,如果编译的过程中出现错误,那么将得不到目标文件。

一般来说,有两类错误使我们得不到所期望的目标文件:

  1. 程序中有“Severe Errors”
  2. 找不到所给出的源程序文件。

注意,在编译的过程中,我们提供了一个输入,即源程序文件。最多可以得到3个输出:目标文件(.obj)、列表文件(.lst)、交叉引用文件(.crf),这3个输出文件中,目标文件是我们最终要得到的结果,而另外两个只是中间结果,可以让编译器忽略对它们的生成。在汇编课程中,我们不讨论这两类文件。

4. 连接

在对源程序进行编译得到目标文件后,我们需要对目标文件进行连接,从而得到可执行文件。在这里我们需要使用到的可执行文件名为link.exe。

4.1 连接目标文件

仍然在执行文件目录下,运行link.exe。

上图中,在执行命令后,程序继续提示我们输入要生成的可执行文件的名称,可执行文件是我们对一个程序进行连接要得到的最终结果。注意屏幕上的显示:“1.EXE”,因为已经确定了目标文件名为1.obj,则程序默认要输出的可执行文件名为1.EXE,所以可以不必再另行指定文件名。

直接按Enter键,编译程序将在当前的目录下,生成 1.EXE 文件。

4.2 忽略映像文件

确定了可执行文件的名称后,屏幕显示如下图所示。

上图中,连接程序提示输入映像文件的名称,这个文件是连接程序将目标文件连接为可执行文件过程中产生的中间结果,可以让连接程序不生成这个文件,直接按Enter键即可。

4.3 忽略库文件

忽略了映像文件的生成后,屏幕显示如下图所示。

上图中,连接程序提示输入库文件的名称。库文件里面包含了一些可以调用的子程序,如果程序中调用了某一个库文件中的子程序,就需要在连接的时候,将这个库文件和目标文件连接到一起,生成可执行文件。

但是,这个程序中没有调用任何子程序,所以,这里忽略库文件名的输入,直接按Enter 键即可。

4.4 连接结束的结果

忽略了库文件的连接后,屏幕显示如下图所示。

上图中,对目标文件的连接结束,连接程序输出的最后一行告诉我们,这个程序中有一个警告错误:“没有栈段”,这里我们不理会这个错误。

上面我们通过对当前路径下的1.obj进行连接的过程,展示了使用连接器对目标文件进行连接的方法。按照上面的过程进行了连接之后,在连接器link.exe运行的目录下(即当前路径下),将出现一个新的文件:1.exe,如下图所示,这是对目标文件1.obj进行连接所得到的结果。当然,如果连接过程中出现错误,那么将得不到可执行文件。

4.5 连接的作用

连接的作用是什么呢?

对于连接,我们也不想过多地讨论。实际上,在汇编学习中,我们将会接触到许多知识、概念,对于这些,我们并不是都有深入讨论的必要。

这里再次强调一下,我们学习汇编的主要目的,就是通过用汇编语言进行编程而深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的。基于这种考虑,我们的编程活动,大都是直接对硬件进行的。我们希望直接对硬件编程,却并不希望用机器码编程。我们用汇编语言编程,就要用到编辑器(Edit)、编译器(masm)、连接器(link)、调试工具(Debug)等所有工具,而这些工具都是在操作系统之上运行的程序,所以我们的学习过程必须在操作系统的环境中进行。我们在一个操作系统环境中,使用了许多工具,这势必要牵扯到操作系统、编译原理等方面的知识和原理。我们只是利用这些环境、工具来方便我们的学习,而不希望这些东西分散了我们的注意力。所以,对于涉及而又不在我们学习的主要内容之中的东西,我们只做简单的解释。

✍我们简单地讲一下连接的作用,连接的作用有以下几个。

  1. 当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件。
  2. 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件。
  3. 一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。

❗注意,对于连接的过程,可执行文件是我们要得到的最终结果。

5. 简化编译和连接的过程

在前面的内容里,介绍了如何使用masm和link进行编译和连接。

可以看出,我们编译、连接的最终目的是用源程序文件生成可执行文件。在这个过程中所产生的中间文件都可以忽略。所以我们可以用一种较为简捷的方式进行编译、连接。

还是一样,需要在执行程序的目录下执行所有过程。

5.1 简捷的编译

过程如下图所示。

见上图可知,直接在masm后面加上被编译的源程序文件名,然后再加上分号,按Enter键后,编译器就对源程序文件进行编译,在当前路径下生成目标文件1.obj,并在编译的过程中自动忽略中间文件的生成。

5.2 简捷的连接

过程如下图所示。

见上图可知,直接在link 后面加上被连接的目标文件名,再加上分号,按Enter键后,连接程序就对当前路径下的1.obj进行处理,在当前路径下生成可执行文件1.exe,并在过程中自动忽略中间文件的生成。

6. 1.exe 的执行

现在,终于将我们的第一个汇编程序加工成了一个可在操作系统下执行的程序文件我们现在执行一下,下图展示了 1.exe 的执行情况。

奇怪吗?

程序运行后,竟然没有任何结果,就和没有运行一样。那么,程序到底运行了吗?

程序当然是运行了,只是从屏幕上不可能看到任何运行结果,因为,我们的程序根本没有向显示器输出任何信息。程序只是做了一些将数据送入寄存器和加法的操作,而这些事情,我们不可能从显示屏上看出来。程序执行完成后,返回,屏幕上再次出现操作系统的提示符。

当然,我们不能总是写这样的看不到任何结果的程序,随着之后的进一步学习,我们将会向显示器上输出信息,请大家耐心等待。

结语

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

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

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【汇编】(五)第一个汇编程序
源程序由“ 汇编指令+伪指令+宏指令 ”组成: 伪指令:编译器处理; 汇编指令:编译为机器码;
sidiot
2023/08/31
3260
【汇编】(五)第一个汇编程序
【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程
在这一章节的内容学习中,我们终于可以编写一个完整的汇编程序了,我们以前都是在Debug中写一些指令,在Debug中执行。现在我们将开始编写完整的汇编语言程序,用编译和连接将它们编译连接成为可执行文件(如:*.exe文件),在操作系统中运行。
Crossoads
2024/10/24
3930
【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程
汇编语言-第四章 第一个程序
一个源程序从写出到执行的过程 编写汇编源程序 对源程序进行编译链接 ---- 1.使用 汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件。 2.用链接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。 其中,可执行文件包含两部分内容: 程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据) 相关的描述信息(比如,程序有多大、要占用多少内存空间)。 ---- 执行可执行文件中的内容 操作系统按照可执行文件中的描述信息,将可执行文件中的机器码和数据加载
青木
2018/05/28
6340
【汇编语言】第一个程序(四)—— 谁在幕后启动程序 : 探讨可执行文件的装载与执行
我们在前面文章中讲过,在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2,将P1从可执行文件中加载入内存,将CPU的控制权交给它,P1才能得以运行;当P1运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P2。
Crossoads
2024/11/13
1500
【汇编语言】第一个程序(四)—— 谁在幕后启动程序 : 探讨可执行文件的装载与执行
二级选择题(二)
用C语言编辑的程序代码为源程序,C语言源程序的文件扩展名是”.C”。C语言编写的函数都可以作为一个独立的源程序文件,但是只有main函数可以单独进行编译,一个C语言程序只能有一个主函数。因此选项A、B、D叙述正确,选项C叙述错误。
pigeon
2022/04/11
9660
【汇编语言】第一个程序(二)—— 带你真正了解一个源程序的结构是怎样的
那么谁来执行伪指令呢?伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。
Crossoads
2024/10/30
3910
【汇编语言】第一个程序(二)—— 带你真正了解一个源程序的结构是怎样的
as - 汇编语言编译器
as是一款常用的汇编语言编译器,在软件开发和系统编程等领域应用广泛,以下是关于它的详细介绍:
是山河呀
2025/02/02
1790
从一个简单的汇编程序学习汇编程序的结构以及编译链接的过程
由于大部分的pwn都是在Linux平台下的,故下面所涉及到的汇编都是在Linux平台下的汇编。
Elapse
2020/08/17
1.7K0
汇编笔记
https://blog.csdn.net/yuzuruhanyu/article/details/80287419 https://www.cnblogs.com/zyever/p/7919007.html 王爽汇编课后答案
yifei_
2022/11/14
4450
鹅厂面试题|“你知道C++从源文件到可执行代码的过程吗?”
对于一个程序,从编辑文本开始到可执行,到底需要经过哪些过程,编译的原理又是什么?今天我们就来聊聊C++源文件从文本到可执行文件的历程。
灿视学长
2021/07/07
1.1K0
汇编语言 手记9
使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件 用连接程序(LINK.EXE)对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。 可执行文件中包含两部分
用户1154259
2018/01/18
7640
汇编语言 手记9
汇编DOS与Windows Masm编译运行代码步骤详解
obj文件一般是Object的简写,是程序编译后的二进制文件,obj文件可称为目标文件或中间文件。另外obj文件只给出了程序的相对地址。
timerring
2022/07/20
1.5K0
汇编DOS与Windows Masm编译运行代码步骤详解
C/C++程序的编译过程
C/C++语言的编译链接过程要把我们编写的一个c/c++程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。 编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。 链接是把目标文件、操作系统的启动代码和用到的库文件进行组织,形成最终生成可执行代码的过程。 过程图解如下: 从图上可以看到,整个代码的编译过程分为编译和链接两个过程。 1、编译过程 编译过程又可以分成两个阶段:编译和汇编。 1.1 编译阶段 编译是读取源程序(字符流),进行词法和语法的分析,将高级语言指令转换
老九君
2022/03/04
8680
汇编语言 debug masm5.0的使用
第一步: 从网站上下载MASM5.0到本地盘,然后运行dosbox0.74-win32-installer.exe,此时桌面会有快捷方式 另一个步骤就是:将你的masm下的文件全部复制到一个盘,如d盘下的soft文件夹下 双击运行,在出现的Z:\>下输入 mount c d:\soft c:指的是虚拟目录 d:\soft :指的是你的.exe文件目录 第二步: 直接输入c: 进入你指定的虚拟盘 如果要验证是否成功上述步骤,先输入dir 有输出各种时间参数即表示成功 随后 输入debug 就可以开始工作了 -R 查看、改变CPU寄存器的内容 -D 查看内存中的内容 -d 1000:0 它会输出段地址从1000:0到1000:70的128个单元内容 -d 1000:0 9 输出从1000:0开始的9个单元内容 -E 改写内存中的内容 -e 1000:0 0 1 2 3 4 改变1000:0开始重写为0 1 2 3 4 -U 将内存中的机器指令翻译成汇编指令 -u 1000:0 输出1000:0到1000:1E中的汇编指令 -T 直接执行一条机器指令 -A 写入一条汇编指令 -a 1000:0 mov ax,1 想要结束按回车就好
meihuasheng
2021/03/16
7200
C语言编译全过程剖析
C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大家可以多了解一些,在遇到问题时多思考、多实践。
阳光岛主
2019/02/19
1.1K0
【重生之我在学习C语言编译与链接详解】
C语言是一种编译型语言,这意味着我们编写的C语言代码需要经过一系列的处理步骤,才能转换
用户11456817
2025/02/02
520
Win8下用DOSBox编写汇编语言
DOSBox 是一个 DOS模拟程序,可以很方便的移植到其他的平台,因此可以使用它在Win8系统中编写汇编语言。下面提供相关下载链接:
全栈程序员站长
2022/07/23
7870
Win8下用DOSBox编写汇编语言
汇编入门demo(win/mac)
汇编流程, 云+的md好像不支持流程图(汗), 我给出md的流程图代码和对应图片.
sean_yang
2020/12/06
8690
汇编语言设计程序篇-03
如果不明确指定,那么[0]就表示ds:[0],如果明确指定了,像上面es:[bx],那对应的段地址就默认按照es寄存器中的值为准
大忽悠爱学习
2022/06/19
6690
汇编语言设计程序篇-03
c++ 函数模板
c++ obj文件 obj文件就是目标文件,是源程序经过编译程序编译后生成的 不能直接执行,需要连接程序连接后才能生成可执行文件,这样就能执行 一般由机器代码组成,但也可以是自己定义的一些伪指令代码(需有专门的解释程序对其进行解释执行) 连接程序 把目标代码和它所使用的库文件连接的程序 obj文件与exe文件的区别 编译:当前源代码编译成二进制目标文件(obj文件) 链接(link): 将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件) project中每个cpp经编译成为obj
ruochen
2021/05/20
5610
c++ 函数模板
相关推荐
【汇编】(五)第一个汇编程序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验