abi-and-calling-conventions について
System V AMD64、ARM AAPCS、RISC-V の ABI を扱う、アセンブリやシステム開発者向けのリファレンススキルです。引数・戻り値のレジスター、スタック配置、可変長引数、コンパイラー出力の確認方法をまとめています。
主な機能
- 01レジスターと引数渡しの規則
- 02スタックアラインメントとフレーム構成
- 03可変長引数の呼び出し規約
- 04コンパイラー出力の確認
活用シーン
- 01アセンブリのサンクやインラインアセンブリの作成
- 02C とアセンブリ混在時のスタック問題の調査
- 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— シンボルと再配置の表示
コメント
Markdown 対応