SuperAPI AI 工具集

abi-and-calling-conventions

通用与其它

查看项目

更新于 10-16 06:49

技能介绍

用途:记录应用二进制接口(ABI)规则,包括寄存器角色、栈对齐、参数传递、返回值与可变参数约定,覆盖 System V AMD64、ARM AAPCS 与 RISC-V,适用于汇编、FFI 和调试。

适用时机:编写汇编 thunk 或内联汇编 clobber;调试 C/汇编混合代码中的栈损坏;Rust/C/Zig 之间的 FFI;阅读反汇编。

主要规则:System V AMD64 整数参数用 rdi、rsi、rdx、rcx、r8、r9,浮点参数用 xmm0–xmm7,整数/指针返回值用 rax(128 位加 rdx),调用前栈 16 字节对齐,Linux 下 rsp 下方有 128 字节 red zone,被调用者保存 rbx、rbp、r12–r15;Windows x64 不同。ARM AAPCS:AArch64 整数参数 x0–x7,浮点 v0–v7,返回 x0/x1 或 v0,栈 16 字节对齐,被调用者保存 x19–x28、fp(x29)、lr(x30);Thumb 互操作时函数指针最低位需置位。RISC-V psABI(RV64):整数参数 a0–a7,被调用者保存 s0–s11、sp,返回 a0、a1,栈 16 字节对齐。

栈帧概念:高地址到低地址依次为返回地址、保存的帧指针、局部变量、溢出槽/对齐填充、传出参数。

可变参数:System V 中 al 保存使用的向量参数数量,va_start 依赖栈上的 register_save_area;可移植 FFI 中优先使用带类型的包装而非裸 va_arg。

验证方式:可用 gcc -O2 -S -o - foo.c 查看 .cfi_* 与参数移动,用 objdump -d -M intel ./a.out 反汇编。

常见问题:调用崩溃多为栈未按 16 字节对齐;浮点参数错误常因 XMM 与通用寄存器不匹配;被调用者保存寄存器损坏多因汇编 clobber 缺失;FFI 乱码常因 Windows 与 SysV ABI 混用;可变参数未定义行为多因 va_arg 类型错误。

限制:资料未提供具体安装命令、收费方式或平台支持范围,暂未提供。