1、汇编语言汇编语言汇编语言课件王爽 著清华大学出版社主讲-叶晓霞广东海洋大学信息学院1.汇编语言汇编语言第4章 第1个程序n4.1 一个源程序从写出到执行的过程n4.2 源程序n4.3 编辑源程序n4.4 编译n4.5 连接n4.6 以简化的方式进行编译和连接n4.7 1.exe的执行n4.8 可执行文件中的程序装入内存并运行的原理n4.9 程序执行过程的跟踪2.汇编语言汇编语言引言n现在我们将开始编写完整的汇编语言程序,用编译器将它们编译成为可执行文件(如:*.exe文件),在操作系统中运行。n这一章,我们将编写第一个这样的程序。3.汇编语言汇编语言4.1 一个源程序从写出到执行的过程n一个汇
2、编语言程序从写出到最终执行的简要过程:编写-编译-连接-执行n演示使用文本编辑器(如Edit、记事本等),用汇编语言编写汇编源程序。n使用汇编语言编译程序对源程序进行编译,产生目标文件;再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。在操作系统中,执行可执行文件中的程序。可执行文件中包含两部分内容:程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据);相关的描述信息(比如:程序有多大、要占多少内存空间等)。4.汇编语言汇编语言4.2 源程序n汇编指令n伪指令 XXX segment XXX ends end assume7.汇编语言汇编语言4.2 源
3、程序n源程序中的“程序”汇编源程序:伪指令 (编译器处理)汇编指令(编译为机器码)程序:源程序中最终由计算机执行、处理的指令或数据。注意13.汇编语言汇编语言程序经编译连接后变为机器码15.汇编语言汇编语言4.2 源程序n标号一个标号指代了一个地址。codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。16.汇编语言汇编语言4.2 源程序n程序的结构任务:编程运算 2 3。n定义一个段n实现处理任务n程序结束n段与段寄存器关联 汇编程序 assume cs:abc abc segment mov ax,2 add ax,ax add
4、ax,ax abc ends end 17.汇编语言汇编语言4.2 源程序n程序返回我们的程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,那么,它怎样得到运行呢?(讨论)现在,我们知道,一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。如何返回呢?18.汇编语言汇编语言4.2 源程序n程序返回应该在程序的末尾添加返回的程序段。mov ax,4c00H int 21Hn这两条指令所实现的功能就是程序返回。n几个和结束相关的内容20.汇编语言汇编语言段结束、程序结束、程序返回21.汇编语言汇编语言语法错误和逻辑错误n 语法错
5、误程序在编译时被编译器发现的错误;容易发现。aume cs:abc abc segment mov ax,2 add ax,ax add ax,ax end22.汇编语言汇编语言语法错误和逻辑错误n 逻辑错误程序在编译时不能表现出来的、在运行时发生的错误;不容易发现。assume cs:abc abc segment mov ax,2 add ax,ax add ax,ax mov ax,4c00H int 21H abc ends end 23.汇编语言汇编语言4.3 编辑源程序n进入DOS方式,运行Edit,在其中编辑程序,如下图所示:24.汇编语言汇编语言4.4 编译n进入DOS方式,进
6、入 C:masm 目录,运行masm.exe。n如果源程序文件不是以 asm 为扩展名的话,就要输入它的全名。比如p1.txt。n在输入源程序文件名的时候一定要指明它所在的路径。如果文件就在当前路径下,只输入文件名就可以。25.汇编语言汇编语言4.4 编译n输入要编译的源文件文件名后,按 Enter键。n目标文件(*.obj)是我们对一个源程序进行编译要得到的最终结果。n编译程序默认要输出的目标文件名为1.obj,所以可以不必再另行指定文件名。26.汇编语言汇编语言4.4 编译n列表文件是编译器将源程序编译为目标文件的过程中产生的中间结果。n可以不生成这个文件,直接按 Enter键即可。27.
7、汇编语言汇编语言4.4 编译n编译程序提示输入交叉引用文件的名称。n这个文件同列表文件一样,是编译器将源程序编译为目标文件过程中产生的中间结果。n可以不生成这个文件,直接按 Enter 键即可。28.汇编语言汇编语言4.4 编译n对源程序的编译结束,编译器输出的最后两行告诉我们这个源程序没有警告错误和必须要改正的错误。29.汇编语言汇编语言4.4 编译n一般来说,有两类错误使我们得不到所期望的目标文件:(1)我们程序中有“Severe Errors”;(2)找不到所给出的源程序文件。30.汇编语言汇编语言4.5 连接n在对源程序进行编译得到目标文件后,我们需要对目标文件进行连接,从而得到可执行
8、文件。n继续上一节的过程,我们再将C:masm1.obj连接为C:masm1.exe。31.汇编语言汇编语言4.5 连接n进入DOS方式,进入C:masm目录,运行link.exe。n如果目标文件不是以obj为扩展名的话,就要输入它的全名。比如:p1.bin。n在输入目标文件名的时候,要注意指明它所在的路径。这里,我们要连接的文件是当前路径下1.obj,所以此处输入“1”。32.汇编语言汇编语言4.5 连接n输入要连接的目标文件名后,按Enter键。n可执行文件是我们对一个程序进行连接要得到的最终结果。n连接程序默认要输出的可执行文件名为 1.EXE,所以可以不必再另行指定文件名。n我们直接按
9、 Enter 键,使用连接程序设定的可执行文件名。33.汇编语言汇编语言4.5 连接n映像文件是连接程序将目标文件连接为可执行文件过程中产生的中间结果。n可以不生成这个文件,直接按 Enter 键即可。34.汇编语言汇编语言4.5 连接n连接程序提示输入库文件的名称。n库文件里包含了一些可以调用的子程序,如果我们的程序中调用了某一个库文件中的子程序,就需要在连接的时候,将这个库文件和我们的目标文件连接到一起,生成可执行文件。n如果没有调用任何子程序,直接按Enter键即可。35.汇编语言汇编语言4.5 连接n对目标文件的连接结束,连接程序输出的最后一行告诉我们,这个程序有一个警告错误:“没有栈
10、段”,这里我们不理会这个错误。36.汇编语言汇编语言4.5 连接n前面我们通过对 1.obj 进行连接的过程,展示了使用连接器对目标文件进行连接的方法。n我们得到了一个新的文件 1.exe。当然,如果连接过程中出现错误,那么我们将得不到这个可执行文件。n连接的作用是什么呢?37.汇编语言汇编语言4.5 连接n这里再次强调一下,我们学习汇编的主要目的,就是通过用汇编语言进行编程而深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的。n基于这种考虑,我们的编程活动,大都是直接对硬件进行的。我们希望直接对硬件编程,却并不希望用机器码编程。n我们用汇编语言编程,就要用到:编辑器(Ed
11、it)、编译器(masm)、连接器(link)、调试工具(debug)等所有工具,而这些工具都是在操作系统之上运行的程序,所以我们的学习过程必须在操作系统的环境中进行。38.汇编语言汇编语言4.5 连接n连接的作用有以下几个:当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;39.汇编语言汇编语言4.5 连接n连接的作用有以下几个(续):一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接
12、用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。n注意,对于连接的过程,可执行文件是我们要得到的最终结果。40.汇编语言汇编语言4.6 以简化的方式进行编译和连接n我们编译、连接的最终目的是用源程序文件生成可执行文件。n在这个过程中所产生的中间文件都可以忽略。我们可以用一种较为简捷的方式进行编译、连接。41.汇编语言汇编语言4.7 1.exe的执行n现在,终于将我们的第一个汇编程序加工成了一个可在操作系统下执行的程序文件。1.exe的执行情况:n程序到底运行没有
13、?程序当然运行了,只是从屏幕上不可能看到任何运行结果。44.汇编语言汇编语言4.7 1.exe的执行n我们的程序没有像显示器输出任何信息。程序只是做了一些将数据送入寄存器和加法的操作,而这些事情,我们不可能从显示屏上看出来。n程序执行完成后,返回,屏幕上再次出现操作系统的提示符。45.汇编语言汇编语言4.8 可执行文件中的程序装入内存并运行的原理n在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2,将 P1 从可执行文件中加载入内存,将CPU的控制权交给它,P1才能得以运行;当P1运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P2。n1.exe的执行过程46.汇
14、编语言汇编语言4.8 可执行文件中的程序装入内存并运行的原理n1.exe的执行过程:(1)我们在提示符“C:masm”后面输入可执行文件的名字“1”,按Enter键。问题4.1(2)1.exe中的程序运行;(3)运行结束,返回,再次显示提示符“C:masm”。问题4.247.汇编语言汇编语言 问题4.2n执行第(3)步操作,程序运行结束后,返回到哪里?n参考内容n回答问题4.1和4.249.汇编语言汇编语言回答问题4.1和4.2n(1)我们在DOS中直接执行 1.exe 时,是正在运行的command将1.exe中的程序加载入内存。n(2)command设置CPU的CS:IP指向程序的第一条指
15、令(即程序的入口),从而使程序得以运行。n(3)程序运行结束后,返回到command中,CPU继续运行command。51.汇编语言汇编语言n汇编程序从写出到执行的过程:52.汇编语言汇编语言4.9 程序执行过程的跟踪n为了观察程序的运行过程,我们可以使用Debug。nDebug 可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU 的控制,这样,我们就可以使用Debug 的相关命令来单步执行程序,查看每条指令指令的执行结果。53.汇编语言汇编语言4.9 程序执行过程的跟踪n接下来可以用R命令看一下各个寄存器的设置情况:n可以看到,Debug将程序从可执行文件加载入
16、内存后,cx中存放的是程序的长度。1.exe 中程序的机器码共有15个字节。54.汇编语言汇编语言4.9 程序执行过程的跟踪n现在程序已从 1.exe 中装入内存,接下来我们查看一下它的内容,可是我们查看哪里的内容呢?n程序被装入内存的什么地方?n我们如何得知?n在DOS系统中.EXE文件中的程序的加载过程如下55.汇编语言汇编语言EXE文件中的程序的加载过程56.汇编语言汇编语言EXE文件中的程序的加载过程n总结程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0,则程序所在的内存区的地址为:ds:0;这个内存区的前256(100H)个字节中存放的是PSP,dos用来和
17、程序进行通信。从 256字节处向后的空间存放的是程序,所以程序的物理地址是:SA16+0+256=SA16+1616=(SA+16)16+0 可用段地址和偏移地址表示为:SA+10:0 即cs=ds+10h,ip=0。57.汇编语言汇编语言4.9 程序执行过程的跟踪n用U命令查看一下其他指令:58.汇编语言汇编语言4.9 程序执行过程的跟踪n用T命令单步执行程序中的每一条指令,并观察每条指令的执行结果,到了 int 21,我们要用P命令执行:59.汇编语言汇编语言4.9 程序执行过程的跟踪nint 21 执行后,显示“Program terminated normally”,返回到Debug中。n表示程序正常结束。那程序返回哪里呢?60.汇编语言汇编语言4.9 程序执行过程的跟踪n我们在 DOS中用“Debug 1.exe”运行Debug对1.exe进行跟踪时,程序加载的顺序是:command加载Debug,Debug加载1.exe。n返回的顺序是:从1.exe中的程序返回到Debug,从Debug返回到command。n使用Q命令退出Debug,将返回到command中,因为Debug是由command加载运行的。61.