我知道汇编语言通常不是跨平台的。即使使用 NASM 之类的东西,您仍然需要针对不同的架构和平台使用不同的代码,这些架构和平台具有不同的运行时和中断等事物的实现。但是如果有人因为喜欢而想用汇编语言编程,那么有没有跨平台跨架构的汇编语言的实现呢?
编辑:
不是传统意义上的汇编,而是一种看起来很像汇编的低级编程语言呢?
我知道汇编语言通常不是跨平台的。即使使用 NASM 之类的东西,您仍然需要针对不同的架构和平台使用不同的代码,这些架构和平台具有不同的运行时和中断等事物的实现。但是如果有人因为喜欢而想用汇编语言编程,那么有没有跨平台跨架构的汇编语言的实现呢?
编辑:
不是传统意义上的汇编,而是一种看起来很像汇编的低级编程语言呢?
我认为 Donald Knuth 的MMIX是您可能感兴趣的。Knuth 在他的计算机编程艺术一书中用这种机器/汇编语言编写程序。迄今为止,没有 CPU 直接支持它。只有模拟器。哦,有人做了一个可以运行它的FPGA。但仅此而已。
LLVM 是一种低级语言(其目的是编译器后端),看起来很像 AT&T 汇编,如果不是差 10 倍的话。这是一个例子:
define i32 @add_sub(i32 %x, i32 %y, i32 %z) {
entry:
%tmp = add i32 %x, %y
%tmp2 = sub i32 %tmp, %z
ret i32 %tmp2
}
这与以下手写 x86 程序集大致等效:
; Body
mov eax, edi
add eax, esi
sub eax, edx
ret
LLVM llc 3.3 生成以下代码(为了便于阅读,缩进不同):
.file "add_sub.ll"
.text
.globl add_sub
.align 16, 0x90
.type add_sub,@function
add_sub: # @add_sub
.cfi_startproc
# BB#0: # %entry
lea EAX, DWORD PTR [RDI + RSI]
sub EAX, EDX
ret
.Ltmp0:
.size add_sub, .Ltmp0-add_sub
.cfi_endproc
.section ".note.GNU-stack","",@progbits
相关代码是这样的:
lea EAX, DWORD PTR [RDI + RSI]
sub EAX, EDX
ret
如您所见,LLVM 有一个非常强大的优化器。它可能是您将得到的最接近的。
不,C 语言可能是最接近跨平台低级语言的语言。
以下链接似乎是相关的。 为什么字节码编程不像汇编编程那样流行或流行?
特别是ikegami的回答:
人工汇编语言旨在满足其设计语言的需求,并且与它们有非常密切的关系,而不是硬件。在高级语言中,没有什么比用它们更容易实现的了。<
编辑:
汇编语言通常与机器代码或该处理器/系统的指令集具有一对一的关系。根据定义,系统是不同的,因为它们具有不同的指令集。所以,根据定义,你不能有一个跨系统的指令集,所以没有跨系统的汇编语言,它仍然被称为汇编语言。
如果你愿意的话,你会发现最接近的是虚拟指令集,它们接近于机器级别,因为它们具有许多指令集共有的属性,与机器代码是一对一或一对多的关系,但不是特定于一台机器尤其。例如 java 字节码、python 字节码、pascal p-code 等。这些都是基于堆栈的机器,大多数处理器都有堆栈或者可以使用加载和存储轻松实现基于堆栈的机器。基于堆栈的机器使用很少的寄存器,这是获得跨系统的另一种方式,并且不会让在各种指令集上实现起来太痛苦。基于堆栈的也是 small-c 后端的核心,这就是为什么它很容易从一个系统移植到另一个系统的原因。历史总是重演,
如果你喜欢汇编,你可能会发现 java 或 python 后端很有趣,也许很有趣。他们可能没有汇编语言,只有机器代码,因此您可能需要编写自己的汇编程序。就我个人而言,我会从反汇编程序开始以了解语言,然后另辟蹊径,编写字节码或创建汇编程序。为特定处理器实现虚拟机可能同样有趣。
您关于喜欢汇编语言然后使用 NASM 一词的评论意味着 x86。x86 是一种有点令人不快的汇编语言,如果您没有体验过其他人,那么那里有许多更漂亮的汇编语言。您应该尝试它们,而不是寻找一种适合所有人的尺寸(您实际上不会找到)。
正如您所说,组装不是跨平台的(您可以删除“典型”部分)。我自己没有太多信息,但看起来像C -可能会让您感兴趣,因为它们是他们页面中描述的“可移植汇编语言”。
您可能正在寻找 C。C 太简单了:任何构建另一种跨平台汇编语言的尝试最终都会变成另一种 C。
芯片极其多样化:不同数量的寄存器、不同的约定、不同的指令。一个筹码可能先用左脚进门,另一个先用右脚进门。看看他们的标准或手册,都像牛津高级词典一样厚。必须将所有这些抽象出来以编写跨平台代码。