最近可能要用到GCC内嵌汇编,因此将相关内容做一点总结,分享给大家。
还是把参考的网址分享给大家
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s2
http://www.cnblogs.com/whutzhou/articles/2638498.html 这篇文章就是对上一篇文章的翻译
https://gcc.gnu.org/onlinedocs/gcc.pdf
在GCC中共包括两种方法嵌入汇编,分别是:基本内联汇编语句(basic inline asm statement)和扩展内联汇编语句(extended inline asm statement)。基本内联汇编不包括操作数(operand),而扩展内联汇编语句一个或多个操作数(operands)。
先来看看基本内联汇编语句的形式如下:
asm("assembly code");
asm("movl %ecx %eax");
__asm__ ("movl %eax, %ebx\n\t" "movl $56, %esi\n\t" "movl %ecx, $label(%edx,%ebx,$4)\n\t" "movb %ah, (%ebx)");
__asm__ ("movl %eax, %ebx;" "movl $56, %esi;" "movl %ecx, $label(%edx,%ebx,$4);" "movb %ah, (%ebx);");
正是由于上述问题的存在,才引出了我们接下来的主题:扩展内联汇编语句
首先来看扩展汇编语句的形式:
<pre name="code" class="cpp"><pre name="code" class="cpp"> asm ( assembler template : output operands /* optional */ : input operands /* optional */ : list of clobbered registers /* optional */ );
asm ( assembler template : : : );
在此还要向大家提醒的一点是输入、输出操作数不需要加入被破坏寄存器列表。