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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144638
  • 编程
    +关注

    关注

    90

    文章

    3708

    浏览量

    96770
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言的编程技巧

    1、宏定义使用do{...}while(0)‌:当宏定义包含多条语句时,使用do{...}while(0)可以避免语句嵌套问题,确保宏的独立性。‌ ‌2、灵活数组成员‌:C99标准允许结构体的最后
    发表于 11-27 06:46

    求助,关于C代码的printf打印的疑问求解

    在使用E203 testbench执行附带的benchmark测试用例时候,得到如下打印信息: CPU验证小白一枚,有个问题不是很理解:黄色框框内的字符看起来应该是C代码的printf语句
    发表于 11-10 07:54

    RVMCU课堂「7」: 手把手教你玩转RVSTAR—汇编程序篇

    汇编程序而言,在汇编程序调用C/C++语言函数,必须遵照ABI所定义的函数调用规则,即函数参数由寄存器a0~a7传递,函数返回由寄存器a0
    发表于 10-31 08:46

    简单的内联汇编介绍

    前言1、在程序我们可以嵌入汇编直接对我们加入的硬件进行相应的操作 2、在RISC-V架构定义的CSR寄存器需要使用特殊的 CSR 指令进行访问,如果在 C/
    发表于 10-30 08:04

    采用汇编指示符来使用自定义指令

    ,.dword为插入双字即64位。以下为演示过程: * 在main.c编写如下代码 * 使用riscv-nuclei-elf-gcc main.c命令编译main.
    发表于 10-28 06:02

    GCC内联汇编

    需要用到C/C++的内联汇编语法asm volatile(“instructions”) 以在C代码
    发表于 10-24 07:46

    关于蜂鸟E203内核中断硬件实现中断嵌套的设计

    嵌套,可以有很多层(蜂鸟处理器该情况下不响应新的端,继续执行正在处理的ISR,彻底完成后才响应新的中断请求) 注意:假设新来的中断请求的优先级比正在处理的中断优先级低或者相同,则无论是否能支持中断
    发表于 10-23 07:07

    Whetstone代码涉及的浮点指令汇编分析

    对benchmark的whetstone进行代码分析,通过反汇编统计所出现的浮点指令,共有26种,如下 特点是只涉及单精度的浮点指令,并且存在有浮点Load/Store的压缩指令,还有一些伪
    发表于 10-22 08:11

    技术干货驿站 ▏深入理解C语言:嵌套循环与循环控制的底层原理

    大家好!在上一节,我们学习了C语言中的基本循环语句,如for、while和do...while循环。今天,我们将进一步探讨嵌套循环和循环控制,这些技巧可以帮助我们实现更复杂的逻辑操作。无论是处理
    的头像 发表于 02-21 18:26 1045次阅读
    技术干货驿站  ▏深入理解<b class='flag-5'>C</b>语言:<b class='flag-5'>嵌套</b>循环与循环控制的底层原理

    代码加密、源代码防泄漏c/c++与git服务器开发环境

    代码加密对于很多研发性单位来说是至关重要的,当然每家企业的业务需求不同所用的开发环境及开发语言也不尽相同,今天主要来讲一下c++及git开发环境的源代码防泄密保护方案。企业源代码泄密
    的头像 发表于 02-12 15:26 882次阅读
    源<b class='flag-5'>代码</b>加密、源<b class='flag-5'>代码</b>防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c</b>++与git服务器开发环境

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

    的那样,直接把 1234 赋值给了变量 ret? 搞懂这个问题不难,只要看下汇编代码就行。 把代码编译一下,只编译不链接,得到的就是C对应的汇编
    的头像 发表于 01-16 09:21 765次阅读

    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汇编语言工具v7.4用户指南

    电子发烧友网站提供《TMS320C6000汇编语言工具v7.4用户指南.pdf》资料免费下载
    发表于 12-30 16:42 3次下载
    TMS320<b class='flag-5'>C</b>6000<b class='flag-5'>汇编</b>语言工具v7.4用户指南