【问题标题】:sections in assembly language program汇编语言程序中的部分
【发布时间】:2012-04-06 06:20:45
【问题描述】:

我不清楚汇编程序中的节(使用节指令声明)是如何由汇编器和链接器处理的。以下是一些查询:

  • 用户定义部分(标准 .text、.data、.bss 以外的部分)有什么用?

  • 如果我把代码放在数据段,把数据放在代码段怎么办?汇编程序如何处理它?

  • 如果程序中没有声明段,汇编器会做什么?

  • 如果只声明用户定义的部分(没有文本、数据和 bss),汇编器会做什么?

我知道我可以编写汇编程序来测试程序是否在每种情况下都可以工作,但我想弄清楚这个概念。

【问题讨论】:

    标签: assembly linker


    【解决方案1】:

    节只不过是独立的内存序列。每个新的数据字节都被放入当前打开的“程序段”中。在编写一个函数以使相关数据在源代码中非常接近时非常方便,即使当它加载到内存中时它可能是兆字节或千兆字节。

    用户定义的程序部分的工作方式与标准部分相同,但您通常必须向链接器和其他代码后处理工具提供额外信息,以便以合理的方式将它们加载到内存中。

    您可以将可执行代码放在数据段中,反之亦然,大多数汇编程序甚至不会对此发出警告。从数据部分执行代码可能需要一些技巧;反过来通常很容易。

    汇编程序通常通过以与源代码相同的顺序将等效部分写入目标模块来处理节,将相似节的重新排列一起留给链接器。只有最简单的汇编程序不提供这种能力。我想到了原来的 MSDOS .COM 文件汇编器。

    不同的汇编程序对于溺爱程序员有不同的理念。传统的策略是假设汇编语言程序员知道他们在做什么,并且按照字面意思执行所写的内容,除了不理解的内容。其他汇编程序更有帮助(或者很麻烦,这取决于您的观点),并抱怨多字节结构未对齐、数据或代码类型不匹配等问题。

    根据汇编程序的“帮助”,未能启动程序部分会导致默认行为(通常是假定的代码 .psect),或拒绝汇编并出现致命错误。即使是最结构化的汇编程序也不关心是否没有文本、数据或 bss。事实上,有一些有用的对象模块仅由符号定义组成,根本没有数据(或代码)字节。

    【讨论】:

    • 汇编器不会对部分进行任何重新排列吗?
    • 能否请您告诉链接器在这些情况下的行为?
    • 感谢您的解释!在我脑海中仍然挥之不去的一件事是,如果没有声明文本或数据部分,并且汇编器不关心链接器会做什么?可执行文件中不需要文本和数据部分吗?
    • 没有什么是真正的必需,除了加载器在将你的程序放入内存以运行它时会寻找特定的部分。如果您的特定对象不打算以这种方式使用,则没有理由需要文本或数据部分。
    • 实际上,操作系统加载程序甚至不查找特定部分。它而是确定入口点的位置并从那里执行代码。所有部分都只是按照可执行文件的元数据(包括文本部分)中指定的方式映射。
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多