第四章 第一个程序
(这部分涉及的内容很多不是在知识层面上的而是需要动手的)
4.1 一个源程序从写出到执行的过程
4.2 源程序
伪指令:
(1)XXXsegment~~~XXXends:一个有意义的汇编程序至少有一个段,这个段用来存放代码。
(2)end:end是一个汇编程序结束的标志,编译器遇到了end就结束对源程序的编译,end是必须要有的。
(3)assume:用来关联某一寄存器和程序中的某一个段。
源程序:源程序中的所有内容。
程序:源程序中最终由计算机执行、处理的指令或数据。
程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。
标号:一个标号指代了一个地址。
结构:(1)定义段(2)在段中写入汇编指令(3)指出程序在哪结束(4)将段与寄存器相关联。
程序返回:程序结束后将CPU的控制权交还给使它得以运行的程序的过程。(mov ax,4c00h int 21h所实现的功能就是程序返回)
错误:分为语法错误和逻辑错误。
4.3编辑源程序
可以使用任意文本编辑器来编辑源程序,只要最终将其存储为纯文本文件即可。
4.4编译
常见的两类错误:(1)SevereErrors(2)找不到所给出的源程序文件
在编译的过程中最多可以得到3个输出的文件:.obj、.lst、.crf,只有.obj是最终要得到的结果。
4.5连接
库文件里面包含了一些可以调用的子程序,如果程序调用了某一个库文件中的子程序就需要在连接的时候将这个库文件和需要的目标文件连接到一起,生成可执行文件。
没有栈段只是一个警告错误,可以忽略。
连接的作用:
(1)源程序很大的时候可以把它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将他们连接到一起,生成一个可执行文件。
(2)若程序调用了某个库文件中的子程序,可通过连接的方式把他们连接到一起。
(3)有时目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。
4.6以简化的方式进行编译和连接
4.7 .exe的执行
4.8 可执行文件中的程序装入内存并运行的原理
.exe的执行过程:
(1)在dos中执行.exe时正在运行的程序是command,将程序加载入内存。
(2)command设置CPU的CS:IP指向程序的第一条指令(程序的入口),从而使程序得以运行。
(3)程序运行结束后,返回到command,cpu继续运行command。
汇编程序从写出到执行的过程:
编程→编译→连接→加载→内存中的程序→运行
4.9程序执行过程的跟踪(Debug)
使用Debug观察程序的运行的原因:在DOS中运行一个程序的时候,我们不能逐条指令的看到程序的执行过程,因为command程序加载和设置CS:IP的操作是连续的,而当CS:IP一指向程序的入口,command就放弃了对CPU的控制权,CPU立即开始运行程序直至程序结束。而Debug并不放弃对CPU的控制。
程序加载后ds中存放着程序所在内存区的段地址,程序所在的内存区的地址为ds:0
这个内存区的前256字节中存放的是PSP,dos用来和程序进行通信,从256字节处向后的空间存放的是程序。
程序的物理地址=ds+10:0