![b38fc49a340511e80d4e28d40f6512b7.png](https://img-blog.csdnimg.cn/img_convert/b38fc49a340511e80d4e28d40f6512b7.png)
由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用。
会两种不同语言的人,只是掌握了同一件事物的两种表达方式。人在学习一种新语言时,潜意识里是建立了语言符号与事物形象的映射关系,比如我们在学习grape这个单词时,我们之所以认为它就是我们所认知的葡萄,是因为我们知道这两个名词都是在描述同一种圆圆的、黑紫色、甜酸的这一水果的形象,如果脑子中不存在这个形象的话,不光是学不会grape这个英文单词,就连中文的葡萄也不知道是何意。总之,对于具体的事物,一定是先有其形象,再有其描述,这样才能理解该事物,了解了事物的本质形象后,无论该事物的名字怎样变化,我们都能将它们相互转换。
也许有同学会问,以上这些所说的目的是什么?各位观众稍安勿燥,马上就要入戏啦^_^。
“汇编语言和C语言可以互相调用”,这句话并不是如表面陈述的那样,似乎是两种语言能直接交流,其实并不是这样。c语言和汇编语言完全是不同的东西,它们怎么能认识对方呢。这就像跟不懂汉语的人说汉语,那人听了肯定会晕头转向的,除非身边有个翻译帮忙转述,这个翻译所做的工作实质上是在脑子中找到这种语言所描述的事物形象,然后给出这种事物形象的另一种语言表达,这个事物形象才是翻译的核心。这有些类似上面提到的葡萄的例子,在同一种指令集上的各种计算机程序语言,最终也要编译为那些相同的机器码,这些机器码便是高级语言的本质形象。对于上面提到的翻译,在计算机世界里,就是编译器,只不过这个翻译是有多个,例如本书所说的c语言编译器gcc和汇编语言编译器nasm,它们能在一起配合,是因为它们都懂机器语言。举个例子,就像小明只会汉语和英语,小红只会汉语和法语,若他们之间在交流时,小明说英语,小红说法语,他俩相互都听不懂,所以,当说英文的小明想跟说法语的小红借作业时,他必须用汉语告诉小红。
编译器知道高级语言所描述的事物形象是机器码,所以各种编译在高级语言方面的交流,本质上都是将它们都变成统一的机器码后实现的。
吼吼,一不小心又说多了,不知道我表达清楚了没有,反正话题就此结束啦,小弟这里给各位看官准备了两个小文件:C_with_S_c.c和C_with_S_S.S。大家不用细看,快速浏览一下即可,在代码后面我还有话说呢
C_with_S_c.c
1extern void asm_print(char*,int); 2void c_print(char* str) { 3 int len=0; 4 while(str[len++]); 5 asm_print(str, len); 6}
C_with_S_S.S
1 section .data 2 str: db "asm_print says hello world!