打印
[牛人杂谈]

C语言与汇编混合工程

[复制链接]
123|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2023-3-22 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
除了汇编语言工程和C语言工程,许多嵌入式工程既包含C语言又包含汇编语言。由于Keil MDK的默认启动代码是用汇编编写的,但是又是独立的一个启动代码是汇编实现,一般其他程序都是C语言实现。

我们一起来看下混合语言工程中,就比如在汇编程序中调用C函数,或者在C语言代码中调用汇编函数需要注意什么,稍不留意结果就可能是无法预测的。比如程序在一种版本的编译器下可以正常工作,而在另外的版本下,或者更换编译器后,工程可能会由于寄存器的使用冲突而停止工作。

使用特权

评论回复
沙发
两只袜子|  楼主 | 2023-3-22 09:28 | 只看该作者
1、在汇编中调用C函数
当在汇编文件中调用C函数的时候,需要注意一下方面:
①寄存器R0到R3、R12以及LR可能会被更改,如果这些寄存器中的数据之后还要使用,就需要将它们保存到栈上。
②SP的值应该是双字对齐的
③需要确保输入参数存储在正确的寄存器中(比如简单例子,使用R0~R3)
④返回值(假定为32位或更小)一般存在R0中
举个例子:如果有一个将四个值相加的函数:
int my_add(int x1,int x2,int x3,int x4)
{
return (x1+x2+x3+x4);
}
在Keil MDK中,可以使用以下的代码在汇编中调用C函数:
MOVS  R0,#1    ;第一个参数(x1)
MOVS  R1,#2    ;第二个参数(x2)
MOVS  R2,#3    ;第三个参数(x3)
MOVS  R3,#4    ;第四个参数(x4)
IMPORT my_add
BL     my_add   ;调用“my_add”函数,结果保存在R0中
如果汇编代码是按照C文件中的嵌入式汇编编写的,应该使用_CPP关键字代替IMPORT关键字来引入地址符号。

使用特权

评论回复
板凳
两只袜子|  楼主 | 2023-3-22 09:28 | 只看该作者
_CPP的用法如下:
上例程中:
IMPORT my_add
BL     my_add   ;调用“my_add”函数,结果保存在R0中
改为:
BL    _CPP(my_add)  ;调用“my_add”函数,结果保存在R0中
在Keil  MDK中,_CPP关键字用于访问C或C++编译时的常量表达式,而对于其他工具链,情况可能就有所不同了。

2、在C代码中调用汇编函数
如果要从C代码中调用汇编函数,在实现汇编函数时,需要注意一下几点:
①若改变了寄存器R4到R11里的任何数值,需要将原始数值保存到栈中,并且在返回到C代码以前恢复原始值。
②若要在汇编函数中调用另一个函数,需要将LR的值保存在栈中,并且利用它执行返回操作。
③函数返回值一般存在R0中
举个例子:如果一个实现4个数相加的汇编函数:
EXPORT   my_add
my_add FUNCtiON
ADDS  R0,R0,R1
ADDS  R0,R0,R2
ADDS  R0,R0,R3
BX   LR    ;返回值在R0中
ENDFUNC
在C代码中,需要将函数声明为:
extern  int my_add(int x1,int x2,int x3,int x4);
int y;
……
y= my_add(1,2,3,4);//调用my_add函数
如果汇编代码需要访问C代码中的一些变量,也可以使用IMPORT关键字。

大多数情况下,可能只需要一到两个简单的汇编函数,所以就想将这些汇编代码嵌入C代码的文件中。多数开发工具都有一种被称作内联汇编的特性,而ARM工具链则采用了另外一种特性“嵌入汇编”。

使用特权

评论回复
地板
两只袜子|  楼主 | 2023-3-22 09:28 | 只看该作者
通过嵌入汇编,我们可以在C文件中实现汇编函数。例如,将4个参数相加的函数可以如下写法:
_asm int my_add(int x1,int x2,int x3,int x4)
{
ADDS  R0,R0,R1
ADDS  R0,R0,R2
ADDS  R0,R0,R3
BX    LR  ;返回值在R0中
}
可以在C代码中像普通C函数一样调用这个函数:
y = my_add(1,2,3,4);
嵌入汇编允许你在异常处理中定位栈帧,这也是嵌入汇编的一个优势。

使用特权

评论回复
5
豌豆爹| | 2023-3-22 15:24 | 只看该作者
想要入门嵌入式必须弄懂c语言

使用特权

评论回复
6
七毛钱| | 2023-3-23 15:29 | 只看该作者
混合语言工程会不会把人好迷糊了,哈哈

使用特权

评论回复
7
星辰大海不退缩| | 2023-3-27 17:45 | 只看该作者
还混合,一种都能搞晕了

使用特权

评论回复
8
AdaMaYun| | 2023-3-27 18:01 | 只看该作者
是不是还是C 语言多?

使用特权

评论回复
9
yiyigirl2014| | 2023-3-27 20:57 | 只看该作者
在C语言与汇编混合工程中,通常是通过在C语言程序中嵌入汇编代码来实现。这种混合编程的方式可以让程序员利用C语言的高级特性和汇编语言的低级特性,使程序能够更高效地执行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1882

主题

6436

帖子

8

粉丝