59

我对 asm 指令 db 的实际作用有点困惑。我读过它定义了一个字节,但这实际上是什么意思?它是将值移动到内存中的某个位置,还是在组装代码之前预定义一个值?

4

2 回答 2

76

它实际上将该字节放在可执行文件中。

于 2013-06-30T05:59:05.407 回答
3

来自 ARM 手册:

〚label:〛 DB表达式〚,表达式...〛</p>

DB 语句用一个或多个字节值初始化内存。label 是分配了当前内存地址的符号。表达式是存储在内存中的字节值。每个表达式可以是一个符号、一个字符串或一个表达式。

因此,此语句执行以下操作:

  • 为“label”变量设置当前内存地址值
  • 将表达式中的“字节”值设置为当前和下一个内存地址(“表达式”可以是一个字节或多个字节 - 一个长字符串)

操作后,如果我们将新的“当前”内存地址与操作前的内存地址(按标签保存)进行比较,我们可以计算“表达式”列表的长度(因为每个字符都是一个字节,并且与内存地址加1)。

让汇编器计算此处(在某些汇编器中)和标签之间的距离$可以围绕任何指令或伪指令工作,而不仅仅是db,并且在某些汇编语言中看起来像这样。确切的指令语法因汇编程序而异(ARMASM、NASM、MASM、FASM 等都用于db将文字字节发送到输出中,但在细节equ或其他方面有所不同。)

msg: db "Hello, World!", 0x10, 0
msglen equ $ - msg                @ includes the 0 terminator
于 2021-01-02T10:53:53.007 回答