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

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

3天内不再提示

关于C中嵌套汇编代码难吗?

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-01-10 14:24 次阅读

作者:黄工 公众号:strongerHuang 做底层软件开发的,或多或少都会接触一些汇编代码,今天就来说说关于汇编在C中的定义和调用,以及举例说明嵌套汇编代码。 一、嵌套汇编说明有认真研究,或者说细心一点的读者应该都知道:C中定义汇编代码与编译器有关。 比如:你在core_cm4.h文件会看到如下的代码:

#if defined ( __CC_ARM ) #define __ASM __asm /*!< asm keyword for ARM Compiler */ #define __INLINE __inline /*!< inline keyword for ARM Compiler */ #define __STATIC_INLINE static __inline #elif defined ( __GNUC__ ) #define __ASM __asm /*!< asm keyword for GNU Compiler */ #define __INLINE inline /*!< inline keyword for GNU Compiler */ #define __STATIC_INLINE static inline #elif defined ( __ICCARM__ ) #define __ASM __asm /*!< asm keyword for IAR Compiler */ #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ #define __STATIC_INLINE static inline #elif defined ( __TMS470__ ) #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ #define __STATIC_INLINE static inline #elif defined ( __TASKING__ ) #define __ASM __asm /*!< asm keyword for TASKING Compiler */ #define __INLINE inline /*!< inline keyword for TASKING Compiler */ #define __STATIC_INLINE static inline #elif defined ( __CSMC__ ) #define __packed #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */  #define __STATIC_INLINE  static inline#endif 

如果你写过Keil C51,你还会发现有如下(通过预处理)嵌套汇编:

#pragma asm ; Assembler Code Here #pragma endasm 所以,你会发现,不同的编译器,汇编代码还是有差异。当然,这里主要是说C中嵌套汇编与编译器有关。 二、C中嵌套汇编代码常见两种定义:

1.在C函数中定义一段汇编代码;

2.在C文件中定义一个汇编函数;

(当然,两个意思差不多,都是在C中嵌套汇编)

上面说了C中定义汇编代码与编译器有关,换句话说:不同编译器解析汇编代码的方式不同。 这里还是拿core_cm3.c来举例说明,定义一个__get_PSP函数。 在Keil MDK中定义:

__ASM uint32_t __get_PSP(void){ mrs r0, psp bx lr}在IAR EWARM中定义:

uint32_t __get_PSP(void){ __ASM("mrs r0, psp"); __ASM("bx lr");} __asm(__ASM)关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。 三、更多举例下面举一些常见例子。 1.FreeRTOS中portmacro.h文件下源代码:

static portFORCE_INLINE void vPortRaiseBASEPRI( void ){uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; __asm { /* Set BASEPRI to the max syscall priority to effect a critical section. */ msr basepri, ulNewBASEPRI dsb isb }}2.FreeRTOS中port.c文件下源代码:

__asm void xPortPendSVHandler( void ){ extern uxCriticalNesting; extern pxCurrentTCB; extern vTaskSwitchContext; PRESERVE8 mrs r0, psp isb ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ ldr r2, [r3] stmdb r0!, {r4-r11} /* Save the remaining registers. */ str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ stmdb sp!, {r3, r14} mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY msr basepri, r0 dsb isb bl vTaskSwitchContext mov r0, #0 msr basepri, r0 ldmia sp!, {r3, r14} ldr r1, [r3] ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ ldmia r0!, {r4-r11} /* Pop the registers and the critical nesting count. */ msr psp, r0 isb bx r14 nop}3.内核复位 这是之前分享过的一篇文章《STM32复位来源》中的代码:

__asm void NVIC_CoreReset_a(void){ LDR R0, =0xE000ED0C LDR R1, =0x05FA0001 STR R1, [R0]deadloop_Core B deadloop_Core} 举了这些常见例子,没有说透,但相信只要认真理解了都能明白。

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

    关注

    180

    文章

    7608

    浏览量

    137163
  • 编程
    +关注

    关注

    88

    文章

    3628

    浏览量

    93823
  • 代码
    +关注

    关注

    30

    文章

    4803

    浏览量

    68757
收藏 人收藏

    评论

    相关推荐

    EE-134:为SHARC系列编写C兼容汇编代码中断处理程序

    电子发烧友网站提供《EE-134:为SHARC系列编写C兼容汇编代码中断处理程序.pdf》资料免费下载
    发表于 01-07 13:58 0次下载
    EE-134:为SHARC系列编写<b class='flag-5'>C</b>兼容<b class='flag-5'>汇编</b><b class='flag-5'>代码</b>中断处理程序

    EE-132:使用VisualDSP将C代码和数据模块放入SHARC存储器

    电子发烧友网站提供《EE-132:使用VisualDSP将C代码和数据模块放入SHARC存储器.pdf》资料免费下载
    发表于 01-07 13:55 0次下载
    EE-132:使用VisualDSP将<b class='flag-5'>C</b><b class='flag-5'>代码</b>和数据模块放入SHARC存储器<b class='flag-5'>中</b>

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

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

    TMS320C6000汇编语言工具 v8.3.x

    电子发烧友网站提供《TMS320C6000汇编语言工具 v8.3.x.pdf》资料免费下载
    发表于 11-07 10:00 0次下载
    TMS320<b class='flag-5'>C</b>6000<b class='flag-5'>汇编</b>语言工具 v8.3.x

    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>快速入门

    hex文件怎么能转回去c语言

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

    hex可以转成源代码

    ,可以通过以下几种方法尝试获取源代码的近似形式: 反汇编 : 使用反汇编工具可以将Hex文件的机器码转换回汇编语言。
    的头像 发表于 09-02 10:41 1099次阅读

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

    是处理器可以直接执行的指令,而 C 语言代码则是人类可读的高级编程语言代码。 然而,如果你想要从 .hex 文件获取一些有用的信息或者对程序进行分析,你可以考虑以下几种方法: 反
    的头像 发表于 09-02 10:37 2526次阅读

    ModusToolbox 3.2在c代码包含c++代码的正确步骤是什么?

    使用 ModusToolbox 3.2 我有一个用纯 C 语言编写的 XMC4700 项目。 我正在尝试添加一些 C++ 函数,并将其合并到我的原始代码。 我可以构建独立的 .cpp
    发表于 07-23 08:21

    AIGC系统聊天小助手卡片小组件嵌套设计实践

    1.项目描述 领航者卡片样式较多,有些卡片比较近似;可以用嵌套方案,实现一个卡片,多个子单元 可拔插组件式卡片。 2.逻辑设计 2.1卡片示例-聊天框提示 3 通用提示卡片 设计 通用卡片
    的头像 发表于 06-12 11:20 838次阅读
    AIGC系统<b class='flag-5'>中</b>聊天小助手卡片小组件<b class='flag-5'>嵌套</b>设计实践

    TC375嵌套如何实现?

    这里描述说实现中断嵌套需要配置中断优先级组,但是我没看到有介绍分组的文档,请问中断嵌套要如和实现谢谢?
    发表于 05-27 07:30

    如何用Keil生成bin、汇编C汇编混合文件?

    用Keil生成bin、汇编C汇编混合文件
    发表于 04-08 06:17

    如何实现SysTick中断的嵌套自身?

    中断直接退出到我想要执行的调度函数RTTaskSchedule ,执行完调度函数RTTaskSchedule 后再执行函数IrqReturn返回到main。但是这段代码并不能实现我想要的功能,被嵌套的调度函数RTTaskSch
    发表于 03-25 06:20

    C语言能够实现单片机功能,为什么还要使用汇编呢?

    C语言能够实现单片机功能,为什么还要使用汇编呢? C语言是一种高级编程语言,它具有跨平台、可移植性强、易于使用的特点,使得开发人员能够快速且方便地编写复杂的程序。然而,尽管C语言在许多
    的头像 发表于 01-15 14:59 1100次阅读