前面所学习的Debug的用法,但并不是一个完整的程序
对于汇编程序
由源程序文件到可执行文件:
源程序文件(.asm)——>目标文件(*.obj)——>(链接)可执行文件(.exe)
有上面这图我们来分析
源程序
在汇编语言的程序中有两种指令
- 伪指令
- 汇编指令
伪指令:由编译器执行
汇编指令:对应的机器码,被编译为机器码,被CPU执行
具体分析:
(1)segment和ends是一对成对使用的伪指令
这是在写可被编译的汇编程序时,必须用到的一对伪指令
其功能是定义一个段
segment 说明段开始
ends 说明段结束
格式:
段名 segment
…
段名 ends
(2)end
end是一个汇编程序的结束标记,,告诉编译器我们写完了
就结束编译
注意:区别上面的ends!!
(3)assume(假设)
它假设某一段寄存器和程序中的某一个segment…ends的定义的段相关联
就如上图中,assume cs:codesg
将用作代码段的段codesg和CPU中的段寄存器 cs联系起来
(4)mov ax,0123…
这一段就是汇编指令
里面的内容不做解释
(5) mov ax,4c00 int 21
这是一个程序返回
这里解释一下我们写的程序怎么得到运行的:
在DOS基础上,一个程序P2在可执行文件中,在之前必须有一个正在运行的P1文件
将P2从可执行文件中加载入内存,将CPU的控制权交给P2,让P2得到运行。当P2运行完成后,就需要我们将控制权交还给P1,然后P1继续运行
所以这就为什么要写这个代码的原因!!
当然现在我们只需要记住末尾要加入这两条指令
最后如果在编写程序时,存在语法错误,这样的错误是很容易发现的,编译器会提醒我们哪里有问题,而逻辑错误不易发现。
编辑源程序
在编辑源程序时我们用DOS提供的Edit
当然也可以用其他的,比如记事本
VC++
…
这里我使用的就是Edit
将写完的程序进行保存并,命名,尾部一定要加上*.asm
保存后我们就会看到在此目录下我们保存的1.asm的源程序文件
编译
由上述我们已经生了源程序文件(1.asm),现在我们要做的是生成目标文件
这里我们已经下载好了编译器(masm.exe)那么我们直接在DOX上面运行就好了
在masm后面输入要编译的源程序文件即可,这里默认文件就是asm,所以我们在输入时其实可以不用后面加上asm,但注意如果你的源程序时txt文件,那么你就要加上*.txt
除此之外,如输入源程序要指明路径,如果文件就在当下的路径就不需要,只用输入文件名就可以,但如果文件在其他的目录中,则要输入路径
ag:
编译文件在c:\winddows\desktop下,就需要输入c:\winddows\desktop\p1.txt
(1)在我们运行masm后就会出现上图的样子
首先出现信息是说明这个编译器的版本
第四行就是生成的目标文件
这里我们可以输入名字,也可以不用输入
(2)上图中紧接着出现的两行,分别时列表文件(*.LST)和交叉引用文件( *.CRF)
这是生成目标文件的中间文件,这里我们先忽略
由上图我们还可以看到我们这个文件并没有生成,有错误
上面说我们没有定义END
这里我们修改一下
后面还是生成了
注意:如果不想这么繁琐,我们可以在masm 1后面加一个分号,就会跳过这些步骤直接生成,同下面的连接一样
连接
连接的目的就是生成可执行文件
与上述生成目标文件的方式极为类似,就是这里我们用的工具时link工具
我们已经下载好了,直接用
操作方式跟masm一样
这里解释一下
映像文件(*.MAP)
库文件(.LIB)
这都是生成的中间文件
而no stack segment 表示说没有栈段,我们知道栈的危险,这里我们先忽略
库文件可以将子程序链接起来,调用库中的文件与目标文件联系在一起生成可执行文件,在后面我们会了解到
最后这是我们生成的可执行文件
1.exe的执行
这里我们执行了1.exe文件,奇怪的是,没有返回任何显示
但这里程序是运行了
原因是我们的程序根本没有向显示器输出任何信息,所以不会看到,后面会讲解到
程序执行过程和追踪
这里我们用Debug对程序进行追踪
在上面我们在说程序返回时,我们讲述了原因,
而对于执行P1其实就是command,当然现在的是cmd
如果不用Debug追踪,要直接执行,就用command,但这样我们就看不到是否执行了
所以我们用Command先去执行Debug,然后用Debug去执行1.exe的文件
我们观察这副图,DS=075A,CS=076A,CX=000F
这里
CX存放的是程序的长度,1.exe中的机器码共有15个字节
所以是F(十六进制)
现在程序已经从1.exe中装入内存,接下来查看一下它的内容,可是我们查看哪里的呢容呢?
程序被装入了内存的什么地方?
我们怎么知道?
DOS首先找到一段起始地址,就是DS,在起始地址留出256Bit
创建一个PSP的数据区
CS的地址则在DS+10H,根据我们前面学过的物理地址知道,段地址是要X16的,那么10H*10H(16)为100H
而100H0-255就是256个 Bit
这里的知识与操作系统有关,对于学习汇编语言我们只需要知道就好了
补充
- P命令:继续命令 类似T命令,逐条执行指令,显示结果,但遇到子程序、中断程序时直接执行然后显示结果
- G命令:运行命令,从指定地址处开始运行程序,直到遇到断点或者程序正常结束
记住用使用P命令执行int 21
至于原因,先不必考虑
要退出Debug用Q命令
执行
这里我们再查看psp中的内容
有点东西