6

アセンブリ言語は通常、クロスプラットフォームではないことを知っています。また、NASM のようなものを使用しても、ランタイムや割り込みなどの実装が異なるアーキテクチャやプラットフォームごとに異なるコードが必要になります。しかし、アセンブリ言語が好きであるという理由でアセンブリ言語でプログラミングしたいと考えた場合、クロスプラットフォームのクロスアーキテクチャ アセンブリ言語の実装はありますか?

編集:

従来の意味でのアセンブリではなく、アセンブリによく似た低レベルのプログラミング言語についてはどうでしょうか?

4

7 に答える 7

7

Donald Knuth のMMIXに興味があると思います。Knuth は、彼の The Art of Computer Programming という本の中で、このマシン/アセンブリ言語でプログラムを書いています。現在のところ、直接サポートしている CPU はありません。エミュレーターしかありません。ああ、誰かがそれを実行できる FPGA を作った。しかし、それはそれについてです。

于 2012-05-16T05:37:18.993 に答える
7

LLVM is a low-level language (whose purpose is a compiler backend) that looks a lot like AT&T assembly, if not 10x worse. Here's an example:

define i32 @add_sub(i32 %x, i32 %y, i32 %z) {
entry:
  %tmp = add i32 %x, %y
  %tmp2 = sub i32 %tmp, %z
  ret i32 %tmp2
}

This is roughly equilavent with the following hand-written x86 assembly:

; Body
mov eax, edi
add eax, esi
sub eax, edx
ret

LLVM llc 3.3 generates the following code (indented differently for readability):

    .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

The relevant code is this:

lea    EAX, DWORD PTR [RDI + RSI]
sub    EAX, EDX
ret

As you can see, LLVM has a very powerful optimizer. It is probably the closest that you're going to get.

于 2014-01-06T03:21:49.340 に答える
3

いいえ。C 言語は、クロスプラットフォームの低レベル言語に最も近い言語かもしれません。

于 2012-05-16T04:08:01.750 に答える
2

編集:

一般に、アセンブリ言語は、マシン コード、またはそのプロセッサ/システムの命令セットと 1 対 1 の関係にあります。システムは、定義上、異なる命令セットを持っているため、異なります。したがって、定義上、クロスシステム命令セットを持つことはできないため、クロスシステムアセンブリ言語はなく、アセンブリ言語と呼ばれることがあります。

仮想命令セットは、多くの命令セットに共通のプロパティ、マシン コードとの 1 対 1 または 1 対少数の関係を持ちますが、1 台のマシンに固有のものではないという点で、マシン レベルに近いものです。特に。たとえば、java バイトコード、python バイトコード、pascal p-code などです。これらはスタック ベースのマシンであり、ほとんどのプロセッサはスタックを持っているか、ロードとストアを使用してスタック ベースのマシンを簡単に実装できます。スタックベースのマシンは、いくつかのレジスタを使用します。これは、クロスシステムを取得し、さまざまな命令セットで実装するのが面倒にならないようにするもう 1 つの方法です。スタック ベースは、small-c バックエンドの中心でもあります。そのため、あるシステムから別のシステムに簡単に移植できました。歴史は繰り返す、

アセンブリが好きなら、Java または Python のバックエンドが興味深く、おそらく楽しいと思うかもしれません。機械語だけのアセンブリ言語を持っていない可能性が高いため、おそらく独自のアセンブラを作成する必要があります。個人的には、逆アセンブラから始めて言語の感触をつかみ、それから別の方法でバイトコードを書くか、アセンブラを作成します。同じように楽しいのは、特定のプロセッサ用の仮想マシンを実装することです。

アセンブリ言語が好きで、NASMという言葉を使用することについてのコメントは、x86を意味します。x86 はやや不愉快なアセンブリ言語です。他のアセンブリ言語を経験したことがなければ、もっと美しいアセンブリ言語がたくさんあります。1 つのサイズがすべてに適合するものを探すのではなく (実際には見つけられない)、それらを試してみてください。

于 2012-05-16T05:11:37.907 に答える
2

以下のリンクが関係ありそうです。 バイトコードでのプログラミングが、アセンブリでのプログラミングほど普及していないのはなぜですか?

特に池上の答え:

人工アセンブリ言語は、設計対象の言語のニーズを満たすように設計されており、ハードウェアではなく人工アセンブリ言語と非常に密接な関係にあります。高水準言語で簡単に達成できないことは、それらを使ってできることほど多くはありません.<

于 2012-05-16T04:14:50.953 に答える
1

あなたが言ったように、アセンブリはクロスプラットフォームではありません(「通常」の部分を削除できます)。私自身はあまり情報を持っていませんが、C--のページで説明されているように、「移植可能なアセンブリ言語」として興味があるようです。

于 2012-05-16T04:13:54.313 に答える