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 $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间接寻址
执行结果如下: