c文件中经常使用asm完成嵌入式汇编,例如
#include <stdio.h>void a()
{int result = 0;int input = 1;asm volatile ("movl %1, %0\n": "=r"(result): "r"(input));printf("result = %d\n", result);printf("input = %d\n", input);
}int main(void)
{a();return 0;
}
这通常是在已存在的函数中通过asm将汇编指令嵌入到函数中,如何使用asm创建一个函数,这是有意义的,比方说上面的例子,对a函数进行反汇编,发现其汇编代码还可以进一步优化,如何创建一个完成由汇编代码构成的函数以便更好的控制,这一般是通过.S文件来实现的,下面给出一种在C文件中创建汇编函数的方法
#include <stdio.h>asm(
".global a\n"
"a:\n""mov i, %eax\n" "mov $2, %eax\n""mov %eax, i\n""retq\n"
);int i = 1;void c()
{i=2;
}int main(void)
{printf("before a i: %d\n", i);a();printf("after a i: %d\n", i);return 0;
}
下面是c函数的反汇编代码,其中movl $0x2,0x2eec(%rip) # 0x404030 <i>这一条指令就可以完成对全局i赋值的原因是通过rip间接寻址
执行结果如下: