内联汇编
TODO
本节需要补充一些内联汇编翻译的实例。
C/C++ 程序中,可以通过内联汇编 [1] 的方式, 通过直接内嵌编写的汇编指令实现部分功能。 这些内联汇编指令会由编译器直接处理成机器码嵌入到生成的程序中,而无需额外的汇编和链接过程。 内联汇编还可以使用任何在同一作用域下的 C/C++ 变量及函数,可以与 C/C++ 源程序无缝融合。
内联汇编的主要用途包括 [2]:
- 在 C/C++ 程序中,用 汇编语言 编写特定函数
- 对 C/C++ 程序中 “速度攸关”(speed-critical) 的代码片段进行局部优化
- 对 C/C++ 编写的设备驱动程序提供 直接访问硬件 的能力
- 对 C/C++ 程序中的 “裸函数调用” [3] (Naked Function Call)提供编写前置、后置处理代码的能力
C/C++ 源程序中的内联汇编形式
C/C++ 源程序中的内联汇编,主要可分为两种形式:Intel 汇编风格和 AT&T 汇编风格。
Intel 汇编风格
以下代码示例呈现的是 C/C++ 源程序中 Intel 风格的内联汇编用法。
int result;
asm volatile (".intel_syntax noprefix\n"
"mov eax, 5\n"
"add eax, 6\n"
"mov result, eax");
AT&T 汇编风格
以下代码示例呈现的是 C/C++ 源程序中 AT&T 风格的内联汇编用法。
int result;
asm volatile ("movl $5, %%eax\n\t"
"addl $6, %%eax\n\t"
"movl %%eax, %0\n\t"
: "=r" (result)
:
: "%eax");
汇编指令的适配
由于 RISC-V 指令集与其它指令集存在许多差异, 支持其它架构的 C/C++ 源程序中的内联汇编指令需要修改为 RISC-V 对应的指令(可能需要多条) 才能正常编译运行。 关于汇编指令的翻译,请参见 汇编指令翻译。