C语言内嵌汇编代码
C代码中嵌入汇编语句,常见格式如下:
asm volatile( /* volatile : 可选,禁止编译器对汇编代码进行优化 */ "汇编语句模板" /* 汇编指令间使用'\n'分隔 */ :"=限制符"(输出参数) :"限制符"(输入参数) :损坏部分 )
其中:
1、asm表示后面的代码为内嵌汇编;
2、volatile表示编译器不要优化代码,后面的指令保留原样;
3、编写汇编指令模板,然后将C语言表达式与指令的操作数相关联,并告诉GCC对这些操作有哪些限制条件。
内嵌汇编格式为——汇编语句模板:输出部分:输入部分:损坏部分
注意:
1、内嵌汇编的四个部分(汇编语句模板,输出部分,输入部分,破坏描述部分)使用":"格开;汇编语句模板必不可少,其他三部分可选,如果某一部分为空,也需要用":"格开,相应部分内容为空
2、汇编语句模板由汇编语句序列组成,语句之间使用";"、"\n"或"\n\t"分开。指令中的操作数可以使用占位符引用C语言变量,操作数占位符最多10个,名称如下:%0,%1,...,%9。指令中使用占位符表示的操作数,总被视为long型(4个字节),但对其施加的操作根据指令可以是字或者字节,当把操作数当作字或者字节使用时,默认为低字或者低字节。对字节操作可以显式的指明是低字节还是次字节。方法是在%和序号之间插入一个字母,"b"代表低字节,"h"代表高字节,例如:%h1。
3、输出部分描述输出操作数,不同的操作数描述符之间用逗号格开,每个操作数描述符由限定字符串和C 语言变量组成。每个输出操作数的限定字符串必须包含"="表示他是一个输出操作数。
例:__asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x) )
描述符字符串表示对该变量的限制条件,这样GCC 就可以根据这些条件决定如何分配寄存器,如何产生必要的代码处理指令操作数与C表达式或C变量之间的联系。
4、输入部分描述输入操作数,不同的操作数描述符之间使用逗号格开,每个操作数描述符由限定字符串和C语言表达式或者C语言变量组成。
例如:__asm__("btsl %1,%0":"=m" (ADDR):"Ir" (nr));
第一个占位符%0与C 语言变量ADDR对应,第二个占位符%1与C语言变量nr对应。因此上面的汇编语句代码与下面的伪代码等价:btsl nr, ADDR,将(*addr)的第nr位设为1。