【问题标题】:Question about "Link Map" output and "Assume" directive of MASM assembler关于 MASM 汇编器的“Link Map”输出和“Assume”指令的问题
【发布时间】:2010-04-04 03:09:13
【问题描述】:

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

当我使用 MASM 汇编器时,有一个名为“Link Map”的输出文件。它的内容由各个段的起始偏移量和长度组成,例如Data段、Code段和Stack段。我想知道,这些信息在哪里描述?他们是在讨论在 EXE 文件中的各个段是如何定位的,还是在程序加载器将 EXE 文件加载到内存中之后,段如何在在内存中定位? p>

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

提前致谢。

【问题讨论】:

    标签: c++ c masm assembly


    【解决方案1】:

    链接器映射

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

    ml /Fm foo.asm
    

    相同
    ml foo.asm /link /map
    

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

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

    它是按出现顺序放置在 EXE 或 DLL 映像中的 的列表。例如。代码、数据、资源、导入表、导出表等

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

    例如

     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 部分)。

    假设

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

    【讨论】:

    • 谢谢,亚历克斯。那么链接映射中的偏移量是指相对于磁盘上 EXE 文件开头的偏移量?与内存中的位置无关。
    • 不,它是相对于图像部分开始的偏移量。我想我应该解释一下对象和图像部分之间的区别。
    • 那么,它是文件中的偏移量,而不是内存中的偏移量?
    猜你喜欢
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多