一个源程序从写出到执行的过程

简要过程: 编写–>编译–>链接–>执行

  • 编写:使用文本编辑器用汇编语言编写源程序
  • 编译:对源程序编译产生目标文件
  • 连接:使用连接程序对目标文件进行临界产生可执行文件
  • 执行:执行可执行文件(包括程序机器码,数据和相关描述信息)

    源程序

    包括汇编指令和伪指令

汇编指令:对应的机器码指令最终可为CPU执行。
伪指令:由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。

一些例子
segmentends:定义一个段,每个段必须有一个名称来标识,即 段名 segment、段名 ends。
end:程序结束标记,如果程序写完不加伪指令end,则编译器不知道程序在何处结束。
assume含义为假设,它假设某一段寄存器和程序中某一个用segment定义的段相关联。

程序返回:一个程序结束后,讲CPU的控制权交还给使得它得以运行的程序,这个过程叫,程序返回。
在程序末尾加上返回的程序段:

1
2
mov ax,4c00H 
int 21H

编译源程序

  使用masm命令可以对我们的asm文件进行编译,编译过程中会生成目标文件(.obj),也可以选择是否尝试中间文件,如交叉引用文件(.crf)、列表文件(.list)

连接

  在对源程序进行编译得到目标文件后,我们需要对目标文件进行连接,从而得到可执行文件。
使用link命令可以将obj文件连接生成可执行exe文件,其中可以选择产生中间结果,如映像文件(.map),也可以选择相应的库文件(.lib),库文件中包含了可以调用的子程序。

用debug对程序执行过程进行跟踪

关于debug的使用参见另一篇blog:

EXE文件中程序的加载过程


  程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0 ,则程序所在的内存区的地址为:ds:0;
  这个内存区的前256个字节中存放的是PSP,dos用来和程序进行通信。从256字节处向后的空间存放的是程序。
  所以,我们从ds中可以得到PSP的段地址SA,PSP的偏移地址为 0,则物理地址为SA×16+0。因为PSP占256(100H)字节,所以程序的物理地址是:SA×16+0+256=SA×16+16×16=(SA+16)×16+0,可用段地址和偏移地址表示为:SA+10:0