第一个汇编程序

一个源程序从写出到执行的过程

源程序中的"程序"

标号

编辑源程序

编译

连接

1.exe的执行

谁将可执行文件中的程序装载进入内存并使它运行

总结

程序执行过程的跟踪

一个源程序从写出到执行的过程

第一步:编写汇编源程序

使用文本编译器(如 Edit,记事本等),用汇编语言编写汇编源程序

第二步:对源文件进行编译连接

使用汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件,再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件

可执行文件包含两部分内容

程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)

相关的描述信息(比如,程序有多大,要占用多少内存空间等)

这一步工作的结果,产生了一个可在操作系统中运行的可执行文件

第三步:执行可执行文件中的程序

在操作系统中,执行可执行文件中的程序

操作系统按照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。

源程序中的"程序"

用汇编语言写的源程序,包括伪指令和汇编指令,我们编程的最终目的是让计算机完成一定的任务,源代码中的汇编指令组成了最终由计算机执行的程序,而源程序中的伪指令是由编译器来处理,它们并不实现我们编程的目的,这里所说的程序就是指源程序中最终由计算机执行,处理的指令或数据

注意,以后可以将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行,处理的指令或数据,称为程序。程序最先以汇编指令的形式存在源程序中,径编译,连接后转变为机器码,存储在可执行文件中。

如图所示:



标号

汇编源程序中,除了汇编指令和伪代码外,还有一些标号,比如"codesg"。一个标号指代了一个地址。比如codesg在segment的前面,作为一个段的名称,这个段的名称最终将被编译,连接程序处理为一个段的段地址


编辑源程序

可以用任意的文本编译器来编译源程序,只要最终将其存储为纯文本文件即可,我们使用DOS下的Edit


进入DOS方式,运行Edit

在Edit中编辑程序,如图所示


将程序保存为文件c:\1.asm后,退出Edit,结束对源程序的编辑

编译

进入DOS方式,进入c:\masm目录,运行masm.exe,如图所示


注意,“[.ASM]“提示我们,默认的文件扩展名是asm,

比如,要编译的源程序文件名是"p1.asm”,只要在这里输入"p1"即可,可如果源程序文件不是以asm为扩展名的话,就要输入它的全名,比如源程序文件名为"p1.txt",就要输入全名

输入要编译的源程序文件名后,按enter键,如图所示


我们直接按enter键,使用编译程序设定的目标文件名

确定目标目标文件名称后,如图所示:


忽略了列表文件的生成后,如图所示:



忽略了交叉引用文件的生成后,如图所示:


按照上面的过程进行了编译后,在编译器masm.exe运行的目录下,将出现一个新的文件:1.obj,这是对源程序1.asm进行编译所得到的结果,当然如果编译过程中出现错误,那么将得不到目标文件,一般来说,有两类错误使我们得不到所期望的目标文件

程序中有"Severe Errors"

找不到所给出的源程序文件

连接

在对源程序进行编译得到目标文件,我们需要对目标文件进行连接,从而得到可执行文件。


进入DOS方式,进入C:\masm目录,运行link.exe,如图所示:



确定了可执行文件的名称后,忽略了映像文件的生成后,忽略了库文件的连接后,如图所示:


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

1.exe的执行

现在,终于将我们的第一个汇编程序加工成了一个可在操作系统下执行的程序文件,我们现在执行一下,如图所示:


程序运行后,就和没有运行一样,那么,程序到底运行了吗?

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


谁将可执行文件中的程序装载进入内存并使它运行

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

于是得出结论:


在DOS中直接执行1.exe时,是正在运行的comomand,将1.exe中的程序加载入内存

command设置CPU的CS:IP指向程序的第一个指令(即程序的入口),从而使程序得以运行

程序运行结束后,返回到command中,CPU继续运行command

总结

汇编程序从写出到执行的过程:


编程(Edit)->1.asm->编译(masm)->1.obj->连接(link)->1.exe->加载(command)->内存中的程序->运行(CPU)

程序执行过程的跟踪

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

具体方法:


我们可以用R命令看一下各个寄存器的设置情况:


cx中存放的是程序的长度,1.exe中程序的机器码共有15个字节,则1.exe加载后,cx的内容为000FH

可以用U命令看一下其他指令:


可以看到,从12AE:0000—12AE:000E都是程序的机器码

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



需要注意的是在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。

————————————————

版权声明:本文为CSDN博主「鬼才fjz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_51174487/article/details/118711281