0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

wasmで、アセンブラ その6

0
Posted at

概要

wasmが、スタックマシンらしいので、やってみた。
plunkerでwasmのwatのsandboxやってみた。
WebAssembly (Wasm) の主要なニーモニック(命令)の機能別一覧です。

算術・論理演算命令 (Arithmetic & Logic)

数値を計算・比較する、最も基本的な命令群です。

整数演算 (i32, i64)

• add / sub / mul : 加算 / 減算 / 乗算
• div_s / div_u : 符号付き除算 / 符号なし除算
• rem_s / rem_u : 符号付き剰余(余り) / 符号なし剰余
• and / or / xor : ビット論理積 / 論理和 / 排他的論理和
• shl / shr_s / shr_u : 左シフト / 符号付き右シフト / 符号なし右シフト
• clz / ctz / popcnt : 最上位からの0の数 / 最下位からの0の数 / 1であるビットの数

浮動小数点演算 (f32, f64)

• add / sub / mul / div : 加算 / 減算 / 乗算 / 除算
• abs / neg / copysign : 絶対値 / 符号反転 / 符号コピー
• ceil / floor / trunc / nearest : 切り上げ / 切り捨て / ゼロ方向丸め / 最も近い整数への丸め
• sqrt : 平方根(ルート)
• min / max : 最小値 / 最大値

比較命令 (Comparison)

条件分岐の判定に使われます。結果はすべて i32 の 1 (真) か 0 (偽) で返されます。
• eq / ne : 等しい (=) / 等しくない (≠)
• lt_s / lt_u / lt : 未満 (<) (符号あり/なし/浮動小数点)
• le_s / le_u / le : 以下 (≤) (符号あり/なし/浮動小数点)
• gt_s / gt_u / gt : 超過 (>) (符号あり/なし/浮動小数点)
• ge_s / ge_u / ge : 以上 (≥) (符号あり/なし/浮動小数点)

変数・スタック操作命令 (Variable Access)

ローカル変数やグローバル変数、スタック上の値を扱います。型指定(i32. など)は付きません。
• local.get : ローカル変数の値をスタックに積む
• local.set : スタックの最上段の値をポップしてローカル変数に代入する
• local.tee : スタックの値を複製しつつ、ローカル変数にも代入する
• global.get / global.set : グローバル変数の取得 / 代入
• drop : スタックの最上段の値を1つ破棄する
• select : 条件(スタックの3番目の値)に応じて、1番目か2番目の値を選択する(三項演算子)

メモリアクセス命令 (Memory)

リニアメモリ(RAM)への読み書きを行います。
• i32.load / i64.load : メモリから値を読み出してスタックに積む
• f32.load / f64.load : (浮動小数点用)
• i32.store / i64.store : スタックの値をメモリに書き込む
• f32.store / f64.store : (浮動小数点用)
• i32.load8_s / i32.load8_u : 8ビットだけ読み込み、32ビットに拡張(符号あり/なし)
• i32.load16_s / i32.load16_u : 16ビットだけ読み込み、32ビットに拡張
• memory.size : 現在のメモリサイズ(ページ単位)を取得する
• memory.grow : メモリサイズを動的に拡張する

制御フロー命令 (Control Flow)

プログラムの流れを制御します。
• block : ブロックの定義(末尾へのジャンプ先となる)
• loop : ループの定義(先頭へのジャンプ先となる)
• if ... else ... end : 条件分岐
• br : 指定した深さのブロックへジャンプ(Break)
• br_if : 条件が真(非ゼロ)の場合にジャンプ
• br_table : ジャンプ先テーブル(switch文のような多分岐)
• return : 関数から抜ける(呼び出し元に戻る)
• call : 関数を呼び出す
• call_indirect : 関数ポインタ(テーブル)経由で関数を動的に呼び出す
• nop : 何もしない(No Operation)
• unreachable : 致命的なエラーを発生させてプログラムを強制終了する

型変換命令 (Conversion)

異なるデータ型の間で値を変換します。[変換後の型].[操作]_[変換前の型] という命名規則になります。
• i32.wrap_i64 : 64ビット整数を32ビット整数に丸める(上位ビット破棄)
• i64.extend_i32_s / _u : 32ビット整数を64ビット整数に拡張(符号あり/なし)
• i32.trunc_f32_s / _u : 32ビット浮動小数点を、ゼロ方向丸めで32ビット整数に変換
• f32.convert_i32_s / _u : 32ビット整数を32ビット浮動小数点に変換
• f64.promote_f32 : 32ビット浮動小数点を64ビット(倍精度)に精度向上
• f32.demote_f64 : 64ビット浮動小数点を32ビット(単精度)に精度低下
• i32.reinterpret_f32 : ビットパターンをそのままに、浮動小数点を整数として解釈(キャスト)

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?