高级CGNU C/C++ 内联汇编——入门级

Posted 从善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级CGNU C/C++ 内联汇编——入门级相关的知识,希望对你有一定的参考价值。

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


博客内容主要围绕:
       5G协议讲解
       算力网络讲解(云计算,边缘计算,端计算)
       高级C语言讲解
       Rust语言讲解

文章目录

GNU C/C++ 内联汇编——入门级


语法格式

asm asm-qualifiers ( AssemblerInstructions )


语法详解

asm 关键字

       上面的 asm 关键字是GUN的扩展,如果想编写适用于标准语言的内嵌汇编,需要将 asm 替换为 __asm__ 。


asm-qualifiers(限定符的类型)

  • volatile:在 basic asm 中 volatile没有任何作用,所有的 basic asm 默认都有 volatile 修饰。
  • Inline :内联这段汇编 code。

AssemblerInstructions

       这是一个纯字符串,用于指定汇编程序代码。该字符串可以包含汇编器能识别的任何指令。GCC本身不解析汇编器指令,也不知道它们的意思,甚至不知道它们是否是有效的汇编器输入

       可以将多个汇编程序指令放在一个 AssemblerInstructions 中,使用分隔符将其分开。大多数情况都可以使用的分隔符是换行符,加上一个制表符(写成‘ n\\t ’)。一些汇编器允许分号(‘;’)作为分隔符,但是要注意有一些汇编器将分号解析为一段注释的开始。


注意事项

       使用扩展 asm 通常会产生更小、更安全、更高效的代码,在大多数情况下,它是比 basic asm 更好的解决方案。然而,在两种情况下只能使用 basic asm:

  • 扩展的 asm 语句必须在C函数中,所以要在文件范围内(“top-level”)编写内联汇编语言,也就是在C函数之外,你必须使用 basic asm。可以使用这种技术编写汇编程序指令,定义汇编语言宏,或者用汇编语言编写整个函数;
  • 有 naked 属性的函数,必须使用 basic asm。

asm语句不能跳转到其它 asm 语句。只有在扩展 asm 中才支持从 asm 跳到C label。

GCC不会解析 basic asm 的 AssemblerInstructions,这意味着没有办法将它们内部发生的事情告诉编译器。GCC对 asm 中的符号不具有可见性,可以将它们标记为未引用而丢弃。它也不知道汇编代码的副作用,例如修改内存或寄存器。与某些编译器不同,GCC假定通用寄存器不会发生任何更改。这个假设可能会在未来的版本中改变。

编译器将 basic asm 中的汇编指令逐字复制到汇编语言输出文件中,而不处理方言或扩展 asm 中可用的任何’ % '操作符。这产生了 basic asm字符串与扩展asm 模板之间的微小差异。例如,要引用寄存器,您可以在basic asm中使用’ %eax ‘,而在扩展asm 中使用’ %%eax '

对于非空汇编字符串的basic asm, GCC假设汇编程序不会修改任何通用寄存器,只可能会对全局可访问的变量进行读取或写入操作。



这里是从善若水的博客,感谢您的阅读⌨🖥🖱


文章链接

《GNU C/C++ 内联汇编编程指南全集》
《GNU C/C++ 内联汇编——入门级》
《GNU C/C++ 内联汇编——进阶——语法详解》
《GNU C/C++ 内联汇编——进阶——约束详解》
《GNU C/C++ 内联汇编——补充介绍》
《GNU C/C++ 内联汇编——实例参考》
《GNU C/C++ 内联汇编——Intel与ATT汇编语法对比》




以上是关于高级CGNU C/C++ 内联汇编——入门级的主要内容,如果未能解决你的问题,请参考以下文章

高级CGNU C/C++ 内联汇编——Intel与ATT汇编语法对比

高级CGNU C/C++ 内联汇编——实例参考

高级CGNU C/C++ 内联汇编——实例参考

高级CGNU C/C++ 内联汇编——补充介绍

高级CGNU C/C++ 内联汇编——进阶——约束详解

高级CGNU C/C++ 内联汇编——进阶——语法详解