先看内嵌汇编示例,两种写法(IAR8.3实测可正常编译运行。功能是跳转执行程序,设置栈顶指针)

//示例一:
if (((*(__IO uint32_t *)ApplicationAddress) & 0x2FFE0000) == 0x20000000)
{//跳转至用户代码JumpAddress = *(__IO uint32_t *)(ApplicationAddress + 4);Jump_To_Application = (pFunction)JumpAddress;//初始化用户程序的堆栈指针asm(" LDR R4,  =0x08004000 ");asm(" LDR r5,  [r4] ");asm(" msr msp, r5 ");__enable_irq();Jump_To_Application();
}
//示例二:
if(true)
{asm(" LDR R4,  =0x08004000 \n"" LDR r5,  [r4] \n"" msr msp, r5             ");
}

汇编函数定义及引用(摘自CubeMx生成的工程)

#include <FreeRTOSConfig.h>RSEG    CODE:CODE(2)thumbEXTERN vPortYieldFromISREXTERN pxCurrentTCBEXTERN vTaskSwitchContextPUBLIC vSetMSPPUBLIC xPortPendSVHandlerPUBLIC vPortSVCHandlerPUBLIC vPortStartFirstTaskPUBLIC ulSetInterruptMaskFromISRPUBLIC vClearInterruptMaskFromISR/*-----------------------------------------------------------*/vSetMSPmsr msp, r0bx lr/*-----------------------------------------------------------*/xPortPendSVHandler:mrs r0, pspldr r3, =pxCurrentTCB  /* Get the location of the current TCB. */ldr   r2, [r3]subs r0, r0, #32        /* Make space for the remaining low registers. */str r0, [r2]           /* Save the new top of stack. */stmia r0!, {r4-r7}      /* Store the low registers that are not saved automatically. */mov r4, r8               /* Store the high registers. */mov r5, r9mov r6, r10mov r7, r11stmia r0!, {r4-r7}push {r3, r14}cpsid ibl vTaskSwitchContextcpsie ipop {r2, r3}          /* lr goes in r3. r2 now holds tcb pointer. */ldr r1, [r2]ldr r0, [r1]          /* The first item in pxCurrentTCB is the task top of stack. */adds r0, r0, #16      /* Move to the high registers. */ldmia r0!, {r4-r7}     /* Pop the high registers. */mov r8, r4mov r9, r5mov r10, r6mov r11, r7msr psp, r0              /* Remember the new top of stack for the task. */subs r0, r0, #32       /* Go back for the low registers that are not automatically restored. */ldmia r0!, {r4-r7}      /* Pop low registers.  */bx r3/*-----------------------------------------------------------*/vPortSVCHandler;/* This function is no longer used, but retained for backwardcompatibility. */bx lr/*-----------------------------------------------------------*/vPortStartFirstTask/* The MSP stack is not reset as, unlike on M3/4 parts, there is no vectortable offset register that can be used to locate the initial stack value.Not all M0 parts have the application vector table at address 0. */ldr r3, =pxCurrentTCB  /* Obtain location of pxCurrentTCB. */ldr r1, [r3]ldr r0, [r1]          /* The first item in pxCurrentTCB is the task top of stack. */adds r0, #32          /* Discard everything up to r0. */msr psp, r0               /* This is now the new top of stack to use in the task. */movs r0, #2               /* Switch to the psp stack. */msr CONTROL, r0isbpop {r0-r5}             /* Pop the registers that are saved automatically. */mov lr, r5             /* lr is now in r5. */pop {r3}              /* The return address is now in r3. */pop {r2}              /* Pop and discard the XPSR. */cpsie i                  /* The first task has its context and interrupts can be enabled. */bx r3                    /* Jump to the user defined task code. *//*-----------------------------------------------------------*/ulSetInterruptMaskFromISRmrs r0, PRIMASKcpsid ibx lr/*-----------------------------------------------------------*/vClearInterruptMaskFromISRmsr PRIMASK, r0bx lrEND

一些常用的汇编指令以及简单用法示例

LDR:把地址内的数据存到通用寄存器。

STR:把通用寄存器内的数据存到目标地址内。

MRS: 对状态寄存器CPSR和SPSR进行读操作。示例:mrs r0,cpsr ;读状态寄存器cpsr的数据到r0中.

MSR: 对状态寄存器CPSR和SPSR进行写操作。示例:msr msp, r5 ;把r5的值存到栈顶指针.

在IAR中使用汇编指令\内嵌汇编相关推荐

  1. gnu嵌入汇编,内嵌汇编详细的介绍

    GCC 提供了内嵌汇编的功能,可以在 C 代码中直接内嵌汇编语言语句,大大方便了程序设计.简单的内嵌汇编很容易理解,例: __asm__ __volatile__("hlt"); ...

  2. linux中c语言常用内嵌汇编

    源码地址 http://download.csdn.net/download/sinat_35360663/10224892 // // main2.c // allen // // Created ...

  3. swi 指令能用在C语言吗,内嵌汇编指令的应用举例

    下面是在C语言程序中嵌入式汇编程序的例子.通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法. (1)  字符串复制 本例主要介绍如何使用指令BL调用子程序. 注意,在内嵌的SWI和BL指令中, ...

  4. GCC在C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

  5. vs2015c语言内嵌汇编,C#中内嵌资源的读取

    起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...

  6. 结合实例分析arm指令集中的adds指令与arm内嵌汇编

    qq截图进来的图全部丢失了........郁闷...... 以下是ffmpege0.11.1源码中的一个函数,稍微做了点修改 注意:编译器我arm-linux-gcc4.4.1,其他的编译器请读者自行 ...

  7. linux smp lock 锁总线 内嵌汇编,gcc中的内嵌汇编语言(Inteli386平台)

    gcc中的内嵌汇编语言(Intel i386平台) 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中 还是有一部分是用汇编语言写成的.有些汇编语言代码是直接写在汇 编源程序 ...

  8. linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编

    gcc编译c语言中内嵌汇编 --AT&T and Intel 汇编语法对照 寄存器命名: AT&T:  %eax Intel: eax AT&T 语法源地址在左侧,目的地址在右 ...

  9. C语言中内嵌汇编asm语法

    这篇文章写得炒鸡详细而且很全面,易于理解,建议新手查看 C语言中内嵌汇编asm语法 下面这两篇文章作为补充来看 C语言内嵌汇编:asm volatile C语言ASM汇编内嵌语法

最新文章

  1. React Native调用原生模块
  2. 强化学习笔记:Policy-based Approach
  3. OpenvSwitch VxLAN实验
  4. java 滚动加载,滚动加载,可视区域判断
  5. java Socket通信(一)
  6. java获取浏览器版本号
  7. html5动画是什么,10个HTML5动画 让你忘掉Flash是啥(组图)
  8. JS之字符串截取函数substr
  9. retrofit 2.0 android 教程,初识Retrofit2.0
  10. 基于zookeeper实现分布式配置中心(一)
  11. zabbix mysql 脚本路径_Zabbix监控MySQL脚本
  12. 平面包装设计怎么制作_从平面文件中获取数据时如何避免包装设计缺陷
  13. c# 后台传到前台乱码_ASP.NET关于前台脚本传递中文参数,后台获取乱码问题(乱码为方框,黑色方框等。。)...
  14. 再让大家清爽一下,给加班的oscer们,哈
  15. Aurora一些使用过程中碰到的问题
  16. PHP单元测试PHPUnit
  17. mysql 版本_mysql各个版本介绍
  18. 天线学习笔记——HFSS简单阵列天线
  19. oracle sequences优化_Oracle 优化和性能调整
  20. 债券基础知识和可转债剖析

热门文章

  1. 如何使用cmd进入MySQL
  2. Bios工程师手边事—重启
  3. 小森动画回忆录(二)-设计角色(迪迦)
  4. Vue 打包部署到服务器后,非主页刷新后出现404问题解决
  5. 代表委员聚焦网络安全:信息立法迫在眉睫
  6. 基于DWM1000的STM32F103C8T6的三维室内定位(一)
  7. Centos7部署tomcat 验证码模糊解决
  8. https通信加密过程
  9. matlab一阶动态电路分析,MATLAB在一阶动态电路特性分析的应用
  10. 环签名说的比较的好的一篇文章