关注、星标公众,不错过精彩内容

作者:黄工

公众号: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, pspbx 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 p. */msr basepri, ulNewBASEPRIdsbisb}
}

2.FreeRTOS中port.c文件下源代码:

__asm void xPortPendSVHandler( void )
{extern uxCriticalNesting;extern pxCurrentTCB;extern vTaskSwitchContext;PRESERVE8mrs r0, pspisbldr  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_PRIORITYmsr basepri, r0dsbisbbl vTaskSwitchContextmov r0, #0msr basepri, r0ldmia 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, r0isbbx r14nop
}

3.内核复位

这是之前分享过的一篇文章《STM32复位来源》中的代码:

__asm void NVIC_CoreReset_a(void)
{LDR R0, =0xE000ED0CLDR R1, =0x05FA0001STR R1, [R0]
deadloop_CoreB deadloop_Core
}

举了这些常见例子,没有说透,但相信只要认真理解了都能明白。

‧  END  

推荐阅读:

精选汇总 | 目录 | 搜索

Keil和IAR不同版本兼容性问题

ANSI 1918~2018的100年的发展历程

关注微信公众号『strongerHuang』,后台回复“1024”,查看更多精彩内容。

长按识别图中二维码关注

在C中嵌套汇编代码难吗?相关推荐

  1. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  2. latex下IEEE模板中嵌套Python代码

    如果想在LATEX中嵌套Python代码推荐使用listings 先 \usepackage[procnames]{listings} 然后在正文中使用 \lstset{language=Python ...

  3. php中嵌套html代码和html代码中嵌套php方式

    php中嵌套html代码和html代码中嵌套php方式 一.总结 拷贝的话直接html代码是极好的方式 1.php中嵌套html代码(本质是原生php):a.原生嵌套<?php .....?&g ...

  4. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 姓名:李冬辉 学号:20133201 注: 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http ...

  5. js 中 java 代码_在js中嵌套java代码

    jsp中有时候在js中操作某些java后台传递过来的数据逻辑比较复杂,比如list内容的遍历,可以直接在页面上添加java脚本来执行内容,代码如下: //在js中插入java代码操作 //取出java ...

  6. 网页中嵌套QQ代码设置在线状态无需加好友聊天

    为了更方便与客户的交流,我们经常会在网页中引用QQ,实现随时都与客户联系的效果. 有多种代码: 一.文字类型的: 1.<a target="_blank" href=&quo ...

  7. 理解ATL中的一些汇编代码

    我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以 ...

  8. Js拼接嵌套php代码,分享一个js文件中嵌套php会出错的问题

    前提: 使用ThinkPHP.后台传一个变量到html页面:$this->assign("variable", $variable); 问题: 在html页面中嵌套js代码, ...

  9. 汇编和python-PyAsm-在python中嵌入汇编 | 学步园

    http://members.verizon.net/~olsongt/usersGuide.html 其实很久之前就发现了PyAsm,但是初期的尝试并不成功.官方网站并没有给太多的例子,刚开始也没有 ...

最新文章

  1. 常用思科设备图标(JPG+矢量图)
  2. createinstance.java,weex android 0.17.0 createInstance fail
  3. 转贴:Hyper-V的几款免费管理工具
  4. (pytorch-深度学习系列)pytorch实现多层感知机(手动定义模型)对Fashion-MNIST数据集进行分类-学习笔记
  5. 如何交付机器学习项目:一份机器学习工程开发流程指南
  6. Docker学习总结(29)——Docker核心技术与实现原理
  7. 心得3--JDBC增删改查模版编写与案例
  8. 0基础入门前端,会遇到哪些困难?
  9. 华为Mate10到底AI在哪?
  10. C#时间判断的循环刻度判断
  11. 「WC 2019」数树
  12. css布局Absolute的垂直水平居中
  13. SQL入门教程(一):基础知识
  14. ad9修改焊盘阻焊层大小
  15. 君康人寿2019年排名_2019中国保险公司竞争力报告出炉 君康人寿盈利能力排名第二...
  16. 大数据与云计算的关系?
  17. 盘点一下使用高德api踩得坑
  18. React路由管理 —— React Router 总结
  19. opencv中cv2.warpAffine 和 cv2.warpPerspective的广泛应用
  20. 人工智能一路狂飙现隐忧 过高预期恐催泡沫

热门文章

  1. magic版本和android版本,荣耀Magic2的6G版和8G版差什么? 荣耀Magic2版本对比
  2. Vue中使用高德地图,简单明了
  3. 36_ue4[UI]05_3DUI显示与展示
  4. L1-051 打折 (5 分)
  5. socket实现局域网语音通话 c++ winapi
  6. 全球及中国加油站行业建设规模与经营管理模式咨询报告2021版
  7. css+div如何解决内容的溢出
  8. RH124(6)----Linux系统中的权限管理
  9. 一个程序是如何运行起来的?
  10. STM32开发(11)----CubeMX配置独立看门狗(IWDG)