搭建c和assembly混编的编译环境
在c代码里面嵌入汇编代码是一种面向底层编程时常用的技巧,具体的嵌入方式和所使用的compiler有关。这篇文章讲的是使用gcc
进行c和assembly的混编方式。
为了顺畅运行c和汇编的混编代码,保证平台的一致性,我们可以直接使用docker的容器。这样是最省事的方案,并且跨平台,各个操作系统上可以无差别运行。
首先要安装docker,从docker的网站上把安装包下载下来并进行安装:
> https://www.docker.com/
把docker安装好以后,下载并运行alpine
这个image:
$ docker run -it alpine
上面安装的这个alpine
是一个最小的linux容器,下载并运行容器后,在alpine linux里面安装所需的编译工具:
$ apk add cmake make gcc libtool musl-dev
apk
是alpine linux的包安装命令,耐心等待编译工具下载安装完成。
安装完成后,添加c和汇编的混编代码:
#include <stdio.h>
int main(void)
{
int foo = 10, bar = 15;
__asm__ __volatile__("addl %%ebx,%%eax"
:"=a"(foo)
:"a"(foo), "b"(bar)
);
printf("foo+bar=%d\n", foo);
return 0;
}
可以看到上面的c代码当中有嵌入的汇编代码,直接把变量赋值给寄存器并进行运算,然后运算结果通过printf
函数返回。使用cc
编译上面的代码,并运行编译好的程序,就可以看到程序的执行结果。以下是全过程:
以上就是c和asm混编代码实验环境的搭建过程。关于混编代码的具体学习,可以参考这篇文档:
https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
上面这篇文档写的比较系统,可以仔细看下。