【问题标题】:x86 ASM: DD Being Used as an "Instruction"?x86 ASM:DD 被用作“指令”?
【发布时间】:2018-03-12 19:26:54
【问题描述】:

在以下 x86 汇编代码中:

dd 0x1BADB002
dd 0x00
dd - (0x1BADB002+0x00)

这些值似乎没有分配给任何变量。那么这段sn-p代码有什么作用呢?我听说过它被存储在内存中,但具体在哪里?

【问题讨论】:

  • 这是一个多启动头文件。如果您正在编写要通过 GRUB 之类的东西启动的代码,则需要在它出现的 ELF 文件的前 8k 中找到此签名,以便 GRUB(或任何兼容多引导的加载程序)将代码识别为兼容多引导。没有它,多重引导加载程序将出错。您可以在 GRUB 文档中找到关于此的文档:gnu.org/software/grub/manual/multiboot/…
  • DD 没有被用作指令。它是一个 NASM 指令,允许您定义 32 位值。构成多重引导标头的这些数据通常放置在链接描述文件放置在生成的 ELF 可执行文件中的所有其他内容之前的数据部分中(这样做是为了在文件的前 8k 中获取标头,以便多重引导加载程序/GRUB 可以找到它)

标签: x86 kernel nasm osdev multiboot


【解决方案1】:

dd 是一个“伪指令”,它将 4 字节常量组装到输出中,就像 add eax,eax0x01 0xc0 组装到输出中一样。

NASM 手册section 3.2 Pseudo-Instructions 描述了db/dw/dd 等等。

在这种情况下,正如@MichaelPetch 指出的那样,这些特定常量用于将多重引导标头组装到输出文件中。 https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format

How does this assembly bootloader code work?


相关:

How are dw and dd different from db directives for strings?

What is the use of .byte assembler directive in gnu assembly?

x86 assembly - Which variable size to use (db, dw, dd)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2012-01-15
    • 2014-12-23
    相关资源
    最近更新 更多