在此记录一下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对于瓷器来说就这么费劲呢...值得深思!