RISC-V 架构适配知识库
  • 睿迁工具集
  • RVSmartPorting
  • 简体中文
  • English (US)
在 Gitee 上查看
  • 睿迁工具集
  • RVSmartPorting
  • 简体中文
  • English (US)
在 Gitee 上查看
  • 简介
    • 贡献规范
  • 入门
    • 内存一致性模型
    • 硬件开发板差异
    • 指令集模块
  • 通用调整
    • 检查项目对多架构的支持性
    • 文件结构调整
    • 目录结构调整
    • 测试用例调整
  • C/C++ 程序
    • 内联汇编
    • 宏定义与判断
    • 移位运算中的整形常数
    • Intrinsic 函数
    • 多版本函数
    • 系统调用
  • 汇编程序
  • 编译配置文件
    • rpmbuild
    • Makefile
    • CMake
    • Autoconf
    • QMake
    • 其它
  • 其它编程语言
    • Rust
    • Go
    • Python
    • 其它语言
  • 辅助工具集
    • 目标代码定位工具
    • 汇编指令翻译工具

内联汇编

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 对应的指令(可能需要多条) 才能正常编译运行。 关于汇编指令的翻译,请参见 汇编指令翻译。

参考文献

  • [1] GCC: How to Use Inline Assembly Language in C Code
  • [2] Advantages of Inline Assembly
  • [3] Naked Function Calls
编辑本页面
最后更新时间:
贡献者: LightningRS
Next
宏定义与判断

本知识库采用 木兰开放作品许可协议 署名-相同方式共享 第1版 进行许可

版权所有 © 2025 RVSmartPorting. | 京ICP备20005262号 | beian京公网安备11010802043677号