为什么需要分两步走,编译再链接(masm.exe / link.exe)
编译 masm asm --> obj
链接 link obj --> exe
假设有100w行代码,编译需要花费一段时间(比方说5min)。如果代码有错误,修改过后要重新进行这个5min的过程,如果错误不能一次性解决,就会花费很多个这样的5min。
可行的方法是:
把100w行代码拆分开来,再分别编译为.obj:
t1.asm — t1.obj
t2.asm — t2.obj
…
t1000.asm —t1000.obj
如果其中有个文件tx.asm出错了,我们只需要单独去修改tx的错误并重新编译tx,再对其进行链接就可以了。
可执行文件exe
系统可以运行exe文件,且需要为exe分配一段内存,系统是怎么知道要分配多大的内存给这个程序的?
因为exe文件中除了我们整个程序的代码,还包括了一些信息(描述信息):文件大小,程序入口。系统会根据这些描述信息对寄存器进行相关配置。
start伪指令:
告诉编译器如何编译,在exe文件的描述信息中扮演者:
将我们设置的程序的入口地址 记录在exe文件的描述信息中
然后系统通过这个描述文件中的内容去设置cs:ip,当然还有其他内容,栈段和数据。
观测link后生成的.map文件,会发现里面已经描述了DATA,STACK,CODE三段的起始地址,终止地址以及长度。还指明了程序的入口地址: