0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言代码中调用汇编函数需要注意什么

单片机匠人 来源:单片机匠人 作者:蔡琰老师 2021-11-12 11:04 次阅读

除了汇编语言工程和C语言工程,许多嵌入式工程既包含C语言又包含汇编语言。由于Keil MDK的默认启动代码是用汇编编写的,但是又是独立的一个启动代码是汇编实现,一般其他程序都是C语言实现。

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

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关键字来引入地址符号。

_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工具链则采用了另外一种特性“嵌入汇编”。

通过嵌入汇编,我们可以在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);

嵌入汇编允许你在异常处理中定位栈帧,这也是嵌入汇编的一个优势。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7618

    浏览量

    138678
  • 函数
    +关注

    关注

    3

    文章

    4355

    浏览量

    63301

原文标题:C语言与汇编混合工程

文章出处:【微信号:gh_e7f294a514ca,微信公众号:单片机匠人】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言如何处理函数的返回值

    当你在函数的最后写上 return 0 的时候,它是如何返回给调用函数的? 比如 test 函数,为了待会更好的看懂汇编
    的头像 发表于 01-16 09:21 154次阅读

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言</b>中的DSP:从<b class='flag-5'>C</b><b class='flag-5'>调用汇编</b>类成员<b class='flag-5'>函数</b>

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    /C++代码快速迁移至HarmonyOS NEXT。凭借卓越的兼容性,AKI已成为厂商与开发者打造鸿蒙原生应用过程中广泛使用的跨语言调用解决方案。 AKI是一款专为鸿蒙原生开发设计的
    发表于 01-02 17:08

    c51单片机中断

    现场)。例如,在汇编语言中,需要将用到的通用寄存器的值压栈保存,在中断返回前再出栈恢复。 注意变量的共享访问 :如果中断函数和主程序或者其他中断函数
    发表于 11-25 21:43

    TMS320C28x汇编语言工具

    电子发烧友网站提供《TMS320C28x汇编语言工具.pdf》资料免费下载
    发表于 11-01 09:32 0次下载
    TMS320<b class='flag-5'>C</b>28x<b class='flag-5'>汇编语言</b>工具

    TMS320LF240x DSP的C语言汇编代码快速入门

    电子发烧友网站提供《TMS320LF240x DSP的C语言汇编代码快速入门.pdf》资料免费下载
    发表于 10-18 10:14 1次下载
    TMS320LF240x DSP的<b class='flag-5'>C</b><b class='flag-5'>语言</b>和<b class='flag-5'>汇编</b><b class='flag-5'>代码</b>快速入门

    hex文件如何查看原c语言代码

    是处理器可以直接执行的指令,而 C 语言代码则是人类可读的高级编程语言代码。 然而,如果你想要从 .hex 文件
    的头像 发表于 09-02 10:37 3262次阅读

    bnc公头注塑需要注意什么

    德索工程师说道在BNC公头注塑过程需要注意多个方面以确保产品的质量和生产效率。以下是对这一过程关键注意事项的详细阐述:   材料选择:根据BNC公头的使用环境和性能要求,选
    的头像 发表于 08-22 08:53 357次阅读
    bnc公头注塑<b class='flag-5'>需要注意</b>什么

    RISC-V汇编语言

    一、导言 从 C 程序翻译成为可以在计算机上执行的机器语言程序的四个经典步骤。这一章的内容包括了后三个步骤,不过我们要从汇编语言在 RISC-V 函数
    发表于 08-19 18:07

    共模电感选型参数需要注意哪些

    电子发烧友网站提供《共模电感选型参数需要注意哪些.docx》资料免费下载
    发表于 07-30 14:23 0次下载

    应用PLC需要注意哪些问题

    PLC(可编程逻辑控制器)作为现代工业控制的核心设备,其应用的广泛性和重要性不言而喻。然而,在应用PLC的过程,也需要注意一系列问题,以确保PLC系统的稳定运行和高效控制。本文将结合实际应用经验,详细探讨应用PLC时需要注意
    的头像 发表于 06-17 11:29 699次阅读

    提高C代码可读性的编写技巧与策略

    指针是 C 语言的灵魂,是 C 比其他语言更灵活,更强大的地方。所以学习 C 语言必须很好的掌握
    发表于 04-23 18:25 615次阅读

    PCBA加工生产时需要注意哪些相关事项?

    一站式PCBA智造厂家今天为大家pcba批量生产过程需要注意什么?pcba生产过程需要注意的问题。PCBA(Printed Circuit Board Assembly)是电子产品
    的头像 发表于 04-16 09:59 686次阅读
    PCBA加工生产时<b class='flag-5'>需要注意</b>哪些相关事项?

    函数多层调用的主要注意事项分析

    应用方案设计,开发者经常会碰到某个子函数需要多次多级调用的情况。
    的头像 发表于 03-27 15:36 1147次阅读
    子<b class='flag-5'>函数</b>多层<b class='flag-5'>调用</b>的主<b class='flag-5'>要注意</b>事项分析

    pcb电路板元件布局需要注意什么

    pcb电路板元件布局需要注意什么
    的头像 发表于 03-14 15:24 1026次阅读