GCC 内嵌汇编之基本行内汇编
Linux 操作系统内核代码绝大部分使用 C 语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码。 GCC 提供了内嵌汇编的功能,可以在 C 代码中直接内嵌汇编语言语句,大大方便了程序设计。
基本行内汇编
基本行内汇编很容易理解,一般是按照下面的格式:
asm(“statements”);
同时“asm”也可以由“__asm__”来代替,“asm”是“__asm__”的别名。在“asm”后面有时也会加上“__volatile__”表示编译器不要优化代码,后面的指令保留原样,“volatile”是它的别名,再后面括号里面的便是汇编指令。
例如:
__asm__ __volatile__("hlt");
如果有很多行汇编,则每一行后要加上“\n\t”
例如:
asm( "pushl %eax\n\t"
"movl $0,%eax\n\t"
"popl %eax");
实际上 gcc 在处理汇编时,是要把 asm(…)的内容“打印”到汇编文件中,所以格式控
制字符是必要的。
再例如:
asm("movl %eax,%ebx");
asm("xorl %ebx,%edx");
asm("movl $0,_booga);
在上面的例子中,由于我们在行内汇编中改变了 edx 和 ebx 的值,但是由于 gcc 的特殊
的处理方法,即先形成汇编文件,再交给 GAS 去汇编,所以 GAS 并不知道我们已经改变了edx 和 ebx 的值,如果程序的上下文需要 edx 或 ebx 作暂存,这样就会引起严重的后果。对于变量_booga 也存在一样的问题。为了解决这个问题,就要用到扩展的行内汇编语法。