Microchip C内联asm不为内联asm中的即时生成前缀
我正在尝试在asm中实现我自己的Microchip C内联asm不为内联asm中的即时生成前缀,c,assembly,inline-assembly,microchip,dspic,C,Assembly,Inline Assembly,Microchip,Dspic,我正在尝试在asm中实现我自己的memcpy功能。CPU为dsPIC33F,编译芯片为C30 asm("repeat %2 \n mov.b [%1++], [%0++]" : : "r"(dst), "r"(src), "ri"(len)); 当len是变量时,这可以正常工作:编译器选择一个寄存器,没有问题。 但当len是编译时常量(例如10)时,汇编程序会说:错误:指定的操作数无效('repeat 10
memcpy
功能。CPU为dsPIC33F,编译芯片为C30
asm("repeat %2 \n mov.b [%1++], [%0++]"
: : "r"(dst), "r"(src), "ri"(len));
当len
是变量时,这可以正常工作:编译器选择一个寄存器,没有问题。
但当len
是编译时常量(例如10)时,汇编程序会说:错误:指定的操作数无效('repeat 10')。
这是因为微芯片汇编程序需要#
在立即执行之前:重复10
在源代码中使用
#%2
是不可行的,因为如果编译器选择一个寄存器,这将导致中断
这是一个微芯片编译器错误吗
是否有任何方法可以编写内联asm,使其正确扩展到repeat reg
或repeat#imm
对于“ri”
或“g”
?您应该能够使用“#”,如何创建内联语句?您能显示一些代码吗?如果我使用
(重复#%2
),则在len
变为变量之前不会出现错误。如果len
变为变量(例如存储在w10中),我得到错误:指定的操作数无效('repeat#w10')
。完整代码只是定义memcpy(dst、src、len)asm(…)您是否尝试了“ri”
和“g”
?是的,两者都有。我还尝试了“rI”
,“rn”
如何包装asm?由于它是编译时内置的,“if”不应该生成任何运行时代码。然后你可以有一个带#的asm语句和一个不带。还有,你不应该有一个记忆障碍器吗?这段代码不会改变src/dst吗?根据(请参见警告),asm的输入参数(第二个冒号后的参数)是“只读”的,并且在退出asm语句时必须具有与进入时相同的值。