mcpField
A
abi-and-calling-conventions

abi-and-calling-conventions

github.com/mohitmishra786開発269355 回インストール18 週間前に更新
リポジトリ

abi-and-calling-conventions について

System V AMD64、ARM AAPCS、RISC-V の ABI を扱う、アセンブリやシステム開発者向けのリファレンススキルです。引数・戻り値のレジスター、スタック配置、可変長引数、コンパイラー出力の確認方法をまとめています。

主な機能

  1. 01レジスターと引数渡しの規則
  2. 02スタックアラインメントとフレーム構成
  3. 03可変長引数の呼び出し規約
  4. 04コンパイラー出力の確認

活用シーン

  1. 01アセンブリのサンクやインラインアセンブリの作成
  2. 02C とアセンブリ混在時のスタック問題の調査
  3. 03Rust、C、Zig の FFI 動作の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill abi-and-calling-conventions

インストール後、Claude Code で/abi-and-calling-conventionsを入力して読み込まれたか確認します。

詳細

ABI と呼び出し規約

目的

System V AMD64、ARM AAPCS、RISC-V におけるアプリケーションバイナリーインターフェース(ABI)の規則(レジスターの役割、スタックのアラインメント、引数の受け渡し、戻り値、可変長引数の規約)を説明します。アセンブリー、FFI、デバッグに欠かせない知識です。

使用する場面

  • アセンブリートランクやインラインアセンブリーの clobber を記述する場合
  • C とアセンブリーが混在するコードでスタック破損をデバッグする場合
  • Rust/C/Zig 間で FFI を行う場合(skills/rust/rust-ffi、skills/zig/zig-cinterop)
  • skills/debuggers/gdb の逆アセンブル結果を読む場合

ワークフロー

1. System V AMD64(Linux/macOS)
項目規則
整数引数rdi, rsi, rdx, rcx, r8, r9
XMM 引数xmm0~xmm7(浮動小数点数)
整数/ポインターの戻り値rax(128 ビットの場合は rdx も使用)
スタックアラインメントcall の前に 16 バイト
レッドゾーンrsp の下位 128 バイト(Linux)
呼び出し先保存レジスターrbx, rbp, r12~r15
/* void foo(int a, int b, int c, int d, int e, int f, int g); */
/* a–f in regs, g on stack */

Windows x64 では規則が異なります。skills/compilers/msvc-cl を参照してください。

2. ARM AAPCS(AArch32/AArch64)

AArch64:

項目規則
整数引数x0~x7
浮動小数点数の引数v0~v7
戻り値x0/x1 または v0
スタックアラインメント16 バイト
呼び出し先保存レジスターx19~x28、fp(x29)、lr(x30)

Thumb インターワーキングでは、Thumb コード用に関数ポインターの最下位ビットを設定します。

skills/low-level-programming/assembly-arm を参照してください。

3. RISC-V psABI(RV64)
項目規則
整数引数a0~a7
呼び出し先保存レジスターs0~s11、sp
戻り値a0、a1
スタックアラインメント16 バイト

skills/low-level-programming/assembly-riscv を参照してください。

4. スタックフレームのレイアウト(概念図)
high addresses
├── return address
├── saved frame pointer
├── local variables
├── spill slots / alignment padding
└── outgoing args (if any)
low addresses (rsp)
5. 可変長引数関数

System V では、al に使用したベクター引数の数が格納されます。va_start 用の register_save_area はスタック上にあります。移植可能な FFI では、va_arg を直接使うより、型付きラッパーを使用してください。

6. コンパイラーの出力で検証する
gcc -O2 -S -o - foo.c   # study .cfi_* and mov args
objdump -d -M intel ./a.out
7. エージェントでの使用
/abi-and-calling-conventions Which registers hold args 5–8 in AArch64 for my C function?

よくある問題

症状原因修正方法
call でクラッシュするスタックのアラインメントが不正rsp を 16 の倍数にアラインする
浮動小数点数の引数が正しく渡らないXMM と GPR の不一致プロトタイプに合わせる
呼び出し先保存レジスターが破損するアセンブリーの clobber 指定漏れclobber に列挙するか、保存する
FFI の値がおかしいWindows と SysV の混在ツールチェーンの ABI を合わせる
可変長引数で未定義動作が起きるva_arg に誤った型を指定している昇格後の型にキャストする

関連スキル

  • skills/low-level-programming/assembly-x86 — x86-64 アセンブリー
  • skills/low-level-programming/assembly-arm — AAPCS の例
  • skills/low-level-programming/assembly-riscv — RISC-V アセンブリー
  • skills/rust/rust-ffi — extern "C" の保証事項
  • skills/binaries/elf-inspection — シンボルと再配置の表示

コメント