没有魔术助手,还有其他方法可以在Assembly中编写这些“数据”部分吗?

在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

据我了解,这些是特定于编译器的“帮助程序”(NASM是此处的编译器)。

看起来as编译器/程序有自己的助手,例如.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

是否有某种“低级”方式以与编译器无关的方式编写代码?也许以某种方式而不是使用这些帮助程序来编写指令吗?基本上,这些抽象是什么?如何使用较低层的抽象来编写它们?

非常,我想以一种较低级别的方式编写它,而不用绑定到特定的编译器,并且还要知道更深层次的实际情况。

与类似的东西一样

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

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

wwjj789456 回答:没有魔术助手,还有其他方法可以在Assembly中编写这些“数据”部分吗?

我不确定您认为编译器是什么,但是您给出的示例涉及两个不同汇编器的各种指令(如您所称的helper)。汇编程序与编译器的区别在于,汇编程序从源头产生machine code,该源头或多或少直接代表了机器代码应该是什么。编译器使用不尝试表示编译器生成的机器代码的语言来生成机器代码。而且,传统上,许多编译器通过创建汇编代码并将其汇编以生成机器代码,而不是直接生成机器代码。

所有汇编程序之间没有共享的汇编语言子集,因此不存在与汇编程序无关的语言(低级或其他语言),您可以按照自己的意愿做任何事情。

但是,大多数汇编语言都可以被认为是一种在汇编时产生由一系列任意字节组成的输出的语言,该输出专门用于生成机器代码。这意味着,在某种程度上,您可以使用最低级别的几乎完全不可知的非语言,并且这是一个二进制文件,它只是一个任意字节的序列。不幸的是,作为人类,您根本无法通过二进制方式直接将二进制文件输入计算机。最直接但仍可行的方法是使用hex editor。一种更直接但实用性更低的方法是在Unix上使用cat > file.bin或在Windows上使用copy con file.bin

,

似乎没有办法以“低级”方式处理它,这就是为什么我们有预处理器和宏。特定的times本身提供的类似assembler之类的指令只是辅助函数,我想并不是每个汇编程序都具有这样的函数。

我使用了几个汇编器,几乎所有的汇编器在提供附加功能方面都有差异。通常,可以在“高级”上处理它,因为您正在为特定的汇编器编写代码。

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

本文链接:https://www.f2er.com/2988352.html

大家都在问