高级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++ 内联汇编——入门级的主要内容,如果未能解决你的问题,请参考以下文章