关于MASM汇编程序的“链接映射”输出和“假设”指令的问题

时间:2010-04-04 03:09:13

标签: c++ c masm assembly

我是MASM的新手。所以这些问题可能非常基础。

当我使用MASM汇编程序时,有一个名为“链接映射”的输出文件。其内容由各个段的起始偏移量和长度组成,如数据段,代码段和堆栈段。我想知道,这些信息在哪里描述?他们是在谈论各个细分市场如何在EXE文件中 ,或者在程序加载器将EXE文件加载到内存后,细分如何位于内存中?

顺便说一句:“假设”指令有什么作用?我的理解是它告诉汇编程序将一些信息发送到exe文件头,以便程序加载程序可以使用它来相应地设置DS,CS,SS,ES寄存器。我是对的吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

链接器地图

这不是特定于MASM的。它是链接器的一部分。即。

ml /Fm foo.asm

相同
ml foo.asm /link /map

ml /c foo.asm
link foo.obj /map

cl.exe也有这个选项(/Fm)也可以做同样的事情。

它是按照它们出现的顺序放置在EXE或DLL图像中的部分的列表。例如。代码,数据,资源,导入表,导出表等

偏移量相对于图像部分的开头。链接器可以将许多对象部分组合成图像部分。

E.g。

 0002:00001514 00000014H .idata$2                DATA
 0002:00001528 00000014H .idata$3                DATA
 0002:0000153c 000000f8H .idata$4                DATA
 0002:00001634 00000464H .idata$6                DATA

以上是对象部分(它们来自.obj个文件),因为它们包含以$开头的后缀。链接器将它们合并到最终图像模块中的一个部分.idata中(以后缀的字典顺序排列)。偏移量是相对于链接器分配导入地址表(.idata部分)的起点。

假设

提供编译时检查,以防止意外滥用寄存器。它不会生成任何代码。见