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是一样的吗?
C中内嵌汇编有很多限制,我觉得你还是直接用汇编写个函数,然后用C调用吧。
我写了一个 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
可以参考IAR的汇编示例写,具体细节请参考IAR的汇编参考/用户手册。
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.