メインコンテンツまでスキップ

インラインアセンブリ

紹介

このドキュメントでは、Wave言語のインラインアセンブリについて説明します。 インラインアセンブリはWaveが提供する機能の一つで、高級言語の利便性を保ちながらも低レベルハードウェア制御に直接アクセスできる極端なレベルの文法です。

つまり、一般的なWaveコードでは扱いにくいレジスタ操作、メモリ直接アクセス、特殊命令の実行などを可能にし、性能最適化やハードウェア依存の作業が必要なときに利用されます。


基本文法

asm {
"アセンブリ命令" // 実際のアセンブリコード (1行に1命令)
...
in("レジスタ") 値 // 入力レジスタのマッピング
out("レジスタ") 変数 // 出力レジスタのマッピング
}

文法要素

  1. アセンブリ命令

    • "..." 文字列形式で記述し、実際のCPUで実行される低レベルアセンブリ命令です。
    • 複数行の記述が可能であり、1行に1つの命令を書きます。
    • 例:
      "mov rax, 1"
      "syscall"
  2. in("レジスタ") 値

    • 変数(または式)の値を指定されたレジスタにロードします。
    • 例:
      in("rdi") s
      -> 変数 s の値をx86-64規約の最初のsyscall引数レジスタである rdi に入れる。
  3. out("レジスタ") 変数

    • 指定されたレジスタの値をWave変数に取得します。
    • 例:
      out("rax") ret
      -> syscall の戻り値が保存された rax レジスタの値を変数 ret に保存する。

簡単な例

fun main() {
var msg_ptr: ptr<i8> = "Hello from syscall!\n";
var ret_val: i64;

asm {
"mov rax, 1"
"syscall"
in("rdi") 1
in("rsi") msg_ptr
in("rdx") 20
out("rax") ret_val
}
}

段落1

  • 文1
  • これはパフォーマンスと利便性を大幅に向上させます。