【问题标题】:How does DB work? Aren't bytes of the assembler output code?数据库是如何工作的?汇编器输出代码的字节不是吗?
【发布时间】:2020-11-28 09:16:41
【问题描述】:

到目前为止,我所研究的是,我们用汇编语言编写了一个程序……将这个程序传递给生成机器代码的汇编程序……将机器代码传递给 ROM 刻录机,该刻录机将其刻录到微控制器的 ROM 中

现在我的问题与 DB 之类的指令有关,用于定义数据字节。

该指令如何不生成任何机器代码?要在内存中放置一个字节,必须有一些代码......它不会神奇地发生

这个指令必须生成一些东西,然后告诉 ROM 刻录机这个数据字节将被放置在这个地址。

请帮助我很困惑

【问题讨论】:

  • "这个指令如何不生成任何机器码?要在内存中放置一个字节,必须有一些代码......它不能神奇地发生" -- db 不生成机器码,除非您使用它指定的数据恰好是机器代码。像一条指令一样,db 数据被写入输出文件。
  • db 不会在运行时生成写入内存的指令。而是将字节放入“指令流”中。程序在启动时(例如通过操作系统)加载到内存中。然后也会加载 db 数据。您可以将编码指令与 db 一起使用,或者确保永远不会执行使用 db 生成的数据,例如通过将数据放在程序末尾或在 db 之前放置跳转指令

标签: assembly embedded directive machine-code 8051


【解决方案1】:

您是对的,DB 伪指令与其他指令没有根本区别。两者都只是将一些字节发送到当前位置的输出中。

DB 是一种将您的程序作为代码执行的字节输出的便捷方式。我们称之为“数据”。您可以通过将数据放在执行永远不会到达的地址来做到这一点(例如,因为您不会跳到那里)。

如果需要,您可以使用 DB 手动编码指令字节。

von Neumann architecture(存储程序机器,其中指令字节从数据加载/存储指令访问的同一内存中获取)中,代码和数据之间没有根本区别。不同之处在于您放置它的位置,这与纯Harvard 架构不同,后者的代码与数据位于不同的地址空间。

(在现实生活中,像 AVR 微控制器这样的哈佛机器通常会在启动时将一些程序内存 (ROM) 复制到 RAM,以初始化读写静态数据变量,甚至还有“加载程序内存”指令,这样您就可以拥有常量在 ROM 中查找表。因此您仍然可以在代码附近有一些 db 数据。)

提到使用 DB 手动编码指令的相关问答(对于 x86,但对于任何 ISA 的概念都是相同的):

【讨论】:

    【解决方案2】:

    所有程序都需要数据:

    • 像 1 这样的小常量,通常可以嵌入到使用它们的机器代码指令中
    • 大常量有时不适合机器码形式,因此进入数据并被代码引用
    • 程序通常使用字符串文字来表示文件和路径名、提示等。
    • 存储缓冲区作为空间来读取用户输入或从文件中
    • 全局变量,初始化为零或其他
    • 浮点常量进入内存,因为它们通常太大而无法在机器代码指令中作为立即数。

    如上所述,在某些情况下,数据可以嵌入机器代码指令中,即所谓的立即数,即立即寻址模式的简称。但在许多其他情况下,常量是作为机器代码引用的数据完成的,而不是嵌入在机器代码中——数据的地址嵌入在机器代码中(使用某种寻址模式)。

    简而言之,我们需要能够用汇编语言声明数据,就像我们需要能够用所有其他语言声明数据一样。程序文件还必须有一种方法来捕获该代码及其数据。

    如果您标记数据,那么您可以在代码和数据中使用(引用)该标签。

    大多数汇编器也会有单独的代码和数据部分的概念。 .data 指令(或任何适用于此汇编器的指令)将告诉汇编器将后续数据声明一起收集到汇编器和链接器输出的数据部分中。通常在汇编源代码中,我们可以在代码段和数据段之间来回切换,以便将与代码相关的数据保持在源中附近,但可能会根据程序文件的定义方式将其单独收集在构建的程序文件中。

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 2014-01-01
      • 2014-07-30
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多