搜索
bottom↓
回复: 8

IAR ARM C文件中嵌入汇编,编译报错,IAR不支持LDR伪指令??

[复制链接]

出0入0汤圆

发表于 2015-7-27 16:30:03 | 显示全部楼层 |阅读模式
本帖最后由 xtaens 于 2015-7-27 16:33 编辑

如题,把一个lpc1778 IAP程序从keil上移植到了IAR上,编译报错,说语法不对。

但是相同的代码在keil中编译没有报错,但是看代码附近有×,,,程序也可以下载,没有测试对与否


我在IAR中把报错的=号后就不报错了,难道IAR 不支持伪指令?

下面是报错信息和源程序,这种情况怎么办?如何修改一下不报错。

  1. Error[Og006]: Syntax error in inline assembly: "Error[401]: Operand syntax error"


  2. void ExceuteApplication(void)
  3. {
  4.   /* Load main stack pointer with application stack pointer initial value,
  5.      stored at first location of application area */
  6.   asm("ldr r0, = 0x1000");
  7.   asm("ldr r0, [r0]");
  8.   asm("mov sp, r0");

  9.   /* Load program counter with application reset vector address, located at
  10.      second word of application area. */
  11.   asm("ldr r0, = 0x1004");
  12.   asm("ldr r0, [r0]");
  13.   asm("BX  r0");
  14. }
复制代码






下面是在keil上编译的信息:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-7-27 16:51:47 | 显示全部楼层
不同编译器嵌入汇编的语法不一样

出0入0汤圆

发表于 2015-7-27 17:43:38 | 显示全部楼层
IAR的话最好将这个函数放在一个asm文件里。

出0入0汤圆

发表于 2015-7-27 18:21:40 | 显示全部楼层
keil的那个叉只是编辑器不认识这个单词而已,都不算报错,IAR本身肯定是支持内嵌汇编,看手册吧~

出0入24汤圆

发表于 2015-7-27 16:30:04 | 显示全部楼层
  1.    SECTION .text:CODE(2)

  2.    NAME   ExceuteApplication  

  3.    PUBLIC ExceuteApplication   
  4.   
  5. ExceuteApplication

  6.   LDR R0, =0x1000

  7.   LDR R0, [R0]

  8.   MOV SP, R0


  9.   LDR R0, = 0x1004

  10.   LDR R0, [R0]

  11.   BX  R0
  12.    
  13.   END
复制代码


写成一个汇编函数,单独放到一个asm文件里面,调用的时候用 extern 声明一下就好
MDK的也这样子做,另作一个文件,汇编语言不通用, 这样子可以做到 C代码部分不需要修改,移植性更好
就像启动文件一样,汇编写的,IAR和MDK的启动文件不一样,但是对于用户而言,完全没有影响

出0入0汤圆

发表于 2015-7-27 19:26:11 | 显示全部楼层
肯定支持,但是你要看IAR的手册

出0入0汤圆

 楼主| 发表于 2015-7-27 22:01:24 | 显示全部楼层
azeng 发表于 2015-7-27 17:43
IAR的话最好将这个函数放在一个asm文件里。

可以放,就是单一个函数做一个文件不太好管理

出0入0汤圆

 楼主| 发表于 2015-7-27 22:03:23 | 显示全部楼层
SNOOKER 发表于 2015-7-27 19:26
肯定支持,但是你要看IAR的手册

手册已看,没找到相关说明

只有伪指令那里报错了,其他语句倒是没有报错

出0入0汤圆

 楼主| 发表于 2015-7-28 09:01:35 | 显示全部楼层
20061002838 发表于 2015-7-27 18:22
写成一个汇编函数,单独放到一个asm文件里面,调用的时候用 extern 声明一下就好
MDK的也这样子做,另作 ...

已经改为了下面的语句,测试暂时没发现问题。

  1. void Application(uint32_t address)
  2. {
  3.   asm("ldr SP, [R0]");    //Load new stack pointer address
  4.   asm("ldr PC, [R0, #4]");//Load new program counter address
  5. }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-14 17:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表