assembly - 汇编语言程序中的部分

标签 assembly linker

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

  • 用户定义的部分(标准 .text、.data、.bss 以外的部分)有什么用?
  • 如果我把代码放在数据部分,把数据放在代码部分怎么办?汇编程序如何处理它?
  • 如果程序中没有声明任何节,汇编器会做什么?
  • 如果只声明了用户定义的部分(没有文本、数据和 bss),汇编器会做什么?

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

    最佳答案

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

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

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

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

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

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

    关于assembly - 汇编语言程序中的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9809576/

    相关文章:

    assembly - 在汇编中连续两次跳转是否安全?

    assembly - "rep; nop;"在 x86 汇编中意味着什么?和 "pause"指令一样吗?

    c - 如何解决链接描述文件中的错误?

    C++——msvc2012下的Qt+v8

    c - 将变量传递给 nasm 过程

    windows - 为 Windows x86 编写程序集

    assembly - 递归除法汇编程序

    iphone - "ld: library not found for -lXYZ"是什么意思?有哪些不同的可能性?

    C++ GNU 链接器错误

    c++ - cmake ist 将静态库(c++fs)放在链接器命令的末尾