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

    文章

    7534

    浏览量

    129550
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92478
  • 代码
    +关注

    关注

    30

    文章

    4558

    浏览量

    66907
收藏 人收藏

    评论

    相关推荐

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

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

    while与if嵌套如何使用

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

    C51为什么要嵌套汇编

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

    请问C51为什么要嵌套汇编

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

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

    单片机C代码嵌套汇编的一些方法
    的头像 发表于 10-18 16:39 297次阅读
    单片机C<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 208次阅读
    单片机C<b class='flag-5'>代码</b><b class='flag-5'>嵌套汇编</b>案例

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

    c语言宏定义可以嵌套吗? C语言宏定义可以嵌套,也就是一个宏定义可以包含另一个宏定义,这也被称为宏定义的嵌套扩展。 宏定义是C语言中一种很重要的语法结构,它类似于一种预处理指令,用于在程序编译之前
    的头像 发表于 09-04 17:38 2678次阅读

    关于NucleiStudio IDE编译汇编文件的问题

    关于NucleiStudio的使用,我想问两个问题,一个是NucleiStudio IDE编译汇编文件的问题,另一个是关于NucleiStudio IDE编译RISCV向量扩展指令的问题,我在百度
    发表于 08-12 08:05

    如何编写Arm汇编代码

    大多数开发人员使用高级语言(如CC++)编写大部分代码。然后将此高级源代码编译为在目标设备上运行的机器代码。 然而,有时编写低级
    发表于 08-02 13:01

    为什么要反汇编?反汇编文件的生成和解读

    汇编顾名思义就是汇编的逆过程,将二进制文件反汇编汇编代码。arm-linux-objdump是交叉编译工具链里的一个工具,专门用来反
    发表于 08-02 10:25 3252次阅读
    为什么要反<b class='flag-5'>汇编</b>?反<b class='flag-5'>汇编</b>文件的生成和解读

    怎么快速把汇编代码和C语言代码对应起来呢?

    分析软件缺陷,有时候需要把ELF文件反汇编汇编代码,然后分析汇编代码,需要把汇编
    的头像 发表于 06-12 16:45 1810次阅读

    RISC-V查看汇编代码的几种方式

    很多时候需要对照C和汇编进行分析和调试,所以需要查阅汇编代码,以下分享几种方式。
    的头像 发表于 06-09 19:13 2077次阅读
    RISC-V查看<b class='flag-5'>汇编</b><b class='flag-5'>代码</b>的几种方式

    EPS8266编译成什么代码C汇编)?

    EPS8266 编译成什么代码C汇编)?
    发表于 06-08 08:02

    道一云入选中国信通院《2023低代码·无代码应用案例汇编

    ”环节,大会正式发布《2023低代码和无代码市场调研报告》、《2023低代码·无代码应用案例汇编》。其中《2023低
    的头像 发表于 05-31 16:54 472次阅读