关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
单片机开发或多或少都会接触一些汇编代码,今天就来说说关于汇编在C中的定义和调用,以及举例说明嵌套汇编代码。有认真研究,或者说细心一点的读者应该都知道:C中定义汇编代码与编译器有关。
比如:你在core_cm4.h文件会看到如下的代码:#if defined ( __CC_ARM )
#define __ASM __asm
#define __INLINE __inline
#define __STATIC_INLINE static __inline
#elif defined ( __GNUC__ )
#define __ASM __asm
#define __INLINE inline
#define __STATIC_INLINE static inline
#elif defined ( __ICCARM__ )
#define __ASM __asm
#define __INLINE inline
#define __STATIC_INLINE static inline
#elif defined ( __TMS470__ )
#define __ASM __asm
#define __STATIC_INLINE static inline
#elif defined ( __TASKING__ )
#define __ASM __asm
#define __INLINE inline
#define __STATIC_INLINE static inline
#elif defined ( __CSMC__ )
#define __packed
#define __ASM _asm
#define __INLINE inline
#define __STATIC_INLINE static inline
#endif

如果你写过Keil C51,你还会发现有如下(通过预处理)嵌套汇编:#pragma asm
; Assembler Code Here
#pragma endasm
所以,你会发现,不同的编译器,汇编代码还是有差异。当然,这里主要是说C中嵌套汇编与编译器有关。常见两种定义:
1.在C函数中定义一段汇编代码;
2.在C文件中定义一个汇编函数;
上面说了C中定义汇编代码与编译器有关,换句话说:不同编译器解析汇编代码的方式不同。这里还是拿core_cm3.c来举例说明,定义一个__get_PSP函数。__ASM uint32_t __get_PSP(void)
{
mrs r0, psp
bx lr
}
uint32_t __get_PSP(void)
{
__ASM("mrs r0, psp");
__ASM("bx lr");
}
__asm(__ASM)关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。看到这里,推荐阅读我分享的一篇文章:单片机用汇编和C语言点灯程序的区别下面举一些常见例子。
1.FreeRTOS中portmacro.h文件下源代码:static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;
__asm
{
msr basepri, ulNewBASEPRI
dsb
isb
}
}
__asm void xPortPendSVHandler( void )
{
extern uxCriticalNesting;
extern pxCurrentTCB;
extern vTaskSwitchContext;
PRESERVE8
mrs r0, psp
isb
ldr r3, =pxCurrentTCB
ldr r2, [r3]
stmdb r0!, {r4-r11}
str r0, [r2]
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]
ldmia r0!, {r4-r11}
msr psp, r0
isb
bx r14
nop
}
这是之前分享过的一篇文章《STM32复位来源》中的代码:__asm void NVIC_CoreReset_a(void)
{
LDR R0, =0xE000ED0C
LDR R1, =0x05FA0001
STR R1, [R0]
deadloop_Core
B deadloop_Core
}
举了这些常见例子,没有说透,但相信只要认真理解了都能明白。
------------ END ------------
●专栏《嵌入式工具》
●专栏《嵌入式开发》
●专栏《Keil教程》
●嵌入式专栏精选教程
关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

点击“阅读原文”查看更多分享。