[求助] iar中汇编怎么用?

sxbug   2014-9-8 17:26 楼主
void delay(void)       
{
  asm("LOOPS:        MOV          R5,#20");
  asm("LOOP1:         mov R6,#40");
  asm("LOOP2:  MOV R7,#248");
  asm("djnz R7,$");
  asm("djnz R6, LOOP2 ");
  asm("djnz R5, LOOP1 ");
  asm("QuitOut: RET");
}
这样写后,loop1,loop2等都报错
Error[Og005]: Unknown symbol in inline assembly: "LOOP2" E:\Source_code\IAR\gs\gs_main.c 60
Error[Og006]: Syntax error in inline assembly: "Error[54]: Expression can not be forward" E:\Source_code\IAR\gs\gs_main.c 60

这要怎么处理?
asm 和__asm是一样的吗?

回复评论 (6)

C中内嵌汇编有很多限制,我觉得你还是直接用汇编写个函数,然后用C调用吧。
点赞  2014-9-8 18:44
直接写一个 文本的 asm? 能详细点不?
谢谢
点赞  2014-9-8 20:36
我写了一个 asm文件,内容是:
PUBLIC delay
MODULE delay
RSEG CODE
delay:

  LOOPS:  MOV          R5,#20
  LOOP1:
  mov R6,#40
  LOOP2:
  MOV R7,#248
  djnz R7,$
  djnz R6, LOOP2
  djnz R5, LOOP1
  ret
  ENDMOD
END
点赞  2014-9-8 21:26
但是 报错,好像是写法不对
点赞  2014-9-8 21:26
引用: sxbug 发表于 2014-9-8 21:26
但是 报错,好像是写法不对

可以参考IAR的汇编示例写,具体细节请参考IAR的汇编参考/用户手册。
点赞  2014-9-8 22:18
  NAME my_delay
  PUBLIC delay
  RSEG NEAR_CODE:CODE:NOROOT(0)
delay:
  
  LOOPS:  MOV R5,#20
  LOOP1:
  mov R6,#40
  LOOP2:
  MOV R7,#248
  djnz R7,$
  djnz R6, LOOP2
  djnz R5, LOOP1
  ret
  end
注意 前面的空格是tab,单独存成一个asm文件。能用了,但还是提示 warning 没有定义全局的delay.
点赞  2014-9-9 10:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复