AsmWalker について

AsmWalker は、C言語とアセンブラの対応を1命令ずつ確認しながら学べるブラウザ学習ツールです。

できること

対応アーキテクチャ

アーキテクチャコンパイラ構文
ARM Cortex-MARM GCC 11.2.1 / 13.2.0 / 14.3.0 / 15.2.0ARM 構文
x86-64x86-64 GCC 14.2.0Intel 構文(-masm=intel
RISC-V RV32IMGCC 13.2.0 (-march=rv32im -mabi=ilp32)RISC-V ASM 構文

コンパイルの仕組み

コンパイルには Compiler Explorer(Godbolt) の公開 API を利用しています。 エディタに入力した C コードをブラウザから Godbolt API に送信し、返ってきたアセンブラテキストをツール内でパース・実行しています。

Godbolt API が返すのは純粋なアセンブラテキストです。アドレス情報は含まれません。

アドレス表示の仕組み

アセンブラパネルに表示される 0x401000 のようなアドレスは、Godbolt が付与したものではなく、 ツール内部で生成した仮想アドレスです。

割り当て方法

各アーキテクチャの基底アドレスから、命令インデックスに固定サイズを掛けて計算します:

仮想アドレス = 基底アドレス + 命令インデックス × 4
アーキテクチャ基底アドレス例(0番目の命令)
x86-640x401000命令0=0x401000, 命令1=0x401004 …
ARM Cortex-M0x08000000命令0=0x08000000, 命令1=0x08000004 …
RISC-V RV320x00010000命令0=0x00010000, 命令1=0x00010004 …

なぜ「固定4バイト」なのか

実際の命令長はアーキテクチャによって異なります:

アーキテクチャ実際の命令長このツールでの扱い
x86-641〜15 バイト(可変長)4 バイト固定
ARM Thumb22 または 4 バイト混在4 バイト固定
RISC-V RV32I4 バイト固定(C拡張除く)4 バイト固定
本来の命令バイト数を取得するには各命令をエンコード・逆アセンブルする必要があります。 このツールでは学習のしやすさを優先し、固定4バイト刻みの仮想アドレスを使用しています。 call 命令の「戻り先アドレス」と、その次の命令のアドレス表示が一致するよう、 ステップ実行エンジンで整合性を保つ処理を行っています。

ステップ実行の仕組み

Godbolt から受け取ったアセンブラテキストをツール独自のパーサーで解析し、 命令列と仮想マシン状態(レジスタ・スタック・フラグ)のスナップショット配列を生成します。 ステップ移動はこのスナップショット配列を前後に参照するだけで、再実行は行いません。

対応命令(x86-64): MOV / LEA / PUSH / POP / ADD / SUB / IMUL / IDIV / AND / OR / XOR / SHL / SHR / CMP / TEST / JMP / Jcc / CALL / RET / LEAVE ほか

対応命令(ARM): MOV / LDR / STR / ADD / SUB / MUL / CMP / B / BL / BX / PUSH / POP / LSL / LSR ほか

対応命令(RISC-V RV32IM): ADD / ADDI / SUB / LUI / AUIPC / AND / OR / XOR / SLL / SRL / SRA / SLT / LW / SW / BEQ / BNE / BLT / BGE / JAL / JALR / CALL / RET / MUL / DIV ほか

学習ガイド

アセンブラの仕組みをより深く理解するための解説ページを用意しています。

ガイド内容
マシン語とアセンブラ、そしてPCマシン語の正体・アセンブラとの1対1対応・プログラムカウンタの役割と分岐命令
アセンブラの読み方MOV / ADD / LDR / CMP / PUSH など代表的な命令の読み方と構文解説
スタックの仕組みPUSH/POP の正体・スタックポインタ・ローカル変数の確保と解放
関数呼び出しの仕組み引数の渡し方・戻り先アドレス・スタックフレーム・戻り値の返し方
条件分岐とフラグレジスタZ/N/C/V フラグ・CMP/TEST・if-else・ループの翻訳パターン
ポインタとアセンブラC のポインタがアセンブラでどう見えるか・間接参照・配列アクセス

技術構成

フロントエンドVue 3 + TypeScript + Tailwind CSS
エディタCodeMirror 6
ビルドツールVite
コンパイル APIGodbolt Compiler Explorer API
ホスティングVercel(Serverless Function で CORS プロキシ)