汇编指令'db'实际上做了什么?

时间:2013-06-30 05:34:52

标签: assembly

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

2 个答案:

答案 0 :(得分:51)

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

答案 1 :(得分:2)

来自 ARM 手册:

<块引用>

〚label:〛 DB表达式〚,表达式...〛

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

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

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

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

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

msg: db "Hello, World!", 0x10, 0
msglen equ $ - msg                @ includes the 0 terminator