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

    文章

    7633

    浏览量

    142174
  • 函数
    +关注

    关注

    3

    文章

    4385

    浏览量

    65149

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    详解hal_entry入口函数

    当使用RTOS时,程序从main函数开始进行线程调度;当没有使用RTOS时,C语言程序的入口函数main函数
    的头像 发表于 07-25 15:34 ?1113次阅读

    C语言中的内联函数与宏

    C编程,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 ?1299次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的内联<b class='flag-5'>函数</b>与宏

    深入理解C语言函数—编程的“积木块”艺术

    在编程的世界里,函数就像建筑的“积木块”——它们是构建复杂程序的基石。通过灵活组合这些模块,开发者能打造出功能强大且结构清晰的代码函数之所以成为
    的头像 发表于 06-30 17:26 ?976次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>函数</b>—编程<b class='flag-5'>中</b>的“积木块”艺术

    稳压器在安装接线前需要注意哪些

    稳压器是一种非常重要的电气设备,它可以有效地解决电压不稳定、波动过大等问题,保证设备的正常运行,然而,稳压器接线并非简单地将线接好就行,而是需要注意一些事项,以确保其能够安全、有效地发挥应有的作用,下面小编来说说稳压器在安装接线前需要注意哪些。
    的头像 发表于 04-03 15:20 ?331次阅读
    稳压器在安装接线前<b class='flag-5'>需要注意</b>哪些

    速度探头在使用过程需要注意哪些问题呢

    速度探头在使用过程需要注意安装与维护、参数设置与校准、使用注意事项以及安全注意事项等多个方面。只有做好这些工作,才能确保探头的正常工作、测量精度和安全性。
    的头像 发表于 02-06 15:11 ?477次阅读

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

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

    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 ?2次下载
    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语言

    的差异。 然而,如果你想要从 .hex 文件获取一些有用的信息或者对程序进行分析,你可以采取以下步骤来尽可能接近原始的C语言逻辑: 反汇编 : 使用反
    的头像 发表于 09-02 10:46 ?4567次阅读

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

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

    bnc公头注塑需要注意什么

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

    RISC-V汇编语言

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