首先要知道的是,我们写的程序叫做源程序
而操作系统能识别的是机器码,所以就需要把我们写的源程序转变为一个可执行文件(.exe文件)
这个笔记主要是记录怎么在DOSBOX中转换的。
先随便写点简单的代码,保存起来
assume cs: abc
abc segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax,4c00H
int 21H
abc ends
end
我把这个源文件的名字命名成了P4-1.asm,这时候还没有进行编译连接,只有一个.asm文件。
进入dosbox系统,挂载文件,然后输入dir查看一下可以运行的东西
可以看到有p4-1.asm文件,然后输入masm p4-1.asm,然后点回车,出现0警告0错误就说明ok了,如果你的源程序写错了,它中间会提示你第几行出错了,以及出错的原因,和c语言的编译差不多,只是换了个环境。
可以看到编译的过程中出现了几个文件,简单的来讲一下吧
.OBJ 目标文件 这是我们编译中需要的文件
.LST 列表文件 中间过程产生的文件
.CRF 交叉引用文件,也是一个中间文件
以上文件中,我们需要的是.OBJ.文件。
如果觉得上述编译太麻烦了,也可以直接输入masm p4-1.asm;(多了个分号)然后点回车,就直接输出了。
上面的操作做完之后可以看到原来存放源程序的文件夹中多了个.OBJ后缀的东西
接下来的操作是连接生成可执行文件,输入link p4-1.obj,点回车到最后
如果想要一步完成也可以直接输入link p4-1.obj;(加分号)
我们可以看到最后有个警告no stack segment,因为我们的源程序中没有定义栈段,不用理会这个警告。
一样的,生成了三个文件
.EXE 可执行文件,这个是我们最终需要的文件,加载到系统的文件
.MAP 连接程序将目标文件连接连接为可执行文件过程中产生的中间结果
.LBI 库文件
再来看看文件夹中又多了些什么东西
现在就有了.exe文件了,这个文件可以加载到系统中运行,也可以加载到debug中跟踪运行
加载进去后,输入u指令可以查看程序是加载进去了
接下来是运行跟踪,如果程序不长的话,可以直接输入几个t指令就ok了
如果程序过长的话,那应该怎么办呢?介绍一个g指令,格式 g 偏移地址,就会自动运行到cs:偏移地址处了,看看下面的例子吧
通过u指令我们看到了,源程序最后一行代码的地址是076A:000D,然后直接输入g 000d 就跳转到了执行最后一行代码 INT 21H了。
这个程序中还有个循环,循环的次数较少,可以用t指令,如果循环的次数较多,我们直接输入p指令就行了,debug就会自动重复执行循环中的指令。