Assembly DB是如何工作的?不是';汇编程序输出代码的t字节?

Assembly DB是如何工作的?不是';汇编程序输出代码的t字节?,assembly,embedded,directive,machine-code,8051,Assembly,Embedded,Directive,Machine Code,8051,到目前为止,我所研究的是,我们用汇编语言编写一个程序……把这个程序传递给汇编程序,汇编程序生成机器代码……把机器代码传递给ROM烧录器,ROM烧录器将其烧录到微控制器的ROM中 现在,我的问题与用于定义数据字节的指令相关,如DB 该指令如何不生成任何机器代码?要在内存中放入一个字节,必须有一些代码……这不能神奇地发生 该指令必须生成一些东西,这些东西稍后会告诉ROM刻录机,这个数据字节将被放置在这个地址 请帮助我,我很困惑你是对的,DB伪指令与其他指令没有根本区别。两者都只是在当前位置向输出中发

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

现在,我的问题与用于定义数据字节的指令相关,如
DB


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

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


请帮助我,我很困惑

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

DB是一种方便的方式,可以输出程序不作为代码执行的字节。我们称之为“数据”。您可以将数据放在执行永远无法到达的地址(例如,因为您没有跳转或跳转到该地址)

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

在(指令字节从数据加载/存储指令访问的同一内存中提取的存储程序机器)中,代码和数据之间没有根本区别。不同之处就在于你把它放在什么地方,不同于纯体系结构,在纯体系结构中,代码放在不同于数据的地址空间中

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

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


所有程序都需要数据:

  • 像1这样的小常量通常可以嵌入到使用它们的机器代码指令中
  • 大常量有时不适合机器代码形式,因此进入数据并由代码引用
  • 程序通常使用字符串文字作为文件名和路径名、提示等
  • 存储缓冲区作为读取用户输入或文件的空间
  • 全局变量,初始化为零或其他
  • 浮点常量进入内存,因为它们通常非常大,以适合作为机器代码指令中的立即数
如上所述,在某些情况下,数据可以嵌入到机器代码指令中,即所谓的立即寻址(immediates),即立即寻址模式的简称。但在许多其他情况下,常量作为机器代码引用的数据而不是嵌入机器代码中的数据来完成-数据的地址嵌入机器代码中(使用某种寻址模式)

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

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


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

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