阿男的小窝

View the Project on GitHub

搭建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

上面这篇文档写的比较系统,可以仔细看下。