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

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

#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){ mrsr0, 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文件下源代码:

staticportFORCE_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} 举了这些常见例子,没有说透,但相信只要认真理解了都能明白。

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

    关注

    180

    文章

    7565

    浏览量

    133413
  • 编程
    +关注

    关注

    88

    文章

    3497

    浏览量

    93112
  • 代码
    +关注

    关注

    30

    文章

    4640

    浏览量

    67637
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    汇编代码是什么意思

    汇编 代码简介 说到 汇编语言的产生,首先要讲一下机器语言。机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低
    的头像 发表于12-13 11:11 1186次阅读
    <b class='flag-5'>汇编</b><b class='flag-5'>代码</b>是什么意思

    if嵌套函数的正确输入方法为

    = nested_function() # 使用 嵌套函数的结果进行后续操作 else : # else语句的逻辑 return result 在上面的示例 ,我们首先定义了一个名为 main_function 的主函数。在 if 语句块
    的头像 发表于11-30 16:50 1068次阅读

    c语言中多维数组可以嵌套定义

    C语言中多维数组可以 嵌套定义,这使得我们可以在一个数组 存储另一个数组。通过这种方式,我们可以创建更加复杂和灵活的数据结构,以便更好地表示和处理各种类型的数据。 首先,我们先介绍多维数组的基本概念
    的头像 发表于11-24 10:18 745次阅读

    c语言在while嵌套if循环

    嵌套if语句的用法和好处。 一、 C语言中的while循环和if语句 在开始我们深入探讨while循环中 嵌套if语句的细节之前,让我们首先回顾一下while循环和if语句的基本用法。 while循环:while循环是一种迭代结构
    的头像 发表于11-22 10:09 3171次阅读

    while与if嵌套如何使用

    嵌套是编程中常用的一种技术,它可以使 代码在特定条件下执行不同的操作。在Python ,while循环和if条件语句经常被 嵌套使用,以实现更复杂的程序逻辑。 首先,我们来看一下while
    的头像 发表于11-22 10:06 2526次阅读

    armasm编译汇编代码链接失败的问题分析

    这里新开一篇博文,专门讲讲针对ARM格式的 汇编 代码,使用AC6.12应该如何处理。下述内容大多来自文档
    的头像 发表于11-13 16:03 580次阅读

    C51为什么要嵌套汇编

    C51为什么要 嵌套汇编
    发表于10-31 06:48

    请问C51为什么要嵌套汇编

    是不是 c语言有处理的东西有不方便的?
    发表于10-25 08:11

    单片机C代码嵌套汇编的一些方法

    单片机 C 代码 嵌套汇编的一些方法
    的头像 发表于10-18 16:39 400次阅读
    单片机<b class='flag-5'>C</b><b class='flag-5'>代码</b><b class='flag-5'>嵌套汇编</b>的一些方法

    IAR在进行C语言代码开发的时候怎么嵌入汇编代码

    IAR在进行 C语言 代码开发的时候怎么嵌入 汇编 代码
    发表于10-11 06:45

    单片机C代码嵌套汇编案例

    有认真研究,或者说细心一点的读者应该都知道: C 定义 汇编 代码与编译器有关。 比如,你在core_cm4.h文件会看到如下的 代码
    发表于09-07 09:45 360次阅读
    单片机<b class='flag-5'>C</b><b class='flag-5'>代码</b><b class='flag-5'>嵌套汇编</b>案例

    c语言宏定义可以嵌套吗?

    c语言宏定义可以 嵌套吗? C语言宏定义可以 嵌套,也就是一个宏定义可以包含另一个宏定义,这也被称为宏定义的 嵌套扩展。 宏定义是
    的头像 发表于09-04 17:38 2902次阅读

    ARM开发人员套件1.2版汇编指南

    ARM开发者套件(ADS)拥有: ·一个独立的 汇编程序ARMASM·一个内置在 CC++编译器 的优化内联 汇编程序。 这些
    发表于09-01 10:41