在没有魔术助手的情况下,还有其他方法可以在 Assembly 中编写这些 "data" 部分吗?

Are there any other ways to write these "data" sections in Assembly without the magic helpers?

在 NASM 中,您会看到 this:

msg: db "Hello world!", 0 ; we need to explicitely put the zero byte here

times 510-($-$$) db 0           ; fill the output file with zeroes until 510 bytes are full
dw 0xaa55                       ; magic number that tells the BIOS this is bootable

根据我的理解,这些是特定于编译器的 "helpers"(NASM 是这里的编译器)。

看起来 as compiler/program 有自己的帮手,例如 .asciz 类似的事情:

msg: .asciz "Hello world!"

.fill 510-(.-init), 1, 0 # add zeroes to make it 510 bytes long
.word 0xaa55 # magic bytes that tell BIOS that this is bootable

是否有任何 "lower-level" 方式以与编译器无关的方式编写此内容?也许以某种方式用说明而不是这些助手来编写它们?基本上,这些抽象的是什么?如何使用较低级别的抽象来编写它们?

差不多,我想用更底层的方式来写它,而不是绑定到特定的编译器,并且也知道更深层次的实际情况。

与此相同:

[bits 16]    ; use 16 bits
[org 0x7c00] ; sets the start address

我在哪里可以找到有关如何在较低级别编写此内容的文档或其他内容?

似乎没有办法以"low-level"的方式处理它,这就是为什么我们有预处理器和宏。 assembler 本身提供的 times 之类的指令,它只是辅助函数,我想不是每个汇编器都有这样的函数。

我使用了几个汇编程序,几乎所有汇编程序在提供附加功能方面都有所不同。大多数情况下,可以在 "high-level" 上处理它,因为您正在为特定的汇编器编写代码。

但是如果有任何原因我想建议使用 m4 预处理器或任何其他适合你的。在这种情况下,您可以以一种不可知的方式为汇编程序编写宏,但这仍然是额外的工作,而且您很可能不需要它。

我不确定您认为编译器是什么,但您给出的示例是两个不同汇编器的各种指令(您称之为帮助程序)。汇编程序与编译器不同,因为它们从源代码中生成 machine code,或多或少直接表示机器代码应该是什么。编译器从一种不试图表示编译器生成的机器代码的语言生成机器代码。此外,传统上许多编译器的工作方式是创建汇编代码并将其汇编以生成机器代码,而不是直接生成机器代码。

没有汇编语言的公共子集在所有汇编器之间共享,因此没有汇编器不可知的语言,无论是低级语言还是其他语言,都可以让您做任何您想做的事。

但是,大多数汇编语言都可以被认为是一种语言,在组装时会产生由任意字节序列组成的输出,专门用于生成机器代码。这意味着在某种程度上,您可以使用一种最低级别的几乎完全不可知的非语言,它是一个二进制文件,它只是一个任意字节序列。不幸的是,作为人类,您无法在不经过其他表示形式的情况下直接将二进制文件物理输入计算机。最直接但仍然实用的方法是使用 hex editor。一种更直接但不太实用的方法是在 Unix 上使用 cat > file.bin 或在 Windows.

上使用 copy con file.bin