c调用汇编

    在此记录一下c调用汇编,汇编使用的是AT&T语法。例子很简单,就是在给一个整数用汇编转换成二进制。

c部分很简单,文件名随便,如main.c:

#include <stdio.h>
#include <stdlib.h>

void decToBin(long dec,char *b); //声明外部汇编函数
int main()
{
          long dec=254;
          char *bin=(char*)malloc(sizeof(char)*64);
          decToBin(dec,bin);
          printf("%s\n",bin);   
          free(bin);   
          return 0;   
}    

 本人使用的是mac 64位系统,所以64bit寄存器为r开头,如:rax、rbx等。

c调用的代码如下,保存的文件名随便,如decBin.S or decBin.s.

 1 .global _decToBin #下划线是必须的
 2 
 3 _decToBin:
 4     pushq     %rbp
 5     movq    %rsp,%rbp
 6 
 7     movq     %rdi,-8(%rbp) #第一个参数
 8     movq     %rsi,-16(%rbp) #第二个参数
 9 
10     movq    -8(%rbp),%rax
11     movq    -16(%rbp),%rbx
12     movq    $63,%rcx
13 
14 A:
15     rclq     $1,%rax
16     jnc    B
17     movb     $49,(%rbx)
18     jmp C
19 B:
20     movb     $48,(%rbx)
21 C:
22     addq    $1,%rbx
23     loop A
24 
25     popq     %rbp
26     ret

AT&T语法的汇编网上有很多,俺就不介绍了。

在mac中使用的实际是clang编译器,这又牵扯到了LLVM项目,LLVM是构架编译器(compiler)的框架系统,Apple是LLVM计划的主要资助者。

cc链接的就是clang,Makefle文件:

main:main.o decBin.o

main.o:main.c
    
decBin.o:decBin.s
    cc -c $<

clean:
    -rm main.o decBin.o main

     在这样解释型语言横行的年代,编译语言越来越不受到重视,越来淡出我们的视线,比如汇编,已经很少很少有人学了。当然像java、python、javascript、ruby等

自有他们的优势,没有无缘无故的热门。比如我就很喜欢python,确实很方便,有段时间导致写C和C++程序时忘记加变量类型,但不管怎样,python确实很好用,

特别使用matplotlib库生成图表,很酷,以后我会写写的。

   但是如果我们往底层学下去特别到了OS和driver就是c外加一些汇编的天下了。UEFI中intel架构的Tiano 99%使用的是c,另外是汇编啦,以后会分享下的。

作为程序猿还是尽量了解了解底层原理,比如哪天出来个SB语言,又出来火热的安狗手机系统,安狗软件用SB语言开发,我们又得屁颠的学它,受人摆布啊。

俺是喜欢关于OS的东东(比如linux kernel),虽然还有很长的路要走。

  哎,为啥OS对于瓷器来说就这么费劲呢...值得深思!

    

posted @ 2013-03-24 15:18  除e尘  阅读(870)  评论(0编辑  收藏  举报