汇编语言程序中的部分

vja*_*n27 5 assembly linker

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

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

  • 如果我将代码放在代码部分的数据部分和数据中怎么办?汇编程序如何处理它?

  • 如果程序中没有声明任何部分汇编器会做什么?

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

我知道我可以编写汇编程序来测试程序是否适用于每种情况,但我希望清楚地理解这个概念.

wal*_*lyk 4

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

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

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

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

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

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

  • 除了加载程序在将程序放入内存中运行时会查找特定部分之外,没有什么是真正“必需的”。如果您的特定对象不打算以这种方式使用,则它没有理由需要具有文本或数据部分。 (2认同)