汇编语言第四章总结
第四章结束后,我们可以开始编写完整程序了。
第一步:编写汇编源程序。使用文本编辑器(如Edit、 记事本等),用汇编语言编写汇编源程序。这一步工作的结果是产生了一个存储源程序的文本文件。
第二步:对源程序进行编译连接。
使用汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件;再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。可执行文件包含两部分内容。程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
相关的描述信息(比如,程序有多大、要占用多少内存空间等) 这一步工作的结果:产生了一个可在操作系统中运行的可执行文件。
第三步:执行可执行文件中的程序。在操作系统中,执行可执行文件中的程序。操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如设置CS:IP 指向第一条要执行的指令), 然后由CPU执行程序。在汇编语言源程序中,包含两种指令,一种是汇编指令, 一种是伪指令。汇编指令是有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。而伪指令没有对应的机器指令,最终不被CPU所执行。那么谁来执行伪指令呢?伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。
segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。segment 和ends的功能是定义一个段,segment 说明一个段开始,ends 说明一个段结束。一个段必须有一个名称来标识,使用格式为:
段名segment
段名ends
一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。我们在前面的课程中所讲解的段的概念,在汇编源程序中得到了应用与体现,一个源程序中所有将被计算机所处理的信息:指令、数据、栈,被划分到了不同的段中。一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。
end是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译。所以,在我们写程序的时候,如果程序写完了,要在结尾处加_上伪指令end。否则,编译器在编译程序时,无法知道程序在何处结束。不要搞混了end和ends, ends是和segment成对使用的,标记一个段的结束,ends的含义可理解为“endsegment"。这里的end的作用是标记整个程序的结束。
assume这条伪指令的含义为“假设”。它假设某一段寄存器和程序中的某一个用segment..ends定义的段相关联。通过assume 说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系。assume并不是一条非要深入理解不可的伪指令,以后我们编程时,记着用assume将有特定用途的段和相关的段寄存器关联起来即可。
用汇编语言写的源程序,包括伪指令和汇编指令,我们编程的最终目的是让计算机完成一定的任务。源程序中的汇编指令组成了最终由计算机执行的程序,而源程序中伪指令是由编译器来处理的,它们并不实现我们编程的最终目的。这里所说的程序就是指源程序中最终由计算机执行、处理的指令或数据。
汇编源程序中,除了汇编指令和伪指令外,还有一些标号,比如codeg"。一个标号指代一个地址。 比如codes在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。在前3章中,我们都是通过直接在Debug中写入汇编指令来写汇编程序,对于十分简短的程序这样做的确方便。可对于大一些的程序,就不能如此了。我们需要写出能让编译器进行编译的源程序,这样的源程序应该具备起码的结构。