1. 环境准备与基础知识
在Linux环境下进行x86汇编与C语言的混合编程,首先需要明确几个关键点。我使用的是一台搭载Ubuntu 20.04的x86-64机器,GCC版本为9.4.0。这种环境配置在现代开发中相当常见,但其中的细节往往容易被忽视。
AT&T汇编风格与Intel风格的区别不仅仅是语法顺序的差异。在实际开发中,我发现AT&T风格有几点特别需要注意:
- 操作数大小后缀:在AT&T语法中,指令需要显式指定操作数大小,比如movl表示32位操作,movq表示64位
- 内存引用格式:AT&T使用(%reg)表示寄存器间接寻址,而Intel使用[reg]
- 符号扩展指令:AT&T使用movsbl/movzbl等,而Intel使用movsx/movzx
提示:如果你习惯Intel语法但需要使用GCC,可以在编译时添加
-masm=intel选项,但这可能会带来其他兼容性问题,特别是在内联汇编时。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 64位系统调用约定详解
System V AMD64 ABI调用约定是Linux x86-64平台的标准,理解它对混合编程至关重要。这个约定规定了:
- 前6个整型参数通过寄存器传递:RDI, RSI, RDX, RCX, R8, R9
- 浮点参数通过XMM0-XMM7传递
- 额外的参数通过栈传递
- 返回值保存在RAX中
寄存器使用规则如下表:
| 寄存器 | 用途 | 是否调用者保存 |
|---|---|---|
| RAX | 返回值/系统调用号 | 否 |
| RDI | 第一个参数 | 否 |
| RSI | 第二个参数 | 否 |
| RDX | 第三个参数 | 否 |
| RCX | 第四个参数 | 否 |
| R8 | 第五个参数 | 否 |
| R9 | 第六个参数 |
