4 第一个程序:1.exe

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fallfeather/article/details/78309682

知识储备
1、汇编语言程序从写出到执行的过程
编写汇编源程序;
对源程序进行编译链接;
执行可执行文件中的程序。
2、可执行文件包含两部分内容:

  • 程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
  • 相关的描述信息(比如:程序有多大,要占用多少内存空间等)

生成*.exe文件步骤
3、汇编代码

assume cs:fallrain

fallrain segment
	mov ax,2
	add ax,ax
	add ax,ax
	
    mov ax,4c00H
    int 21H
fallrain ends

end

将文件保存为1.asm。
4、编译(本机如果没有需要自行下载masm汇编编译器)
将1.asm保存到masm文件夹中,方便操作。
打开命令行界面,如图所示:
这里写图片描述
先进入masm目录下:
这里写图片描述
运行masm.exe:
这里写图片描述
由于我所写的汇编文件已经在当前目录下,所以无需指定路径:
这里写图片描述
具体解释下输入的四行:
第1行:指定操作的*.asm的文件,如果不在此目录下需要指定绝对路径(我嫌麻烦所以就直接放同级目录了)
第2行:生成的*.obj文件,同样可以指定目录,这里为默认(同级目录下与.asm文件名相同的.obj文件)
第3行:列表文件的名称,这个文件是编译器将源程序编译为目标文件的过程中产生的中间结果。可以让编译器不生成这个文件,直接按ENTER键即可。
第4行:交叉引用文件的名称,同样是中间文件,可以不生成,直接ENTER。
执行完就生成了一个名为1.obj的文件。
5、连接(一般link.exe在masm的文件夹内)
运行link.exe
这里写图片描述
由于1.obj已经在当前目录下,所以无需指定路径:
这里写图片描述
具体解释一下输入的四行:
第1行:指定操作的*.obj的文件
第2行:生成的*.exe文件,同样可以指定目录,这里为默认
第3行:映像文件的名称,是中间文件,ENTER
第4行:库文件的名称,库文件里面包含了一些可以调用的子程序,如果程序中调用了某一个库文件中的子程序,就需要在连接的时候,将这个库文件和目标文件链接到一起,生成可执行文件,但这个程序没有调用任何子程序,所以直接ENTER
最后一行有一个警告提示:”没有栈段“,先不理会。
执行完就生成了一个名为1.exe的文件。
连接的作用:
-当程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接在一起,生成一个可执行文件
-程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件
-正常什么都不需要的话也需要通过连接来生成一个可执行的文件才可以执行。
6、执行
这里写图片描述
很奇怪,程序执行未出现任何结果,为什么?
因为程序执行了,我们在代码中未向显示器输出任何信息,程序只是做了一些将数据送入寄存器和加法的操作,这些事情并不能从屏幕上看出来,程序执行完成后返回,屏幕上再次出现操作系统的提示符。

程序执行的过程
在DOS(一个单任务操作系统)的基础上,简单讨论:
一个程序2在可执行文件中,必须有一个正在运行的程序1,将2从可执行文件中载入内存后,将CPU的控制权交给2,2才能得以运行,2开始运行后,1暂停运行
2运行完毕后,应该将CPU的控制权交还给使他运行的程序1,此后,继续运行。

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

猜你喜欢

转载自blog.csdn.net/fallfeather/article/details/78309682