栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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


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

文章目录

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

语法格式语法详解

asm 关键字asm-qualifiers(限定符的类型)AssemblerInstructions 注意事项 文章链接

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 中,使用分隔符将其分开。大多数情况都可以使用的分隔符是换行符,加上一个制表符(写成‘ nt ’)。一些汇编器允许分号(‘;’)作为分隔符,但是要注意有一些汇编器将分号解析为一段注释的开始。


注意事项

       使用扩展 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汇编语法对比》




转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743438.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号