欢迎关注微信公众号:[奔跑吧linux社区]
本文节选自《奔跑吧Linux内核》第二版卷1第1.5章
在Linux内核代码中常常会使用到GCC内联汇编,GCC内联汇编的格式如下。
__asm__ __volatile__(指令部: 输出部: 输入部: 损坏部)
GCC内联汇编在处理变量和寄存器的问题上提供了一个模板和一些约束条件。
-
在指令部(AssemblerTemplate)中数字前加上%,如%0、%1 等,表示需要使用寄存器的样板操作数。若指令部用到了几个不同的操作数,就说明有几个变量需要和寄存器结合。
-
指令部后面的输出部(OutputOperands)用于描述在指令部中可以修改的C语言变量以及约束条件。每个输出约束(constraint)通常以“=”或者“+”号开头,然后是一个字母(表示对操作数类型的说明),接着是关于变量结合的约束。输出部可以是空的。“=”号表示被修饰的操作数只具有可写属性,“+”号表示被修饰的操作数只具有可读可写属性。
-
输入部(InputOperands)用来描述在指令部只能读取的C语言变量以及约束条件。输入部描述的参数只有只读属性,不要试图修改输入部的参数内容,因为GCC编译器假定输入部的参数内容在内嵌汇编之前和之后都是一致的。在输入部中不能使用“=”或者“+”约束条件