嵌入式汇编在C语言中的调用

内建函数

内建函数,大家可以认为就是一段汇编程序编写的函数,然后官方把它集成封装了。

行内汇编

如果我们在C语言中想插入一段汇编代码,那么我们可以使用行内汇编的方式。

具体的插入方式,可以看下面这幅图:

嵌入式汇编在C语言中的调用

利用行内汇编的场合,比如说,我要打开中断,关闭中断用汇编操作更直接。再比如说,我们想要对RAM清零,汇编操作会比C语言操作更快更简洁。

汇编对平台的要求很严,移植性不高,就算是C语言,不一样的单片机,语法格式也不一定完全一样。

C语言中调用汇编语言编写的函数,是如何调用的?

嵌入式汇编在C语言中的调用

我们在汇编中编写了_Asm_Test这个函数。
如果我们想要在C语言中调用它,我们需要完成如下几步:
①在汇编中对这个函数进行全局调用声明
②在C语言中进行外部调用声明
③在C语言中直接使用这个函数。

关于第一步,函数的全局声明
嵌入式汇编在C语言中的调用

 第二是C语言中要对这个调用的函数进行外部调用声明。嵌入式C语言中,一般建议外部函数声明写在头文件中。

嵌入式汇编在C语言中的调用

要注意上面两幅图中,是不是函数名称有区别啊?在汇编中,这个函数名称前面有一个下划线,但是在C语言中下划线消失了是吧。

这里就是需要注意的地方,如果汇编编写的函数需要在C语言中进行调用,那么这个函数至少需要一个下划线,然后在C语言中声明的时候把下划线去掉即可。这是这个编译器的规则。

刚才看到的是没有形参,也没有返回值的函数调用方式,下面我们来看下,有返回值有形参的汇编函数在C语言中又如何调用呢?

有返回值有形参的汇编函数在C语言调用

首先,第一步是编写一个带参数的函数,比如下图所示的函数:

嵌入式汇编在C语言中的调用

红色方框的两个寄存器是形参,蓝色方框的寄存器是返回值。

函数名称是_MulFrac

那么,要调用这个函数话,还是得先对这个函数进行全局声明:

嵌入式汇编在C语言中的调用

然后,在C语言里面,外部调用声明的格式如下:

嵌入式汇编在C语言中的调用

其中,在C语言这边,形参x就是汇编函数中的w0寄存器,形参y就是汇编函数中的w1寄存器,返回值是汇编汇编函数的w0寄存器。

怎么知道返回值的类型?如果只有一个返回值,就需要使用w0。

嵌入式汇编在C语言中的调用

链接描述文件

嵌入式汇编在C语言中的调用

 链接描述文件在什么地方啊?

嵌入式汇编在C语言中的调用

这个链接描述文件就是用来控制链接器的功能的。因为我们的程序编写完成之后,需要有下面几个步骤   编写    汇编    链接 。

链接就是由链接器完成的,那么这个链接描述文件就是用来控制链接器的功能的。

知道了链接描述文件的作用之后,下面我们一起来看下链接描述文件里面的内容。
首先,第一个是处理器和启动模块:

嵌入式汇编在C语言中的调用

使用的处理器是 33EP128MC506

下面是存储区的相关信息:

嵌入式汇编在C语言中的调用

这里面定义了数据存储区的起始地址和长度,以及程序存储区的起始地址和长度。

下面一个是输入/输出段的映射。

这个部分就是定义输入段是如何映射到输出段的。

可以给大家举个例子,比如在我们的C语言程序中我们编写了5个不同的函数,这5个不同的函数在单独的C文件中定义,这5个函数就会产生5个输入段。

那么,输出只有一个,所以链接器就会把这5个输入段组合到一个输出段中,这就是链接描述文件输入输出段的功能。

再举个例子

嵌入式汇编在C语言中的调用

嵌入式汇编在C语言中的调用

这两个函数是被放在两个不同的段,这个段的地址是在链接描述文件里面定义的。
嵌入式汇编在C语言中的调用

这些段,表示我们C语言编写的函数会被放在这些段对应的地址里面。

地址如果不自己定义的话,就是编译器去分配,没有指定大小,只是指定存放的顺序。

如果想指定地址可以这样:

嵌入式汇编在C语言中的调用

我们在defin.h头文件中定义了这个段,C语言的函数可以用它来限定属性,就知道这个函数要放在哪个段了。
嵌入式汇编在C语言中的调用

这个宏定义就跟链接描述文件中的段对应起来了。这些都是输入段,那么这些输入端最终都会被组合成一个输出。统一按照段的地址来顺序存放我们编写的这些代码。

这里的内容不是重点,大家可以了解一下,能读懂就行,不要求掌握。
这里在程序存储器里面定义一个相应的区域,C语言中是把对应的函数放入这个区域 。一个是定义空间,一个是把东西装入这个空间。

存储器的基地址

嵌入式汇编在C语言中的调用

比如,配置字节寄存器的基地址,数据空间的基地址,代码空间的基地址,都在这里定义的。

中断向量表

这里面大家主要关注中断服务函数的名称即可。
嵌入式汇编在C语言中的调用

主要关注这些名称是什么样的,然后自己写中断服务函数的时候,来这里找相应的中断服务函数的名称即可。

SFR的地址定义

嵌入式汇编在C语言中的调用

这个SFR空间是在数据存储器里面的,所以地址是从0开始的。

关于链接描述文件的内容就全部介绍完了。