Assembly 汇编语言程序中的节

Assembly 汇编语言程序中的节,assembly,linker,Assembly,Linker,我不清楚汇编程序和链接器如何处理汇编程序中的节(使用节指令声明)。以下是一些查询: 用户定义的节(标准.text、.data、.bss以外的节)有什么用途 如果我把代码放在数据部分,把数据放在代码部分呢?汇编程序如何处理它 如果程序中没有声明节,汇编程序将做什么 如果只声明用户定义的部分(没有文本、数据和bss),那么汇编程序将做什么 我知道我可以编写汇编程序来测试一个程序是否在每种情况下都能工作,但我想弄清楚这个概念。节只不过是独立的内存序列。每个新的数据字节都被放入当前打开的“程序段”。

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

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

  • 如果我把代码放在数据部分,把数据放在代码部分呢?汇编程序如何处理它

  • 如果程序中没有声明节,汇编程序将做什么

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


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

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

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

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

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

不同的汇编器对于溺爱程序员有不同的理念。传统的策略是假设汇编语言程序员知道他们在做什么,并且除了不理解的内容外,他们实际上在做编写的内容。其他的汇编程序更有用(或者是麻烦,取决于你的观点),并且抱怨多字节结构不对齐、数据或代码类型不匹配等等


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

汇编程序没有对节进行任何重新排列吗?您能告诉我链接器在这些情况下的行为吗?谢谢您的解释!有一件事仍然萦绕在我的脑海中,那就是如果没有声明文本或数据节,如果汇编程序不关心链接器会做什么?文本和数据部分在可执行文件中不是必需的吗?实际上不需要什么,只需要加载程序在将程序放入内存中运行时查找特定部分。如果您的特定对象不打算以这种方式使用,那么就没有理由需要文本或数据节。实际上,OS加载程序甚至不查找特定的节。而是确定入口点的位置并从那里执行代码。所有部分仅按照可执行文件(包括文本部分)的元数据中的指定进行映射。