希望通过学习弄清楚如下问题:
- 什么内联?什么是内联汇编?
- 内联有什么优缺点?可以用来解决什么问题?
- 什么是 base asm?
- 什么是 extended asm?
- 都有 base asm了,为什么要extended asm?是为了解决什么问题呢?
文章目录
下面是对GCC官方文档C语言内联汇编部分尝试的原创翻译,错漏及理解不足之处在所难免,欢迎留言交流,我会尽快反馈。
6.47.2 Extended Asm - Assembler Instructions with C Expression Operands
extended asm
使得我们可以在汇编程序中读写C变量,还可以从汇编代码中跳转到C标签。extended asm 语法使用冒号':'
分割 assembler template 之后的操作数:
asm asm-qualifiers ( AssemblerTemplate
: OutputOperands
[ : InputOperands
[ : Clobbers ] ])
asm asm-qualifiers ( AssemblerTemplate
:
: InputOperands
: Clobbers
: GotoLabels)
上面第二个格式中,asm-qualifiers 包含 goto
(第一种格式不包含)([ ]表示可选)。
asm 关键字是一个GNU扩展。当你编写的代码将会使用 -ansi 和不同的 -std 选项进行编译时,请使用 __asm__ 代替 asm(参看 Alternate Keywords)
curiousXia:-ansi -std配置指向不同的C语言版本,当程序需要兼容多个C版本时,建议编码时将asm替换成__asm__。
Qualifiers(限定符)
-
volatile
extended asm 语句的典型用途是操作输入值产生输出值。但是,有时候我们的asm语句可能产生副作用。如此,我们便需要使用 volatile 限定符来禁用某些优化(以避免这些副作用的产生)。参看 Volatile。